2015-08-13 3 views
2

Я хочу разместить пользовательский макет над маркером. До сих пор я получил это:Всплывающие окна или макет над маркером Android

default_marker_info_window.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <ViewFlipper 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/markerInfoContainer" 
     android:background="@android:color/holo_red_dark" 
     android:maxWidth="250dp"> 
    </ViewFlipper>  

    <ImageView 
     android:layout_width="20dp" 
     android:layout_height="15dp" 
     android:background="@drawable/ic_down_arrow" 
     android:layout_gravity="center|top"/> 

</LinearLayout> 

default_marker_info_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/tvTitulo" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textStyle="bold" 
      android:gravity="center"/> 

     <TextView 
      android:id="@+id/tvCuerpo" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="press me 1" 
      android:id="@+id/button"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="press me 2" 
      android:id="@+id/button2"/> 

    </LinearLayout> 

</LinearLayout> 

MapActivity.java

public class MapActivity extends Activity implements GoogleMap.OnMapLongClickListener{ 

    protected GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     setUpMapIfNeeded(); 
     mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
      @Override 
      public boolean onMarkerClick(Marker marker) { 

       View mainView = getLayoutInflater().inflate(R.layout.default_marker_info_window, null); 
       ViewFlipper markerInfoContainer = (ViewFlipper)mainView.findViewById(R.id.markerInfoContainer); 
       View viewContainer = getLayoutInflater().inflate(R.layout.default_marker_info_layout, null); 
       TextView tvTitulo = (TextView) viewContainer.findViewById(R.id.tvTitulo); 
       TextView tvCuerpo = (TextView) viewContainer.findViewById(R.id.tvCuerpo); 
       tvTitulo.setText(marker.getTitle()); 
       tvCuerpo.setVisibility(View.GONE); 

       markerInfoContainer.addView(viewContainer); 

       PopupWindow popupWindow = new PopupWindow(mainView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
       popupWindow.showAtLocation(findViewById(R.id.map), Gravity.CENTER_HORIZONTAL, 0, 0); //map is the fragment on the activity layout where I put the map 

       return true; 
      } 
     }); 
     ... 
    } 
... 
} 

Но у меня есть несколько проблем.

Задача 1: всплывающее окно отображает (3D) маркер (выделяет его). Я хочу, чтобы расположить его над ним (2D), например:

Position of popup I want

Может быть от помощи x и y положения маркеров и использовать их на popupWindow.showAtLocation. Но если у вас есть другие решения, я буду их слушать.

Задача 2: Когда я скольжу по карте, расположение сохраняется в центре экрана, но я хочу сохранить ее над маркером.

Problem while sliding on map

Примечание: Я не могу использовать mMap.setInfoWindowAdapter, потому что я потеряю клик слушателей кнопки.

ответ

2

Определить некоторые переменные для сохранения последних использованных маркеров и popupView

private Marker mMarker; 
private PopupWindow mPopupWindow; 
private int mWidth; 
private int mHeight; 

В нашем onMarkerClick: метод

@Override 
public boolean onMarkerClick(Marker marker) { 
    if (mPopupWindow != null) { 
     mPopupWindow.dismiss(); 
    } 
    View popupView;// inflate our view here 
    PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

    Display display = getActivity().getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    popupView.measure(size.x, size.y); 

    mWidth = popupView.getMeasuredWidth(); 
    mHeight = mPopupView.getMeasuredHeight(); 
    mMarker = marker; 
    mPopupWindow = popupWindow; 

    updatePopup(); 

    return true; 
} 

updatePopup:

private void updatePopup() { 
    if (mMarker != null && mPopupWindow != null) { 
     // marker is visible 
     if (mMap.getProjection().getVisibleRegion().latLngBounds.contains(mMarker.getPosition())) { 
      if (!mPopupWindow.isShowing()) { 
       mPopupWindow.showAtLocation(getView(), Gravity.NO_GRAVITY, 0, 0); 
      } 
      Point p = mMap.getProjection().toScreenLocation(mMarker.getPosition()); 
      mPopupWindow.update(p.x - mPopupWidth/2, p.y - mPopupHeight + 100, -1, -1); 
     } else { // marker outside screen 
      mPopupWindow.dismiss(); 
     } 
    } 
} 

Нам нужно CameraChangeListener:

mMap.setOnCameraChangeListener(this); 

@Override 
public void onCameraChange(CameraPosition cameraPosition) { 
    ... 
    updatePopup(); 
} 
+0

Это действительно хороший ответ. Единственная проблема заключается в том, что при перемещении карты всплывающее окно перемещается немного странно. Но я могу подумать, что нет способа сделать это лучше. Я собираюсь подождать немного, если кто-то опубликует лучший ответ, иначе я поставлю это как Accepted :) Большое спасибо! –

+0

Упс, еще одна проблема: у меня есть несколько типов макетов для всплывающего окна. Они имеют разные размеры. Когда я пытаюсь использовать более крупный макет, я возвращаюсь к проблеме 1, описанной в вопросе (всплывающее окно появляется над маркером, скрывая его). –

+2

добавил код, чтобы решить проблему сокрытия вашего ответа –

Смежные вопросы