所以我在这篇文章中讨论了几乎完全相同的问题,除了他们决定采用的解决方案的黑客工作对我不起作用。我需要一个真正的解决方案,所以我决定对 android maps 源代码进行逆向工程以找到最佳解决方案。
我目前的解决方案是在我的类中覆盖扩展 OverlayItem 的 draw 方法,但后来我遇到了在地图上点击覆盖项目不起作用的问题(点击注册在实际项目所在位置以外的位置画)。所以,我将继续挖掘,直到找到合适的方法组合来覆盖。
所以我在这篇文章中讨论了几乎完全相同的问题,除了他们决定采用的解决方案的黑客工作对我不起作用。我需要一个真正的解决方案,所以我决定对 android maps 源代码进行逆向工程以找到最佳解决方案。
我目前的解决方案是在我的类中覆盖扩展 OverlayItem 的 draw 方法,但后来我遇到了在地图上点击覆盖项目不起作用的问题(点击注册在实际项目所在位置以外的位置画)。所以,我将继续挖掘,直到找到合适的方法组合来覆盖。
对于那些和我有同样问题的人来说,解决方案实际上很简单。
您所要做的就是在 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 进行逆向工程需要我做很多工作,所以我不妨充分利用我的努力)。