2012-04-03 66 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进行逆向工程,所以我不妨从我的努力中获得最大收益)。