sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

Google Maps Android API v2 その2 Map Objects

前回の続き

Map Objects

Google Maps Android APIを使えば、Googleマップアプリと同じような見た目のアプリに出来る。

地図タイルにマイプレイスみたいな情報を含ませたり、マップ上の鉄道の駅とかがクリッカブルになったりはしないけれど、自分でマーカーを設置してAPIで応答するようにも出来るし、なによりも、AndroidのUIをフルに活かしたアプリが作成可能。

GoogleMap

鍵となるクラスは com.google.android.gms.maps.GoogleMapで、内部で以下のような働きをする。

  • Google Mapsのサービスと接続する
  • 地図のタイルをダウンロードする
  • 画面に地図を描画する
  • 画面にズームやパンなどのコントロールを描画する
  • 地図のスクロールやズームの操作に対応する

これ以外にも、キー入力や地図へのタッチに対応するメソッドを呼び出したり、マーカーやオーバーレイアイテムを地図に追加したりといった操作を提供している。

MapFragment

Fragmentの派生クラスで、地図のコンテナとして振る舞い、GoogleMapオブジェクトへの仲介を行う。 表示だけのViewとは違い、Fragmentは、動作やインターフェースの一部も担うため、一つのActivityに複数のMapFragmentを表示させたりといったことも可能となる。

Fragmentを利用するには、API レベルが12以降である必要があるが、サポートライブラリを使うことで、それ以前のものにも対応する。

MapView

Viewの派生クラスで、地図を描画するための画面上の矩形の領域。このクラスを使う際には、Activityのライフサイクルイベント(onCreate,onDestroy,onResume,onPause)をActivityから転送してやる必要がある。

アプリに地図を追加する

MapFragmentをActivityに追加して、ActivityのonCreate()でMapFragmentの中のGoogleMapオブジェクトのハンドルを取得、表示オプションを設定して地図を表示する。AnddroidManifestでpermissionを追加するのも忘れないこと。

Fragmentの生成

MapFragmentの追加は、layoutファイルの中で<fragment>要素を使うか、コードの中でFragmentTransactionを使って行う

<?xml version="1.0" encoding="utf-8"?>
<fragment android:id="@+id/map"
  android:name="com.google.android.gms.maps.MapFragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />

--

mMapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.my_container, mMapFragment);
fragmentTransaction.commit();

地図の可用性を検証する

GoogleMapオブジェクトの操作を開始する前に、Google Play serveicesのコンポートが、端末に正しくインストールされているかを確かめるため、MapFragmentやMapViewから、GoogleMapオブジェクトを取得してnullチェックを行う。GoogleMapオブジェクトの取得には、 MapFragment#getMap()やMapView#getMap()を使う。以下はlayoutでMapFragmentを使った時の例。

MapFragment mapobj = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
if( mapobj != null){
    // Mapは利用可能 
}

地図の種類

Google Maps Android API で利用可能な地図の種類は以下の4つ

  • Normal - 道路、建物や重要な自然の物、川等が名称とともに表示される
  • Satellite - 衛星写真
  • Hybrid - 衛星写真の上に、道路や建物等と名称が表示される
  • Terrain - 地形図。全てではないが、いくつかの道路と名称が表示される
  • None - なし

種類を切り替える際は、GoogleMap#setMapType()を呼ぶ

初期状態の設定

地図表示を行う前に、初期状態の設定が可能

  • カメラの位置(経緯度、ズーム、方角、俯仰角)
  • マップの種類
  • ズームボタン、コンパスの表示の有無
  • スクロールやティルト、ズームといった、カメラ操作ジェスチャへの応答の可否

xmlでの設定

以下の属性がxmlで設定可能

  • mapType - マップ種類(none,normal,hybrid,satellite,terrain)
  • cameraTargetLat - 対象地点の緯度
  • cameraTargetLon - 対象地点の経度
  • cameraZoom - ズームレベル
  • cameraBearing - カメラの見ている方角(北が0°で時計回り)
  • cameraTilt - 対象地点の真上を0°として、対象地点との距離を保ったまま円弧上を動いた時の、真上からの角度
  • uiZoomControls - ズーム用のコントロールのon/off
  • uiCompass - コンパスのon/off
  • uiZoomGestures - ピンチイン/アウトでのズーム操作を受け付けるかどうか
  • uiScrollGestures - スワイプでのスクロール操作を受け付けるかどうか
  • uiRotateGestures - 2本指ピボットでの回転操作を受け付けるかどうか
  • uiTiltGestures - 2本指上下スワイプでのtilt操作を受け付けるかどうか
  • zOrderOnTop - MapViewを最前面におくかどうか(ズームやコンパス類よりも手前になることを意味します)
  • useViewLifecycle - MapFragmentのみ。内部のGoogleMapオブジェクトのライフサイクルをFragmentのViewと同期させるかどうか。デフォルトはfalse。trueにするとベースのGL contextが保持されなくなり、再接続時に地図も再利用されないいため、描画は遅くなるが、非表示時のリソースの占有が少なくなる

これらのカスタム属性を使う際には、xmlの頭で以下のnamespaceを宣言し、属性の前にmap:を付加する必要がある(namespaceはmap以外に変えても構わない)

xmlns:map="http://schemas.android.com/apk/res-auto"

プログラムでの設定

プログラムからは、GoogleMapOptionsオブジェクトを使って初期設定を行う。

GoogleMapOptions options = new GoogleMapOptions();
options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
.compassEnabled(false)
.rotateGesturesEnabled(false)
.tiltGesturesEnabled(false);

MapFragmentなら MapFragment.newInstance(GoogleMapOptions)のメソッド、 MavViewなら MapView(Context,GoogleMapOptions)のコンストラクタを使って作る。


大したことは書いてなさげなわりに微妙に細かいことが書いてあるので読んどかないといけない感じです。 API Reference全部読んだほうがいいのかな…

次回へ続く