Android Beta 0.9 における ItemizedOverlayOverlayItem の効果的な使用方法

Android を使用している開発者であれば、ItemizedOverlay および OverlayItem 機能をマップアプリケーションに実装しようとした際に困難に直面したことがあるかもしれません。特に Android Beta 0.9 では、この問題が顕著です。本記事では、この文脈での一般的な問題を探り、その解決策を詳述することで、マップマーカーをスムーズに表示できるようにします。

問題

マップ上にマーカーを作成するために ItemizedOverlay を利用しようとすると(Google マップに見られるものに類似)、マーカーが期待通りに表示されないことに気づくかもしれません。以下のシナリオは、あなたにもお馴染みかもしれません:

  • ItemizedOverlay を拡張した MyItemizedOverlay クラスを設定しました。
  • このオーバーレイを MapView に追加しようとすると、OverlayItems を正常に抽出できたにもかかわらず、マーカーが表示されません。

以下は、オーバーレイを追加するために使用している可能性のあるコードスニペットです:

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

クラス定義

あなたの MyItemizedOverlay クラスは次のように定義できます:

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

解決策:Drawable に境界を設定する

主な問題は、マーカーに関連付けられた Drawable に境界が定義されていないことにあります。これを解決する方法は以下の通りです:

ステップ 1:Drawable の境界を設定する

ItemizedOverlay を追加する前に、Drawable の境界を指定してください。これは重要です。なぜなら、Drawable の draw メソッドは、これらの境界に依存してキャンバス上で正しく描画されるからです。次のように指定できます:

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

// Drawable の境界を設定します
defaultMarker.setBounds(0, 0, defaultMarker.getIntrinsicWidth(),
    defaultMarker.getIntrinsicHeight());

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

境界が重要な理由

  • レンダリングメカニクス:マーカーは Drawable.draw(Canvas) メソッドを介して描画され、これには描画対象がどこに存在するかを知るために境界が必要です。
  • 可視性:適切な境界がない場合、マーカーがマップに表示されないことがあり、開発プロセスで混乱を招く可能性があります。

追加リソース

さらに参考にするため、以下のリソースを参照できます:

結論

Drawable の境界を適切に設定することで、ItemizedOverlay が意図した通りに機能し、マップ上にマーカーが表示されるはずです。この修正は、Android Beta 0.9 において同様の問題に直面している開発者にとって重要であり、アプリケーションのマップ機能を実装する際のよりスムーズな開発体験を保証します。

ItemizedOverlay を実装する際の質問や体験を共有したい場合は、下にコメントしてください!