使用聚类时如何禁用android地图标记单击自动居中?

Posted

技术标签:

【中文标题】使用聚类时如何禁用android地图标记单击自动居中?【英文标题】:How to disable android map marker click auto center when using clustering? 【发布时间】:2015-10-06 20:52:39 【问题描述】:

我知道在点击标记时可以避免将相机居中使用:

mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 
    @Override
    public boolean onMarkerClick(Marker marker) 
        marker.showInfoWindow();
        return true;
    
);

但是,我遇到的问题是现在我想使用集群,当然我想在标记(实际上是项目或集群)被录制时看到信息窗口。但我不知道在这些情况下如何调用类似 showInfoWindow 的东西。 在这段代码中,如果我返回 false,我会看到信息窗口但地图居中。如果我返回 true,则地图不居中但不显示信息窗口:

    mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<HotspotMarker>() 
        @Override
        public boolean onClusterItemClick(HotspotMarker item) 
            Log.e(LOG_TAG, "---OnClusterItemClick");
            return false;
        
    );

    mClusterManager.setOnClusterItemInfoWindowClickListener(new ClusterManager.OnClusterItemInfoWindowClickListener<HotspotMarker>() 
        @Override
        public void onClusterItemInfoWindowClick(HotspotMarker hotspotMarker) 
            Log.e(LOG_TAG, "---onClusterItemInfoWindowClick");
            HotspotDetailActivity.hotspot = hotspotMarker.getHotspot();
            Intent intent = new Intent(getActivity(), HotspotDetailActivity.class);
            startActivity(intent);
        
    );

    mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<HotspotMarker>() 
        @Override
        public boolean onClusterClick(Cluster<HotspotMarker> cluster) 
            Log.e(LOG_TAG, "---OnClusterClickListener");
            return false;
        
    );

    mClusterManager.setOnClusterInfoWindowClickListener(new ClusterManager.OnClusterInfoWindowClickListener<HotspotMarker>() 
        @Override
        public void onClusterInfoWindowClick(Cluster<HotspotMarker> cluster) 
            Log.e(LOG_TAG, "---onClusterInfoWindowClick");
            ArrayList<HotspotMarker> markers = new ArrayList<>(cluster.getItems());
            ClusterListActivity.markers = markers;
            Intent detailHotspot = new Intent(getActivity(), ClusterListActivity.class);
            startActivity(detailHotspot);
        
    );

当我使用聚类并同时显示信息窗口时,您是否知道如何避免使地图居中?提前致谢。

编辑: 使用@skywall 的建议,我发现了使用自定义渲染器的更好方法:

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<HotspotMarker>() 
            @Override
            public boolean onClusterItemClick(HotspotMarker item) 
                Marker marker=mClusteringRenderer.getMarker(item);
                marker.showInfoWindow();
                return true;
            
        );

    mClusterManager.setOnClusterItemInfoWindowClickListener(new ClusterManager.OnClusterItemInfoWindowClickListener<HotspotMarker>() 
        @Override
        public void onClusterItemInfoWindowClick(HotspotMarker hotspotMarker) 
            HotspotDetailActivity.hotspot = hotspotMarker.getHotspot();
            Intent intent = new Intent(getActivity(), HotspotDetailActivity.class);
            startActivity(intent);
        
    );

    mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<HotspotMarker>() 
        @Override
        public boolean onClusterClick(Cluster<HotspotMarker> cluster) 
            Marker marker=mClusteringRenderer.getMarker(cluster);
            marker.showInfoWindow();
            return true;
        
    );

    mClusterManager.setOnClusterInfoWindowClickListener(new ClusterManager.OnClusterInfoWindowClickListener<HotspotMarker>() 
        @Override
        public void onClusterInfoWindowClick(Cluster<HotspotMarker> cluster) 
            ArrayList<HotspotMarker> markers = new ArrayList<>(cluster.getItems());
            ClusterListActivity.markers = markers;
            Intent detailHotspot = new Intent(getActivity(), ClusterListActivity.class);
            startActivity(detailHotspot);
        
    );

【问题讨论】:

不幸的是,这似乎是不可能的。我只是尝试了一些事情,比如将onMarkerClick() 覆盖为mClusterManager,但是没有办法阻止它居中。默认代码为return this.getMarkerManager().onMarkerClick(marker);,如果不这样调用,则点击事件不起作用。 很好的解决方案。我希望,谷歌将集群和集群项目映射到标记,但我没想到它会出现在渲染器中 :-) 谢谢。 我尝试将这些侦听器移到渲染器中(这是可能的),因为您建议的方法可用(在渲染器中查看),但出于一个我不知道的原因,它没用。如果你找到了,请告诉我。谢谢。 【参考方案1】:

return truesetOnClusterItemClickListener

【讨论】:

【参考方案2】:

不要直接通过mGoogleMap.setOnMarkerClickListener()设置GoogleMap.OnMarkerClickListener()的新实例。

相反,将mClusterManager 设置为点击处理程序,如下所示:

mGoogleMap.setOnMarkerClickListener(mClusterManager);

并处理点击:

mClusterManager.setOnClusterItemClickListener();
mClusterManager.setOnClusterClickListener();

信息窗口默认在第一次点击时显示。

编辑:我现在明白了,问题出在哪里。我创造了不是很漂亮的解决方案,但它确实有效。以这种方式修改您的点击监听器:

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyClusterItem>() 
        @Override
        public boolean onClusterItemClick(MyClusterItem item) 
            for (Marker marker : mClusterManager.getMarkerCollection().getMarkers()) 
                if (marker.getPosition().latitude == item.getPosition().latitude && 
                    marker.getPosition().longitude == item.getPosition().longitude) 
                    marker.showInfoWindow();
                
            
            return true;
        
    );

【讨论】:

我想这就是我现在在添加集群后配置我的地图的方式。第二段代码也有这个: mGoogleMap.setOnMarkerClickListener(mClusterManager); mGoogleMap.setOnInfoWindowClickListener(mClusterManager);那么,如何避免居中呢?谢谢。 感谢@skywall,请参阅我添加到问题中的 cmets。【参考方案3】:

我不能禁用,但我可以在下面移动地图(在我的情况下需要,因为屏幕的上半部分被一些抽屉覆盖)。

public View getInfoContents(Marker marker) 
    .....
    bottomBarButton1.postDelayed(new Runnable() 
        @Override
        public void run() 
            final CameraPosition cp=map.getCameraPosition();
            final Point mappoint = map.getProjection().toScreenLocation(new LatLng(cp.target.latitude, cp.target.longitude));
            mappoint.set(mappoint.x, (int) (dispHeight*0.1f));
            map.animateCamera(CameraUpdateFactory.newLatLng(map.getProjection().fromScreenLocation(mappoint)), null);
        
    ,500);
    .....

【讨论】:

以上是关于使用聚类时如何禁用android地图标记单击自动居中?的主要内容,如果未能解决你的问题,请参考以下文章

单击标记时,新按钮会自动出现在谷歌地图(Android)上?如何删除?

如何使用 android-maps-utils 更改单击的标记图标?

Android 谷歌地图标记禁用导航选项

使用 Googles android-maps-utils 在最大缩放级别禁用集群

如何在android地图中设置地图聚类的半径

如何在 Xamarin Forms 中实现标记聚类(谷歌地图)