對於那些和我有同樣問題的人來說,解決方案其實很簡單。
所有你需要做的是設置在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進行逆向工程,所以我不妨從我的努力中獲得最大收益)。