2012-04-03 51 views
1

所以我幾乎完全相同problem discussed in this post,只是他們決定採用的解決方案的黑客工作不適合我。我需要一個真正的解決方案,所以我決定對android地圖源代碼進行逆向工程,以找到最佳解決方案。如何在Google Android地圖上控制OverlayItem的尺寸?

我目前的解決方案是重寫我的類中的繪製方法,它擴展了OverlayItem,但後來我遇到了在地圖上的疊加項上點擊的問題不起作用(點擊寄存器的位置不是在哪裏實際項目被繪製)。所以,我只是繼續挖掘,直到我找到適當的方法組合來覆蓋。

回答

1

對於那些和我有同樣問題的人來說,解決方案其實很簡單。

所有你需要做的是設置在OverlayItem的繪製邊界,就像這樣:

Drawable d = myOverlayItem.getMarker(0); 
d.setBounds(-xWidth/2, -yWidth/2, xWidth, yWidth); 

爲getMarker的參數實際上依賴於overlayItem的狀態,但個人對我來說它都是一樣的我的狀態,所以我不在意,只是用了0.

我不知道如何解決方案將取決於你實際設置邊界的地方,但對我來說,我做了它在我的ItemizedOverlay子類的繪製方法:

@Override 
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) { 
    if (!shadow) { 
     // Do your projection calculations here, if necessary 

     for (int i = 0; i < mOverlays.size(); i++) { 
      Drawable d = mOverlays.get(i).getMarker(0); 
      d.setBounds(-width/2, -height/2, width/2, height/2); 
     } 
    } 

    super.draw(canvas, mapView, shadow); 
} 

值得注意的是,覆蓋項的邊界從0,0開始,實際上是一個畫布被轉換爲OverlayIcon的左上角。在我的示例中,如果將寬度設置爲50並將高度設置爲50,則OverlayItem將在地圖上繪製,並以其定義的位置爲中心(在OverlayItem的構造函數中設置)。您可以在覆蓋的源代碼看到這種情況發生:

protected static void drawAt(Canvas canvas, Drawable drawable, int x, int y, boolean shadow) 
    { 
     // .... Do Stuff .... 

     canvas.save(); 
     canvas.translate(x, y); 

     // .... Do Stuff .... 

     drawable.draw(canvas); 

     // .... Do Stuff .... 

     canvas.restore(); 
    } 

(它發生與canvas.translate調用)

上關的機會,有人關心here's the full source for Overlay

(我花了很多工作來對maps.jar進行逆向工程,所以我不妨從我的努力中獲得最大收益)。