Comment utiliser efficacement ItemizedOverlay et OverlayItem dans Android Beta 0.9

Si vous êtes un développeur travaillant avec Android, vous avez peut-être rencontré des difficultés lors de l’implémentation des fonctionnalités ItemizedOverlay et OverlayItem dans vos applications de cartes, en particulier dans Android Beta 0.9. Cet article vise à explorer un problème courant dans ce contexte et à présenter une solution détaillée qui vous aidera à faire fonctionner ces marqueurs de carte sans problème.

Le Problème

En essayant d’utiliser ItemizedOverlay pour créer des marqueurs sur votre carte (similaires à ceux vus dans Google Maps), vous avez peut-être remarqué que les marqueurs n’apparaissent pas comme prévu. Voici le scénario avec lequel vous pourriez être familier :

  • Vous avez configuré votre classe MyItemizedOverlay qui étend ItemizedOverlay.
  • Lorsque vous tentez d’ajouter cet overlay à votre MapView, il n’affiche aucun marqueur malgré l’extraction réussie des OverlayItems.

Voici un extrait du code que vous pourriez utiliser pour ajouter l’overlay :

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();
}

Définition de la Classe

Votre classe MyItemizedOverlay pourrait être définie comme suit :

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, "Marqueur", "Texte du Marqueur");
    return oi;
  }

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

La Solution : Définir les Limites de Votre Drawable

Le problème clé réside souvent dans l’absence de limites définies pour le Drawable associé à vos marqueurs. Voici comment le résoudre :

Étape 1 : Définir les Limites du Drawable

Avant d’ajouter votre ItemizedOverlay, assurez-vous de spécifier les limites pour votre drawable. Cela est crucial car la méthode draw du drawable dépend de ces limites pour se rendre correctement sur le canevas. Voici comment vous pouvez le faire :

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

// Définir les limites pour votre drawable
defaultMarker.setBounds(0, 0, defaultMarker.getIntrinsicWidth(),
    defaultMarker.getIntrinsicHeight());

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

Pourquoi les Limites Sont-elles Importantes ?

  • Mécanismes de Rendu : Les marqueurs sont dessinés via la méthode Drawable.draw(Canvas), qui nécessite que des limites soient spécifiées afin que le drawable sache où se rendre sur le canevas.
  • Visibilité : Sans limites appropriées, vos marqueurs peuvent ne pas apparaître sur la carte, ce qui peut conduire à de la confusion au cours du processus de développement.

Ressources Supplémentaires

Pour des références supplémentaires et un guide détaillé, vous pouvez consulter les ressources suivantes :

Conclusion

En définissant correctement les limites de votre Drawable, vous devriez constater que votre ItemizedOverlay fonctionne comme prévu, affichant les marqueurs sur votre carte. Cette correction est essentielle pour les développeurs confrontés à des problèmes similaires dans Android Beta 0.9, garantissant une expérience de développement plus fluide lors de l’implémentation des fonctionnalités de carte dans vos applications.

Si vous avez d’autres questions ou si vous souhaitez partager vos expériences concernant l’implémentation d’ItemizedOverlay, n’hésitez pas à commenter ci-dessous !