使用聚类时如何禁用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 true
为setOnClusterItemClickListener
【讨论】:
【参考方案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 更改单击的标记图标?