Google Maps v2 Marker zOrdering - 设置为顶部

Aid*_*Fry 23 android z-order marker google-maps-android-api-2

我知道在这个主题上有一些线索,但我还没有找到一个足够好的解决方案.

我需要在所有其他标记的顶部放置一个标记.我该怎么做呢?

我尝试在所有其他标记之前和之后添加此标记,但是顺序似乎是从地图视图的底部(前面)到顶部(后面).这是不可接受的,因为我想以所有标记前面的标记为中心.

我知道Polygons可以zorrdered但我更喜欢一个漂亮的图形!

实际上你不能在标记上订购多边形!

"相对于其他叠加层绘制此多边形的顺序,包括Polylines,GroundOverlays和TileOverlays,但不包括Markers.具有较大z-index的叠加层将绘制在具有较小z-indices的叠加层上.相同的z-index值是任意的.默认值为0." - https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polygon

有没有人对此有任何想法?

Bas*_*ier 41

如果你实际显示InfoWindow,Aiden Fry的答案是有效的.如果不这样做,标记将不会出现在前面.无论如何,这是一个让它走到前面的黑客:

创建一个显示0dp信息窗口的自定义InfoWindowAdapter:

public class MapWindowAdapter implements GoogleMap.InfoWindowAdapter {
    private Context context = null;

    public MapWindowAdapter(Context context) {
        this.context = context;
    }

    // Hack to prevent info window from displaying: use a 0dp/0dp frame
    @Override
    public View getInfoWindow(Marker marker) {
        View v = ((Activity) context).getLayoutInflater().inflate(R.layout.no_info_window, null);
        return v;
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是布局的代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="0dp"
              android:layout_height="0dp">
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

设置地图时,设置适配器和自定义InfoWindowAdapter和OnMarkerClickListener(使用showInfoWindow并返回true,如AIden Fry建议的那样):

mMap.setInfoWindowAdapter(new MapWindowAdapter(this));

//Call showInfoWindow to put marker on top of others.
myMarker.showInfoWindow();
Run Code Online (Sandbox Code Playgroud)

这不是很漂亮,但我没有找到任何其他方法来处理z-indexing而不使用信息窗口.

  • 同意@ToreRudberg,setOnMarkerClickListener对我来说也不是必需的*但是我必须在no_info_window.xml中向我的LinearLayout添加TextView并将TextView的文本设置为单个空格.没有TextView或带有空字符串文本的TextView,似乎地图足够聪明,知道InfoWindow中没有任何内容,因此没有将标记置于顶部.我将此解决方案与MaciejGórski的解决方案[http://stackoverflow.com/questions/14715414/android-google-maps-v2-permanent-marker-infowindow/16506747#16506747](在此帖子中)相结合,以使一个标记始终位于顶部. (11认同)
  • 这有效.但是,不需要实现setOnMarkerClickListener.只需如上所述设置InfoWindowAdapter并调用showInfoWindow将标记设置在顶部. (4认同)
  • 这不适合我.可能是什么原因?根本不工作. (2认同)
  • 只有在布局中添加TextView后,此解决方案才适用于我.由于某种原因,当布局为空时它不起作用 (2认同)
  • 您好,我能够从帖子中使用此InfoWindowAdapter解决问题,但布局无效.所以我在这篇文章中使用了布局:http://stackoverflow.com/questions/26461175/bring-google-map-markers-to-front-by-changing-z-index-in-android (2认同)

pas*_*ssy 18

这是在Google Play Services 9.2中添加的(2016年6月27日)

new MarkerOptions.zIndex()设置标记相对于地图上其他标记的堆栈顺序.阅读有关标记z索引和z-index对点击事件的影响的更多信息.(问题4688)


Aid*_*Fry 1

虽然不是完美的解决方案!我已经弄清楚如何通过使用 onMarkerClick 事件在所有其他标记上显示选定的(点击的)标记。返回 TRUE 将消耗此事件,因此我们必须执行 showInfoWindow 并缩放到中心

    @Override
    public boolean onMarkerClick(Marker marker) {

       //Manually open the window
       marker.showInfoWindow();

       //Animate to center
       sMapFrag_v2.getMap().animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition());

       //Consume the method
       return true;
    }
Run Code Online (Sandbox Code Playgroud)