谷歌地图v2标记层级 - 设置为顶部

24

我知道这个问题已经有一些相关的帖子,但我还没有找到一个足够好的解决方案。

我需要在所有其他标记之上放置一个标记。我该如何做?

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

我知道多边形可以进行 zOrder 排序,但我更喜欢一个漂亮的样式图形!

事实上,你不能将一个多边形置于标记之上!

"绘制此多边形与其他覆盖物(包括折线、地面覆盖物和瓦片覆盖物,但不包括标记)的顺序,具有较大 z-index 值的覆盖物会绘制在具有较小 z-index 值的覆盖物之上。具有相同 z-index 值的覆盖物的顺序是任意的。默认值为 0。" - https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polygon

有人有什么想法吗?

3个回答

43

Aiden Fry的答案只适用于当你确实显示一个InfoWindow的情况。如果你没有显示,标记将不会到最前面。这里是一种hack的方式使其仍然出现在最前面:

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

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的方法而不使用信息窗口。


4
这个方法可行,不需要实现setOnMarkerClickListener。只需按照上述说明设置InfoWindowAdapter并调用showInfoWindow将标记设置在顶部即可。 - Tore Rudberg
2
这对我不起作用。可能的原因是什么?完全没有反应。 - tasomaniac
12
同意@ToreRudberg的观点,对我来说setOnMarkerClickListener也不是必需的,但我必须在no_info_window.xml中的LinearLayout中添加一个TextView,将TextView的文本设置为一个空格。如果没有TextView,或者TextView中的文本为空字符串,则似乎Maps聪明到知道InfoWindow中没有任何内容,因此不会将标记放在顶部。我将这个解决方案与MaciejGórski的解决方案[http://stackoverflow.com/questions/14715414/android-google-maps-v2-permanent-marker-infowindow/16506747#16506747](在这篇文章中)结合起来,以保持一个标记始终在顶部。 - Eric Barr
2
这个解决方案对我来说只有在布局中添加了一个TextView后才起作用。由于某种原因,当布局为空时它不起作用。 - Assaf S.
2
你好,我能够使用这篇帖子中的InfoWindowAdapter解决问题,但是布局不起作用。所以我使用了这篇帖子中的布局:https://dev59.com/s4Tba4cB1Zd3GeqP52tH - Radoslav Yordanov
显示剩余3条评论

18

很遗憾,Xamarin目前还不支持这个属性!虽然与所问的问题无关,但值得注意... - Justin
我来这里是为了一个 Xamarin 的解决方案,但话说回来 @Justin ,我没有看到 OP 的问题特别涉及到 Xamarin。我期待 Xamarin 将其纳入他们的 API 中。 - Chase Florell

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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接