因此,我几乎具有完全相同的problem discussed in this post,只是他们决定采用的解决方案的破解工作对我而言不起作用。我需要一个真正的解决方案,因此我决定对android maps源代码进行反向工程以找到最佳解决方案。

我当前的解决方案是重写扩展OverlayItem的类中的draw方法,但是随后我遇到了一个问题,即无法点击地图上的叠加项(点击会在实际项所在的位置以外的其他位置注册)画)。因此,我将继续挖掘,直到找到适当的方法组合来覆盖。

最佳答案

对于任何与我有相同问题的人,解决方案实际上都非常简单。

您所要做的就是在OverlayItem的drawable上设置边界,如下所示:

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


getMarker的参数实际上取决于overlayItem的状态,但就我个人而言,其所有状态均相同,因此我不在乎,只使用了0。

我不确定解决方案将如何变化,具体取决于您实际设置边界的位置,但是对我来说,我是在ItemizedOverlay子类的draw方法中完成的:

@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左上方的画布。在我的示例中,如果将width设置为50,height设置为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,所以我最好还是从我的工作中得到最大的收获)。

关于java - 您如何在Google Android map 上控制OverlayItem的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10001655/

10-12 00:19