私と同じ問題を抱えている人にとって、解決策は実際には非常に簡単です。
次のように、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 をリバース エンジニアリングするのに多くの作業が必要だったので、自分の努力を最大限に活用したほうがよいでしょう)。