2014-01-21 58 views
3

我正在使用Google Map Android clustering Utitlity使用Google Maps v2播放服務。聚合地圖標記時縮小和取消聚類放大

我沒有得到我期望的行爲。正如你在下面的兩張圖片中看到的那樣,當放大時,我可以看到一個20個簇和一個向左的單個標記,但是當我縮小直到它們彼此重疊時,我看不到它們是簇。 20個集羣仍然說20而不是21?

enter image description here

enter image description here

那是預期的行爲?有沒有一種方法可以使集羣展示,而不是21 20+

回答

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. 

但正確的解決將是考慮到標記位圖的大小,而不是恆定值。我認爲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); 
} 
+0

快速邊問題帕維爾,因爲你似乎有此實用工具的經驗。我注意到它的分組標記在當前縮放級別上並不完全在彼此之上。這個工具似乎很少有文檔。我怎樣才能設置如何接近標記的範圍之前,他們組/集羣 – erik

+0

更新我的回答 –

+0

再次感謝帕維爾,你有創建和處理羣集/ ClusterItem(S)選擇狀態的任何經驗?渲染器會創建一個看起來像的圖標,並且我希望能夠更改視圖並將一個dyanmic圖像傳遞到該視圖中,當選定一個給定的項目或羣集時,以及將所有未選中的選項更改回其未選中/原始狀態..我已經通過圖書館看了,似乎無法找到選擇/未選擇狀態.. – erik

1

我意識到這是一個老問題,但對於那些還在使用帕維爾的出色答卷,還要確保你改變的這兩行代碼

BitmapDescriptor descriptor = mIcons.get(cluster.getSize()); 
... 
mIcons.put(bucket, descriptor); 

替換水桶像這樣:

BitmapDescriptor descriptor = mIcons.get(cluster.getSize()); 
... 
mIcons.put(cluster.getSize(), descriptor); 

否則將簇合並時被四捨五入到最接近的桶大小/分離導致inaccur吃了桶大小。

一種明顯的修復方法,但如果您不注意數據的確切值,很容易錯過。

對於任何掙扎:

實施帕維爾的答案,同時保留谷歌的渲染算法是下載的默認渲染器(在正確答案的鏈接),修改代碼,並將其設置爲自定義呈現的最簡單方法你的ClusterManager。這個庫對外部修改/覆蓋不友好,它只是覆蓋這個片段的巨大痛苦,因爲它使用了很多其他的私有方法和變量。

1

您可以更改最小羣集大小。默認情況下,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; 
} 
0

有人誰是掙扎在您的自定義渲染器做同樣的.. 覆蓋這兩個功能 @Override protected int getBucket(Cluster cluster){0} {0} {0}返回cluster.getSize(); }

@Override 
protected String getClusterText(int bucket) { 
    return String.valueOf(bucket); 
}