使用聚类时如何禁用 android 地图标记点击自动居中?
How to disable android map marker click auto center when using clustering?
我知道我可以使用以下方法避免在点击标记时将相机居中:
mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker.showInfoWindow();
return true;
}
});
但是,我遇到的问题是现在我想使用聚类,当然我想在标记(实际上是项目或集群)被录音时看到信息window。但我不知道在这些情况下如何调用 showInfoWindow 之类的东西。
在此代码中,如果我 return 为假,我会看到信息 window 但地图居中。如果我 return 为真,则地图未居中但信息 window 未显示:
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);
}
});
您是否知道如何在使用聚类时避免将地图居中并同时显示信息 window?提前致谢。
编辑:
使用@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);
}
});
不要直接通过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;
}
});
我不能禁用,但我可以在下面移动地图(在我的情况下需要,因为屏幕的上半部分被一些抽屉遮住了)。
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);
.....
}
return true
对于 setOnClusterItemClickListener
我知道我可以使用以下方法避免在点击标记时将相机居中:
mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker.showInfoWindow();
return true;
}
});
但是,我遇到的问题是现在我想使用聚类,当然我想在标记(实际上是项目或集群)被录音时看到信息window。但我不知道在这些情况下如何调用 showInfoWindow 之类的东西。 在此代码中,如果我 return 为假,我会看到信息 window 但地图居中。如果我 return 为真,则地图未居中但信息 window 未显示:
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);
}
});
您是否知道如何在使用聚类时避免将地图居中并同时显示信息 window?提前致谢。
编辑: 使用@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);
}
});
不要直接通过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;
}
});
我不能禁用,但我可以在下面移动地图(在我的情况下需要,因为屏幕的上半部分被一些抽屉遮住了)。
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);
.....
}
return true
对于 setOnClusterItemClickListener