对于那些和我有同样问题的人来说,解决方案其实很简单。
所有你需要做的是设置在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进行逆向工程,所以我不妨从我的努力中获得最大收益)。