我正在使用Google Map Android clustering Utitlity使用Google Maps v2播放服务。
我没有得到我期望的行为。正如你在下面的两张图片中看到的那样,当放大时,我可以看到一个20的簇和一个向左的单个标记,但当我缩小直到它们在彼此的顶部时,我看不到它们的簇。 20集群仍然说20而不是21?
这是预期的行为吗?有没有办法可以让群集显示21而不是20 +
答案 0 :(得分:11)
这是DefaultClasterRenderer#onBeforeClusterRendered()
中指定的默认行为:
/**
* Called before the marker for a Cluster is added to the map.
* The default implementation draws a circle with a rough count of the number of items.
*/
protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) {
int bucket = getBucket(cluster);
BitmapDescriptor descriptor = mIcons.get(bucket);
if (descriptor == null) {
mColoredCircleBackground.getPaint().setColor(getColor(bucket));
descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon(getClusterText(bucket)));
mIcons.put(bucket, descriptor);
}
// TODO: consider adding anchor(.5, .5) (Individual markers will overlap more often)
markerOptions.icon(descriptor);
}
请注意,标记的文字是根据bucket
选择的,而不是cluster
快速解决方法是将描述符创建修改为:
descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.
makeIcon(cluster.getSize());
当然,您可以实施自定义ClasterRenderer
并将其提供给ClusterManager
。通过这种方式,您将负责渲染标记,但如果您只想将"20+"
更改为"21"
- 我会采用第一种方法
修改强>
在评论中提出的问题: 如果要增加/减少分组项目的距离阈值 - 您可以修改用于群集的default algorithm。只需使用此常量(在您的情况下应该更小):
public static final int MAX_DISTANCE_AT_ZOOM = 100; // essentially 100 dp.
但正确的解决方法是考虑Marker位图大小而不是常量值。我假设Mr. Broadfood将其作为爱好者的家庭作业:)
private Bounds createBoundsFromSpan(Point p, double span) {
// TODO: Use a span that takes into account the visual size of the marker, not just its
// LatLng.
double halfSpan = span / 2;
return new Bounds(
p.x - halfSpan, p.x + halfSpan,
p.y - halfSpan, p.y + halfSpan);
}
答案 1 :(得分:2)
您可以更改最小群集大小。默认情况下,map-utils库中定义的最小簇大小为4,如下所示。
$ sh compile.sh -a x84
You must define ANDROID_NDK, ANDROID_SDK before starting.
They must point to your NDK and SDK directories.
或者您可以在扩展的DefaultClusterRenderer类中覆盖shouldRenderAsCluster方法,如下所示:
/**
* If cluster size is less than this size, display individual markers.
*/
private int mMinClusterSize = 4;
/**
* Determine whether the cluster should be rendered as individual markers or a cluster.
*/
protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
return cluster.getSize() > mMinClusterSize;
}
答案 2 :(得分:1)
我意识到这是一个老问题,但对于那些仍在使用Pavel的优秀答案的人来说,还要确保更改这两行代码
BitmapDescriptor descriptor = mIcons.get(cluster.getSize());
...
mIcons.put(bucket, descriptor);
像这样更换桶:
BitmapDescriptor descriptor = mIcons.get(cluster.getSize());
...
mIcons.put(cluster.getSize(), descriptor);
否则,当合并/分离时,群集将四舍五入到最接近的桶大小,从而导致桶大小不准确。
有一种明显的解决方法,但如果您没有注意数据的确切值,则很容易错过。
对于任何挣扎的人:
在保留Google的渲染算法的同时实现Pavel答案的最简单方法是下载默认渲染器(在正确答案中链接),修改代码并将其设置为自定义渲染器ClusterManager。该库对外部修改/覆盖并不友好,并且只是覆盖这个段是一个巨大的痛苦,因为它使用了许多其他私有方法和变量。
答案 3 :(得分:0)
对于那些正在努力做同样事情的人 在您的自定义渲染器中覆盖这两个函数,如下所示 @覆盖 protected int getBucket(Cluster cluster){ return cluster.getSize(); }
@Override
protected String getClusterText(int bucket) {
return String.valueOf(bucket);
}