【问题标题】:Android Custom InfoWindow using marker clusters使用标记集群的 Android 自定义信息窗口
【发布时间】:2014-11-30 20:54:58
【问题描述】:

我正在使用 google maps api 对标记进行聚类。因为我想要一个自定义图标作为标记,所以我创建了一个自定义渲染器(扩展 DefaultClusterRenderer)。在onBeforeClusterItemRendered 我正在设置所需的图标。

问题是我现在想创建一个自定义infowindow。如果我这样做:

googleMap.setInfoWindowAdapter(new InfoWindowAdapter() {

        // Use default InfoWindow frame
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }

        // Defines the contents of the InfoWindow
        @Override
        public View getInfoContents(Marker arg0) {



        }
    });

getInfoContents 我可以自定义信息窗口。问题是传递的参数是Marker 类型。因为我使用的是聚类,所以我使用了一个自定义标记 (MyMarker) 作为其中的信息。 我不能将Marker 转换为MyMarker,也不能将参数更改为MyMarker。我不想这样做来提取信息。

我怎样才能保持集群(在这里我可以访问MyMarker 信息)但创建自定义信息窗口?

public MarkerRenderer() {
        super(getActivity(), mGoogleMap, mClusterManager);         

    }



    @Override
    protected void onBeforeClusterItemRendered(MyMarker myMarker, MarkerOptions markerOptions) {
        markerOptions.icon(BitmapDescriptorFactory.fromResource(myMarker.getMarkerImage())).title(
                "This is my custom marker with the default infoWindo");
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<MyMarker> cluster, MarkerOptions markerOptions) {
        super.onBeforeClusterRendered(cluster, markerOptions);
        markerOptions.title("cluster size " + cluster.getSize());

    }

【问题讨论】:

    标签: android google-maps


    【解决方案1】:

    This answer 建议在您的点击侦听器中存储对集群或标记的引用。

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

    然后您可以在适配器中使用该引用。

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

    示例代码引用了 InfoWindowAdapter,但它应该也适用于 MarkerRenderer;您可以将自定义标记作为参数传递给构造函数。

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2021-12-15
      • 2014-02-18
      • 2013-08-15
      • 1970-01-01
      • 2016-07-09
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多