24

我知道关于这个主题有一些主题,但我还没有找到足够好的解决方案。

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

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

我知道多边形可以是 zOrdered,但我更喜欢样式精美的图形!

事实上,您不能在标记上订购多边形!

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

有人对此有任何想法吗?

4

3 回答 3

43

如果您确实显示了 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;
    }
}

这是布局的代码:

<?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>

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

mMap.setInfoWindowAdapter(new MapWindowAdapter(this));

//Call showInfoWindow to put marker on top of others.
myMarker.showInfoWindow();

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

于 2013-06-19T16:48:53.383 回答
18

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

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

于 2016-06-27T18:21:44.170 回答
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;
    }
于 2013-02-08T13:13:01.737 回答