Androidプログラマへの道 〜 Moonlight 明日香 〜 - オーバーレイを表示する

Google Maps Android v1 API

Googleマップに文字や画像等を重ねて表示するには, オーバーレイ(Overlay)クラスを利用する.

オーバーレイ表示

  • MapOverlay.java
オーバーレイ表示を行うクラスを実装する.
    • Overlayクラスを継承する.
    • オーバーレイの描画は, Overlay#drawメソッドに実装する.
      • shadow : false --- コンテンツを描画
      • shadow : true --- 影を描画
    • MapView#getProjectionメソッドで, 緯度, 経度から画面上の位置を取得する.
    • ここでは, マーク(円)と文字列を表示する.
package com.moonlight_aska.android.web.googlemap02;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class MapOverlay extends Overlay {
  // 六甲山:北緯34度46分41秒, 東経135度15分49秒
  private static final String LOCATION_MSG = "六甲山";
  private int mLatitude = (int)( (34.0d + 46.0d/60 + 41.0d/(60*60) ) * 1E6);
  private int mLongitude = (int)( (135.0d + 15.0d/60 + 49.0d/(60*60) ) * 1E6);

  @Override
  public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    // TODO Auto-generated method stub
    if (!shadow) {
      // 画面上の位置取得
      Point position = mapView.getProjection().toPixels(getGeoPoint(), null);
      // 表示色設定
      Paint paint = new Paint();
      paint.setARGB(128, 255, 0, 0);
      paint.setStyle(Paint.Style.FILL);
      // オーバーレイする内容表示
      canvas.drawCircle(position.x, position.y, 10, paint);
      canvas.drawText(LOCATION_MSG, position.x + 10, position.y + 5, paint);
    }
    super.draw(canvas, mapView, shadow);
  }

  public GeoPoint getGeoPoint() {
    GeoPoint geoPo = new GeoPoint(mLatitude, mLongitude);
    return geoPo;
  }
}
  • MainActivity.java
Googleマップにオーバーレイを重ねて表示するには, MapViewにオーバーレイを追加する.
    • MyOverlayのインスタンスを生成する.
    • MapView#getOverlaysメソッドで, オーバーレイのリストを取得する.
    • 追加するオーバーレイがリストに含まれていない場合, List#addメソッドでオーバーレイをリストに追加する.
    • MapView#invalidateメソッドで, 表示の更新を行う.
package com.moonlight_aska.android.web.googlemap02;

import java.util.List;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class MainActivity extends MapActivity {
  MapOverlay mOverlay;
  MapView mView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mView = (MapView)findViewById(R.id.mapview);
    MapOverlay mOverlay = new MapOverlay();
    // 地図表示
    GeoPoint geoPo = mOverlay.getGeoPoint();
    mView.getController().animateTo(geoPo);
    // オーバーレイ表示
    List<Overlay> overlays = mView.getOverlays();
    if (!overlays.contains(mOverlay)) {
      overlays.add(mOverlay);
      mView.invalidate();
    }
  }

  @Override
  protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
  }
}
  • 動作例
SHARP SH03C / Android 2.2