android - 为 Android 显示自定义信息窗口 Android map 实用程序库

标签 android google-maps google-maps-android-api-2 markerclusterer

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

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 map 中的使用方式?喜欢:

getMap().setInfoWindowAdapter(new InfoWindowAdapter() {

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

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

最佳答案

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

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

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


实现

首先,安装 ClusterManager 的 MarkerManager 作为 map 的 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 对象映射到您添加到 map 中的 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;
    }
}

关于android - 为 Android 显示自定义信息窗口 Android map 实用程序库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21885225/

相关文章:

android - 手动添加 Firefox for android 插件

android - SQL 数据库中未添加数据

android - PagerAdapter 在第一次转换时速度慢

ios - 选择不同位置时如何释放GMSPlacePickerViewController占用的内存?

Android map GPS 异常值

android - 隐藏 Android 语音识别 Activity 以在后台运行?

c# - 从 utr 执行 Google/Bing map 搜索

javascript - 使用 AngularJS 将 Google map (在指令中定义)居中

android - 如何在两点之间沿着现有道路绘制路线?

android - 如何在单击按钮时打开内置的开放式谷歌地图