为 Android 显示自定义信息窗口 Android 地图实用程序库

Posted

技术标签:

【中文标题】为 Android 显示自定义信息窗口 Android 地图实用程序库【英文标题】:Showing custom InfoWindow for Android Maps Utility Library for Android 【发布时间】:2014-03-20 01:30:55 【问题描述】:

我正在使用库Google Maps Utility for android,它允许在他的地图中创建聚类,我需要显示一个自定义InfoWindow,但我找不到任何方法来做到这一点。 为了显示信息窗口,我有以下类,在方法@​​987654323@ 中我可以访问标记的信息:

class MyClusterRenderer extends DefaultClusterRenderer<MarkerItem> 

    public MyClusterRenderer(Context context, GoogleMap map,
            ClusterManager<MarkerItem> clusterManager) 
        super(context, map, clusterManager);
    

    @Override
    protected void onBeforeClusterItemRendered(MarkerItem item,
            MarkerOptions markerOptions) 
        super.onBeforeClusterItemRendered(item, markerOptions);
        markerOptions.title(String.valueOf(item.getMarkerId()));
    

    @Override
    protected void onClusterItemRendered(MarkerItem clusterItem,
            Marker marker) 
        super.onClusterItemRendered(clusterItem, marker);
    

是否有人使用过该库并知道如何显示自定义 InfoWindow,例如它在 Google 地图中的使用方式?喜欢:

getMap().setInfoWindowAdapter(new InfoWindowAdapter() 

    @Override
    public View getInfoWindow(Marker arg0) 
        return null;
    

    @Override
    public View getInfoContents(Marker arg0) 
        return null;
    
);

【问题讨论】:

【参考方案1】:

是的,这可以做到。 ClusterManager 维护两个MarkerManager.Collections

一个用于聚类标记,并且 一个用于单个项目标记

您可以为每种类型的标记单独设置自定义InfoWindowAdapter


实施

首先,安装 ClusterManager 的 MarkerManager 作为地图的 InfoWindowAdapter:

ClusterManager<MarkerItem> clusterMgr = new ClusterManager<MarkerItem>(context, map);
map.setInfoWindowAdapter(clusterMgr.getMarkerManager());

接下来,安装您的自定义 InfoWindowAdapter 作为一个或两个标记集合的适配器:

clusterMgr.getClusterMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForClusters());
clusterMgr.getMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForItems());

最后一步是将您在自定义 InfoWindowAdapter 的回调中收到的原始 Marker 对象映射到您首先添加到地图中的 ClusterItem 对象。这可以使用 onClusterClick 和 onClusterItemClick 侦听器来实现,如下所示:

map.setOnMarkerClickListener(clusterMgr);
clusterMgr.setOnClusterClickListener(new OnClusterClickListener<MarkerItem>() 
    @Override
    public boolean onClusterClick(Cluster<MarkerItem> cluster) 
        clickedCluster = cluster; // remember for use later in the Adapter
        return false;
    
);
clusterMgr.setOnClusterItemClickListener(new OnClusterItemClickListener<MarkerItem>() 
    @Override
    public boolean onClusterItemClick(MarkerItem item) 
        clickedClusterItem = item;
        return false;
    
);

现在您拥有在各自的适配器中组装自定义 InfoWindow 内容所需的一切!例如:

class MyCustomAdapterForClusters implements InfoWindowAdapter 
    @Override
    public View getInfoContents(Marker marker) 
        if (clickedCluster != null) 
            for (MarkerItem item : clickedCluster.getItems()) 
                // Extract data from each item in the cluster as needed
            
        
        // build your custom view
        // ...
        return view;
    

【讨论】:

干得好!我只是想警告人们,我没有注意到一段代码:map.setOnMarkerClickListener(clusterMgr); 并且从未命中回调。显然需要按照源代码中的注释进行操作:/*Sets a callback that's invoked when an individual ClusterItem is tapped. Note: For thislistener to function, the ClusterManager must be added as a click listener to the map. */ public void setOnClusterItemClickListener(OnClusterItemClickListener&lt;T&gt; listener) mOnClusterItemClickListener = listener; mRenderer.setOnClusterItemClickListener(listener); 我不太清楚你的意思?在设置 onCluster 和 onClusterItem 点击监听器之前,我确实在上面的示例代码中调用了 map.setOnMarkerClickListener(clusterMgr)。 一切正常,只是我的错误,所以我想强调这一点 一直在类似的问题上苦苦挣扎,直到偶然发现您的评论。它让我大开眼界:) 谢谢 看起来现在有更好的方法可以做到这一点,从 0.3.2 开始,github.com/googlemaps/android-maps-utils/issues/48【参考方案2】:

所以基本上你的课程是这样开始的:

private class MarkerItemClusterRenderer extends
        DefaultClusterRenderer<MarkerItem> 
    public MarkerItemClusterRenderer(Context context, GoogleMap map,
            ClusterManager<MarkerItem> clusterManager) 
    ...

因此,在GoogleMap 类型的参数map 中,您必须指定setInfoWindowAdapter

【讨论】:

这是对第一个答案的阐述还是?

以上是关于为 Android 显示自定义信息窗口 Android 地图实用程序库的主要内容,如果未能解决你的问题,请参考以下文章

无法获得Android系统中googlemap V2上标记的自定义信息窗口的点击事件。

将数据从 Firebase 传输到自定义信息窗口

谷歌地图的自定义信息窗口

javascript 自定义信息窗口。

html 自定义信息窗口示例

带有两个可点击按钮或 ImageView 的 Google 地图 v2 自定义信息窗口