Google Maps Android API v2 その5 Changing the View
カメラを操作して視界を変えよう。
Google Maps Android API v2は、簡単なジェスチャや操作で、ズームや地図のスクロール、視点の変更を軽快に行える。これは"vector-based map tiles"のおかげ。また、多くの都市で建造物の3D表示が可能となっている。
カメラの向きの変更は、マーカーやオーバーレイ、その他の地図に追加されたグラフィックに影響を与えない。
Changing a Map's View
Google Maps Android API v2の地図は、WebのGoogleMapsと同様に、東西は継ぎ目なく連続し、南北は北緯85度から南緯85度までに制限されたメルカトル図法の地図となっている。
経度方向を無限に、緯度方向を85度でカットしたのは、タイルの選定処理を簡単にするため
The Camera Position
Mapのカメラは、平坦な面を見下ろす形となっている。これらは、target(経緯度)、zoom、bearing、tiltのプロパティで個別に設定できる
- Target - 地図の中心座標
- Zoom - 地図の表示倍率。 zoom levelが0のとき、世界地図の横幅が256dpの大きさとなるり、leveが1あがる毎に、256 * 2N [dp]の大きさとなる。 zoom levelは整数でなくても構わない。地図の種類やスクリーンのサイズによって、zoom levelの範囲は変わる
- Bearing - 向き。真北を0°とする時計回りの角度
- Tilt - 対象座標の真上から円弧上を移動した際に、真上と対象座標と視点のなす角度
Moving the camera
カメラの位置を変更する際にアニメーションをさせられる。
操作は、CameraUpdateFactoryを利用して生成したCameraUpdateオブジェクトで行う。
Changing zoom level
ズームを変更する
- CameraUpdateFactory.zoomIn() - zoom levelを+1.0
- CameraUpdateFactory.zoomOut() - zoom levelを-1.0
- CameraUpdateFactory.zoomTo(float) - 現在のlevelから引数で指定されたlevelへ変更
- CameraUpdateFactory.zoomBy(float) - 現在のlevelから引数で指定された量だけ変更
- CameraUpdateFactory.zoomBy(float, Point) - zoomByと一緒だが、画面の指定されたXY座標の経緯度が変更されないように、カメラの位置を修正する
Changing camera position
- CameraUpdateFactory.newLatLng(LatLng) - 指定された座標へ変更
- CameraUpdateFactory.newLatLngZoom(LatLng, float) - 指定された座標とzoom levelへ変更
- CameraUpdateFactory.newCameraPosition(CameraPosition) - targetやzoom,tilt等、全てを一括で変更する。CameraPosionはコンストラクタで直に生成するか、CameraPosition.Builder()を使って生成する
Setting boundaries
ある範囲の区域を、スクリーンにおさまる最大のズームレベルで表示するには、 CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding) で、その区域とパティングをピクセルで指定して、戻り値のCameraUpdateを使ってカメラの位置を変更すると良い。 newLatLngBounds(boundary, width, height, padding) のほうは、ピクセルでの縦横のサイズを指定できる。前者がマップがレイアウトされた後でしか使えないのに対し、後者のメソッドはいつでも呼び出せる
Panning (scrolling)
CameraUpdateFactory.scrollBy(float, float) は、指定されたピクセル分だけ対象座標を変更する
Updating the Camera View
CameraUpdateオブジェクトをmapにセットすれば、カメラの位置を、即時もしくはアニメーションで変えられる。
すぐに変更するなら GoogleMap.moveCamera(CameraUpdate)、アニメーションを使用した、より素敵な表現にするなら GoogleMap.animateCamera(cameraUpdate, duration, callback)を使う。
callbackには終了時とキャンセル時のイベントハンドラであるGoogleMap.CancellableCallback、durationにはアニメーションを行う時間をミリ秒で指定する。
以下、mountain viewから弊社までカメラをアニメーションで切り替える例
private static final LatLng MOUNTAIN_VIEW = new LatLng(37.4, -122.1);
private static final LatLng MY_PLACE = new LatLng(34.994927, 135.738935);
GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
map.moveCamera(CameraUpdateFactory.newLatLngZoom(MOUNTAIN_VIEW, 15));
map.animateCamera(CameraUpdateFactory.zoomIn());
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(MY_PLACE)
.zoom(17)
.bearing(90)
.tilt(30)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
ということで、ドキュメントを一通り読み終わりました。ちゃんと読んでみると、 結構見落としてることが多いです。もっとスラスラ読めるように英語力も磨かないといけないですね…
さて、飯でも食いながらAPI Referenceにざっと目を通して、次からはAPI Demoアプリのソースを見て行くことにします。