Für jeden da draußen, der das gleiche Problem hat wie ich, ist die Lösung eigentlich ganz einfach.
Alles, was Sie tun müssen, ist, die Grenzen auf der OverlayItem des ziehbar gesetzt, wie folgt aus:
Drawable d = myOverlayItem.getMarker(0);
d.setBounds(-xWidth/2, -yWidth/2, xWidth, yWidth);
Der Parameter für getMarker tatsächlich abhängig von dem Zustand des overlayItem, aber für mich persönlich ist es das gleiche für alle mein Zustand, also war mir egal und nur 0.
Ich bin mir nicht sicher, wie die Lösung variieren wird, je nachdem, wo Sie die Grenzen tatsächlich festlegen, aber ich habe es innerhalb der Draw-Methode meiner ItemizedOverlay-Unterklasse :
@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);
}
Es ist erwähnenswert, dass die Grenzen des Overlay-Elements von 0,0 beginnen, was tatsächlich eine Leinwand ist, die nach oben links von der OverlayIcon übersetzt wird. Wenn Sie in meinem Beispiel die Breite auf 50 und die Höhe auf 50 setzen, wird das OverlayItem auf der Karte in der Mitte der definierten Position gezeichnet (im Konstruktor von OverlayItem festgelegt). Diesen Vorgang können Sie in der Quelle der Overlay sehen:
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();
}
(Es geschieht mit dem canvas.translate Aufruf)
auf gut Glück, dass jemand here's the full source for Overlay kümmert.
(Es hat viel Arbeit gekostet, maps.jar zu reverse engineer, damit ich das meiste aus meinem Aufwand herausholen kann).