[英]How to disable android map marker click auto center when using clustering?
I know I can avoid centering the camera when tapping a marker using: 我知道使用以下方法点击标记时可以避免使相机居中:
mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker.showInfoWindow();
return true;
}
});
However, the problem I have is that now I want to use the clustering, and of course I want to see the info window when marker (actually, item or cluster) is taped. 但是,我遇到的问题是现在我想使用群集,当然我想在标记(实际上是项目或群集)的时候看到信息窗口。 But I have no idea about how to call something like showInfoWindow in those cases. 但我不知道在这些情况下如何调用类似showInfoWindow的东西。 In this code, if I return false, I see the info window but map is centered. 在这段代码中,如果我返回false,我会看到信息窗口,但是map是居中的。 If I return true, map is not centered but info window is not shown: 如果我返回true,则map不居中,但不显示info窗口:
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);
}
});
Do you have any idea about how can I avoid centering the map when I use clustering and at the same time the info window is shown? 您是否知道在使用群集时如何避免使地图居中,同时显示信息窗口? Thanks in advance. 提前致谢。
EDIT: Using @skywall suggestion, I found even a better way using the custom renderer: 编辑:使用@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);
}
});
对setOnClusterItemClickListener
return true
Do not set new instance of GoogleMap.OnMarkerClickListener()
directly through mGoogleMap.setOnMarkerClickListener()
. 不要直接通过mGoogleMap.setOnMarkerClickListener()
设置GoogleMap.OnMarkerClickListener()
新实例。
Instead, set mClusterManager
as click handler like this: 相反,将mClusterManager
设置为单击处理程序,如下所示:
mGoogleMap.setOnMarkerClickListener(mClusterManager);
and handle clicks in: 并处理点击次数:
mClusterManager.setOnClusterItemClickListener();
mClusterManager.setOnClusterClickListener();
InfoWindow is by default shown on first tap. 默认情况下,InfoWindow会在第一次点击时显示。
EDIT : I now understand, where the problem is. 编辑 :我现在明白,问题出在哪里。 I've created not really beautiful solution, but it works. 我创造的并不是很漂亮的解决方案,但它确实有效。 Modify your click listeners this way: 以这种方式修改您的点击监听器:
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;
}
});
I can not disable, but I can move a map below (it need in my case, because upper half of screen covered by some drawers). 我无法禁用,但我可以移动下面的地图(在我的情况下需要,因为有些抽屉覆盖了屏幕的上半部分)。
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);
.....
} }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.