So verwenden Sie ItemizedOverlay und OverlayItem effektiv in Android Beta 0.9

Wenn Sie ein Entwickler sind, der mit Android arbeitet, sind Ihnen möglicherweise Herausforderungen begegnet, als Sie versuchten, die Funktionen ItemizedOverlay und OverlayItem in Ihren Kartenanwendungen zu implementieren, insbesondere in Android Beta 0.9. Dieser Artikel zielt darauf ab, ein häufiges Problem in diesem Zusammenhang zu erkunden und eine detaillierte Lösung zu präsentieren, die Ihnen helfen wird, diese Kartenmarker reibungslos zum Laufen zu bringen.

Das Problem

Beim Versuch, ItemizedOverlay zu nutzen, um Marker auf Ihrer Karte (ähnlich wie in Google Maps) zu erstellen, haben Sie möglicherweise bemerkt, dass die Marker nicht wie erwartet angezeigt werden. Hier ist das Szenario, das Ihnen vielleicht bekannt vorkommt:

  • Sie haben Ihre MyItemizedOverlay-Klasse eingerichtet, die von ItemizedOverlay erbt.
  • Wenn Sie versuchen, dieses Overlay zu Ihrer MapView hinzuzufügen, werden trotz erfolgreicher Extraktion der OverlayItems keine Marker angezeigt.

Hier ist ein Ausschnitt aus dem Code, den Sie möglicherweise verwenden, um das Overlay hinzuzufügen:

private void addItemizedOverlay() {
  Resources r = getResources();
  MapView mapView = (MapView)findViewById(R.id.mymapview);
  List<Overlay> overlays = mapView.getOverlays();

  MyItemizedOverlay markers = new MyItemizedOverlay(r.getDrawable(R.drawable.icon));
  overlays.add(markers);

  OverlayItem oi = markers.getItem(0);
  markers.setFocus(oi);
  mapView.postInvalidate();
}

Klassendefinition

Ihre MyItemizedOverlay-Klasse könnte wie folgt definiert sein:

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
  public MyItemizedOverlay(Drawable defaultMarker) {
    super(defaultMarker);
    populate();
  }

  @Override
  protected OverlayItem createItem(int index) {
    Double lat = (index + 37.422006) * 1E6;
    Double lng = -122.084095 * 1E6;
    GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());

    OverlayItem oi = new OverlayItem(point, "Marker", "Marker Text");
    return oi;
  }

  @Override
  public int size() {
    return 5;
  } 
}

Die Lösung: Grenzen für Ihr Drawable festlegen

Das Hauptproblem liegt oft in der Abwesenheit von festgelegten Grenzen für das Drawable, das mit Ihren Markern verbunden ist. So können Sie dies beheben:

Schritt 1: Grenzen für das Drawable festlegen

Bevor Sie Ihr ItemizedOverlay hinzufügen, stellen Sie sicher, dass Sie die Grenzen für Ihr Drawable festlegen. Dies ist entscheidend, da die draw-Methode des Drawables auf diese Grenzen angewiesen ist, um korrekt auf dem Canvas zu rendern. So können Sie es tun:

Drawable defaultMarker = r.getDrawable(R.drawable.icon);

// Grenzen für Ihr Drawable festlegen
defaultMarker.setBounds(0, 0, defaultMarker.getIntrinsicWidth(),
    defaultMarker.getIntrinsicHeight());

MyItemizedOverlay markers = new MyItemizedOverlay(defaultMarker);
overlays.add(markers);

Warum sind Grenzen wichtig?

  • Rendering-Mechanik: Die Marker werden über die Methode Drawable.draw(Canvas) gezeichnet, die erfordert, dass Grenzen angegeben werden, damit das Drawable weiß, wo es sich auf dem Canvas rendern soll.
  • Sichtbarkeit: Ohne richtige Grenzen sind Ihre Marker möglicherweise nicht auf der Karte sichtbar, was während des Entwicklungsprozesses zu Verwirrungen führen kann.

Zusätzliche Ressourcen

Für weitere Informationen und eine detaillierte Anleitung können Sie die folgenden Ressourcen besuchen:

Fazit

Durch das ordnungsgemäße Festlegen der Grenzen für Ihr Drawable sollten Sie feststellen, dass Ihr ItemizedOverlay wie beabsichtigt funktioniert und die Marker auf Ihrer Karte anzeigt. Diese Lösung ist für Entwickler, die mit ähnlichen Problemen in Android Beta 0.9 konfrontiert sind, von entscheidender Bedeutung, um eine reibungslosere Entwicklungserfahrung bei der Implementierung von Kartenfunktionen in Ihren Anwendungen zu gewährleisten.

Wenn Sie weitere Fragen haben oder Ihre Erfahrungen mit der Implementierung von ItemizedOverlay teilen möchten, hinterlassen Sie gerne einen Kommentar unten!