我已经在我的应用程序的 iOS 版本上实现了 Google Maps Clustering,它运行良好。我现在正在尝试使用 android maps 实用程序库在 Android 版本上实现 Clustering,当我放大或缩小时它不是 Declustering/Clustering。
这是集群项目类:
public class MyClusterItem implements ClusterItem {
private final LatLng position;
private final BitmapDescriptor icon;
private final String tag;
public MyClusterItem(double lat, double lng, BitmapDescriptor icon, String tag) {
this.position = new LatLng(lat, lng);
this.icon = icon;
this.tag = tag;
}
@Override
public LatLng getPosition() {
return position;
}
@Override
public String getTitle() {
return null;
}
@Override
public String getSnippet() {
return null;
}
public BitmapDescriptor getIcon() {
return icon;
}
public String getTag() {
return tag;
}
}
以下是集群管理器的实现方式:
public void onMapReady(GoogleMap googleMap) {
//Log.i ( TAG, "Google Map Ready Callback" );
mMap = googleMap;
//mMap.setOnMarkerClickListener(this);
// Point the map's listeners at the listeners implemented by the cluster
// manager.
mMap.setOnCameraIdleListener(mClusterManager);
mMap.getUiSettings().setMapToolbarEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
mMap.getUiSettings().setRotateGesturesEnabled(false);
if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && isLocationEnabled) {
mMap.setMyLocationEnabled(true);
}
float mCurrentZoom = googleMap.getCameraPosition().zoom;
// Initialize the manager with the context and the map.
// (Activity extends context, so we can pass 'this' in the constructor.)
mClusterManager = new ClusterManager<MyClusterItem>(this, mMap);
mClusterManager.setOnClusterItemClickListener(mClusterItemClickListener);
mMap.setOnMarkerClickListener(mClusterManager);
mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyClusterItem>() {
@Override
public boolean onClusterClick(final Cluster<MyClusterItem> cluster) {
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
cluster.getPosition(), (float) Math.floor(mMap
.getCameraPosition().zoom + 1)), 300,
null);
return true;
}
});
}
集群项是从 Firebase 数据库中添加的,如下所示:
markerRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
try {
tableCount = tableCount+1;
markerKey = dataSnapshot.getKey();
markerData = dataSnapshot.getValue(Markers.class);
MyClusterItem markerItem = new PicNickClusterItem(markerData.y, markerData.x, BitmapDescriptorFactory.fromResource(R.drawable.verified), markerKey);
mClusterItemMap.put(markerKey, markerItem);
mClusterManager.addItem(markerItem);
if(tableCount >= numTables) {
//cluster markers
mClusterManager.cluster();
}
} catch (Error error) {
noFirebaseAccessAlert();
}
}
}
初始地图截图:
缩小时的屏幕截图:
放大时的屏幕截图:
缩小/缩小时集群项目没有被集群/去集群并且没有动画。当我缩小时,我希望集群项目移动到集群中,并且当我放大集群项目以与集群分离时,就像它们在应用程序的 iOS 版本中所做的那样。此外,当我点击集群标记时,地图会放大,但集群不会扩展到集群项目。没有一个集群项目具有相同的 lat/lng 并且相隔很远。
在 iOS 版本中,我能够设置算法(非基于分层距离)和几个用于聚类的“桶”(并为每个桶指定自定义图标)。我需要两个版本的外观和响应相同,以便用户在 iOS 和 Android 设备上拥有相同的体验。