我正在使用Google Map Android clustering Utitlity使用Google Maps v2播放服務。聚合地圖標記時縮小和取消聚類放大
我沒有得到我期望的行爲。正如你在下面的兩張圖片中看到的那樣,當放大時,我可以看到一個20個簇和一個向左的單個標記,但是當我縮小直到它們彼此重疊時,我看不到它們是簇。 20個集羣仍然說20而不是21?
那是預期的行爲?有沒有一種方法可以使集羣展示,而不是21 20+
我正在使用Google Map Android clustering Utitlity使用Google Maps v2播放服務。聚合地圖標記時縮小和取消聚類放大
我沒有得到我期望的行爲。正如你在下面的兩張圖片中看到的那樣,當放大時,我可以看到一個20個簇和一個向左的單個標記,但是當我縮小直到它們彼此重疊時,我看不到它們是簇。 20個集羣仍然說20而不是21?
那是預期的行爲?有沒有一種方法可以使集羣展示,而不是21 20+
這是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.
但正確的解決將是考慮到標記位圖的大小,而不是恆定值。我認爲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);
}
我意識到這是一個老問題,但對於那些還在使用帕維爾的出色答卷,還要確保你改變的這兩行代碼
BitmapDescriptor descriptor = mIcons.get(cluster.getSize());
...
mIcons.put(bucket, descriptor);
替換水桶像這樣:
BitmapDescriptor descriptor = mIcons.get(cluster.getSize());
...
mIcons.put(cluster.getSize(), descriptor);
否則將簇合並時被四捨五入到最接近的桶大小/分離導致inaccur吃了桶大小。
一種明顯的修復方法,但如果您不注意數據的確切值,很容易錯過。
對於任何掙扎:
實施帕維爾的答案,同時保留谷歌的渲染算法是下載的默認渲染器(在正確答案的鏈接),修改代碼,並將其設置爲自定義呈現的最簡單方法你的ClusterManager。這個庫對外部修改/覆蓋不友好,它只是覆蓋這個片段的巨大痛苦,因爲它使用了很多其他的私有方法和變量。
您可以更改最小羣集大小。默認情況下,map-utils庫中定義的最小簇大小如下所示。
/**
* 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;
}
或者你可以在你的擴展DefaultClusterRenderer類,如下覆蓋shouldRenderAsCluster方法:如下
@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
// Always render clusters.
return cluster.getSize() > 1;
}
有人誰是掙扎在您的自定義渲染器做同樣的.. 覆蓋這兩個功能 @Override protected int getBucket(Cluster cluster){0} {0} {0}返回cluster.getSize(); }
@Override
protected String getClusterText(int bucket) {
return String.valueOf(bucket);
}
快速邊問題帕維爾,因爲你似乎有此實用工具的經驗。我注意到它的分組標記在當前縮放級別上並不完全在彼此之上。這個工具似乎很少有文檔。我怎樣才能設置如何接近標記的範圍之前,他們組/集羣 – erik
更新我的回答 –
再次感謝帕維爾,你有創建和處理羣集/ ClusterItem(S)選擇狀態的任何經驗?渲染器會創建一個看起來像的圖標,並且我希望能夠更改視圖並將一個dyanmic圖像傳遞到該視圖中,當選定一個給定的項目或羣集時,以及將所有未選中的選項更改回其未選中/原始狀態..我已經通過圖書館看了,似乎無法找到選擇/未選擇狀態.. – erik