2013-01-09 78 views
4

我們正在將應用從v1 Maps API移植到v2 API,並且遇到標記問題。Android Maps API v2 - 標記旋轉的方法?

我們需要指向特定地理方向的標記。在V1中,我們可以在繪製時在正確的方向上構建位圖指向,但在V2中,標記位圖不能更改。

我不知道如果最好的辦法是銷燬時,地圖旋轉,重新構建我們的所有標記(這聽起來像一個性能問題),還是要儘量畫他們所有自己。這可能是通過TileOverlay或通過我們自己的視圖,我們坐在地圖上。

我不太喜歡這些方法中的任何一種。有沒有人嘗試過其中任何一種?

UPDATE:

我試圖通過我們自己的視圖繪製,但這是太laggy圖時被拖入。

我現在正在銷燬&重新創建標記,但這是(如預期的)性能問題,需要〜2000mS來更新60個標記。

回答

0

不能使用addMarker(new MarkerOptions())方法?

如果您需要自定義標記,您可以創建的InfoWindowAdapter的實施和使用像mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());

這裏實現是InfoWindowAdapter

+0

mu故障,我明白錯誤,但我認爲標記位圖可以更改,檢查谷歌地圖v2的示例代碼,檢查MarkerDemoActivity他們有一個自定義標記在那裏,此外,如果你不渴望改變任何東西您可以覆蓋onConfigurationChanged以避免重新繪製地圖。我這次得到你了嗎? –

+0

不,MarkerDemoActivity只會在標記生成時在addMarkersToMap中設置標記圖標。它永遠不會更改標記圖標。 –

+0

@RichardSewell我不知道如何旋轉標記,但您可以使用'軸承'旋轉指向特定位置的圖像(箭頭)。看看這個問題:http://stackoverflow.com/questions/15381358/is-it-possible-to-set-dimensions-to-a-groundoverlay-that-is-independent-of-the-m – AlexAndro

0

我也改寫我的應用程序(Runbot)爲新的文檔API並且必須弄清楚如何創建代表里程碑(如1km,2km,...)的自定義標記,以及如何根據縮放級別顯示或顯示所有這些標記。 我有我用於1.0版API和我現在做的渲染標誌是這個自定義繪製(Position是一類我自己保存的位置和其他信息;一切都在這裏需要的是它的LatLng屬性):

private void addMarker(Position p, MilestoneDrawable milestone) { 
    if (mMarkers.containsKey(p)) { 
     mMarkers.get(p).setVisible(true); 
    } else { 
     Marker m = mMap.addMarker(new MarkerOptions() 
      .position(p.latLng) 
      .icon(BitmapDescriptorFactory.fromBitmap(Util.drawableToBitmap(milestone))) 
      .anchor(0.5f, 1.0f) // bottom center 
      ); 
     mMarkers.put(p, m); 
    } 
} 

除了創建並添加自定義標記,你看到的是,我一直在HashMap的標誌,所以我不用破壞和創造他們所有的時間。當談到縮放和決定哪些展示,我第一次設置所有標記爲不可見,比打電話addMarker()對於那些我想要顯示,以及那些我已經在HashMap我只是讓再次可見。

我希望這可以幫助你一點。我有一點對新API百感交集......

0

我有一個類似的問題,我有一個需要旋轉標記。我的解決方案是讓標記表示的對象負責生成標記。我有對象了一些方法,看起來像:

protected Marker getMarker(GoogleMap map) { 
    if (this.marker == null) { 
     marker = map.addMarker(new MarkerOptions().position(location). 
      icon(BitmapDescriptorFactory.fromBitmap(BusMarkerImageFactory. 
      getMarkerIcon(heading)))); 
    } 
    return marker; 
} 

protected void updateMarker(GoogleMap map) { 
    if (marker != null) { 
     rotateIcon(); 
     marker.setPosition(location); 
    } else { 
     getMarker(map); 
    } 

private void rotateIcon() { 
    marker.setIcon(BitmapDescriptorFactory. 
     fromBitmap(BusMarkerImageFactory.getMarkerIcon(heading))); 
} 

這是繪製公交車在他們前進的方向指向標,所以理所當然的,你的代碼將是不同的系統,但概念非常相似。您不必重建整個標記,而是在某處保留對其的引用,然後重新設置圖標。

當然,繪製所有這些位圖的微小變化是對存儲器的漏極。我在(錯誤命名的)BusMarkerImageFactory中使用了flyweight模式,爲16個可能的標題範圍保留16個圖像。它是一個靜態類,只需在標題中輸入並返回映射到該範圍的圖像。

相關問題