我正在使用来自android-maps-utils的聚类对 Android 中的 Google 地图上的标记进行聚类。我想在地图处于最大缩放级别时禁用聚类(即,如果地图处于最大缩放级别,则始终呈现单个 ClusterItems,否则聚类正常)。
通过在扩展 DefaultClusterRenderer 的自定义类中对 shouldRenderAsCluster() 中的缩放级别进行测试,我几乎可以让它工作。但是,我的解决方案比实际缩放级别落后了一步。例如,如果地图的最大缩放级别为 21 级,并且用户从 20 级放大到 21 级,则 shouldRenderAsCluster 中的检查将获得当前缩放级别 20。如果用户随后缩小到 20 级,检查将获得 21 级。 ClusterItems 被渲染为我想要的单个项目,但是一个缩放动作为时已晚。
我从 DefaultClusterRenderer 中设置的变量 mZoom 中获得了“当前缩放”(显然不是当前的)。
这是代码:
public class UserClusterRenderer extends PosMapDefaultClusterRenderer<UserClusterItem> {
// ...
@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
return mZoom < mMap.getMaxZoomLevel() && cluster.getSize() > 1;
}
}
变量 mZoom 和 mMap 在 DefaultClusterRenderer 中设置。因为他们在那里有私有访问权限,所以我制作了一个名为 PosMapDefaultClusterRenderer 的 DefaultClusterRenderer 副本。唯一的区别是 mZoom 和 mMap 被声明为 protected,因此它们可以在 UserClusterRenderer 中访问。
为什么 mZoom 落后一个缩放动作?有没有办法获得正在渲染集群的真实缩放级别?
缩放是通过使用来自 cameraPosition 的 cameraUpdate 调用 animateCamera 来完成的。
这也是我在 StackOverflow 上的第一个问题,因此欢迎对标签、格式等进行任何输入。
编辑:Vai 回答后的工作代码:
public class UserClusterRenderer extends DefaultClusterRenderer<UserClusterItem> {
GoogleMap mMapCopy; // Store a ref to the map here from constructor
// ...
@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
float currentZoom = mMapCopy.getCameraPosition().zoom;
float currentMaxZoom = mMapCopy.getMaxZoomLevel();
return currentZoom < currentMaxZoom && cluster.getSize() > 1;
}
}