2012-04-03 1 views
1

So habe ich fast genau die gleiche problem discussed in this post außer dass der Hack-Job einer Lösung, die sie beschlossen, mit einfach gehen wird nicht für mich arbeiten. Ich brauche eine echte Lösung, also habe ich beschlossen, den Quellcode der Android-Karten zurück zu entwickeln, um die beste Lösung zu finden.Wie steuern Sie die Größe eines OverlayItems auf der Google Android-Karte?

Meine aktuelle Lösung ist es, die Zeichenmethode in meiner Klasse zu überschreiben, die OverlayItem erweitert, aber dann stoße ich auf das Problem, dass das Antippen des Overlay-Elements auf der Karte nicht funktioniert (der Tap registriert sich an einem anderen Ort als wo der tatsächliche Artikel wird gezeichnet). Also werde ich einfach weiter graben, bis ich die richtige Mischung von Methoden gefunden habe, die ich außer Kraft setzen kann.

Antwort

1

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).

Verwandte Themen