1

所以我在这篇文章中讨论了几乎完全相同的问题,除了他们决定采用的解决方案的黑客工作对我不起作用。我需要一个真正的解决方案,所以我决定对 android maps 源代码进行逆向工程以找到最佳解决方案。

我目前的解决方案是在我的类中覆盖扩展 OverlayItem 的 draw 方法,但后来我遇到了在地图上点击覆盖项目不起作用的问题(点击注册在实际项目所在位置以外的位置画)。所以,我将继续挖掘,直到找到合适的方法组合来覆盖。

4

1 回答 1

1

对于那些和我有同样问题的人来说,解决方案实际上很简单。

您所要做的就是在 OverlayItem 的可绘制对象上设置边界,如下所示:

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 左上角的画布。在我的示例中,如果将宽度设置为 50 并将高度设置为 50,则 OverlayItem 将绘制在地图上,以它定义的位置为中心(在 OverlayItem 的构造函数中设置)。您可以在 Overlay 的源代码中看到这种情况:

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 调用中)

如果有人关心这里是 Overlay 的完整来源

(对 maps.jar 进行逆向工程需要我做很多工作,所以我不妨充分利用我的努力)。

于 2012-04-04T01:47:10.390 回答