Camera Control
この章では地図の表示変更の方法を紹介します。
マップモード
マップモードは自車位置情報と地図の連動方法に関するモードで以下の3種類があります。
| 位置情報と地図の連動 | マップモード | 動作 |
|---|---|---|
| 連動する | HEADING_UP | 地図の中心座標と回転角が両方とも位置情報と連動 |
| 連動する | NORTH_UP | 地図の中心座標のみ位置情報と連動。回転角は北固定 |
| 連動しない | SCROLL | 地図の中心座標は連動しない |
Map.setMapModeにより上記のマップモードを変更することができます。
地図の表示変更
一般的な3DCGと同様にカメラの位置やその要素を変更することで地図の表示を変更することができます。変更可能な要素は以下の通りです。
| 要素 | 変更関数 |
|---|---|
| 中心座標 | Map.setCenterCoordinate() |
| 回転角 | Map.changeOrientation() |
| ズームレベル | Map.changeZoomLevel()Map.zoomIn/Out()Map.zoomTo() |
| 傾き | Map.changeTilt() |
| パディング | Map.changePadding() |
中心座標
設定することで地図の表示の中心座標を変更することができます。
回転角
設定する事で地図を回転させる事ができます。
Map.changeOrientation()では回転角を指定して変更する事ができます。
ズームレベル
設定することで地図の縮尺を変更することができます。
Map.changeZoomLevel()ではズームレベル指定してズームすることができます。
Map.zoomIn/Out()では呼び出し毎にズームレベル0.5単位で拡大、縮小することができます。ズームの単位を変更することも可能です。
Map.zoomTo()ではズームレベルではなく表示領域を指定します。
傾き
設定することで地図の傾きを変更することができます。
Map.changeTilt()では傾きを指定して設定することができます。
パディング
設定することで地図の上下左右のパディング領域を変更することができます。
Map.changePadding()ではパディング領域を指定して変更する事ができます。
changeOrientation(), setCenterCoordinate()等の地図の表示を変更する関数はパディング領域を除いた領域に適用されます。
例えば地図画面の上部に別のUI部品を表示した際にその分、上部にパディングを設定することでユーザーから見た地図の中心を適切に保つことが可能です。
CameraOptionsによる表示変更
CameraOptionsオブジェクトに各種設定を行い、Map.moveToPoint()に渡すことで複数のカメラ要素を同時に設定し、地図の表示を変更する事ができます。
CameraOptions cameraOptions = new CameraOptions();
GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
cameraOptions.setCenter(position);
cameraOptions.setLevel(13.5);
map.moveToPoint(cameraOptions);
地図の表示変更通知
地図の表示変更をリスナーにより検知することができます。変更内容と対応するリスナーは以下の通りです。
| 変更内容 | リスナー | リスナー追加関数 |
|---|---|---|
| 回転角変化 | OnMapRotateChangeListener | addOnMapRotateChangeListener |
| 傾き変化 | OnMapTiltChangeListener | addOnMapTiltChangeListener |
| 縮尺変化 | OnMapScaleChangeListener | addOnMapScaleChangeListener |
カメラのアニメーション後の通知
Map.moveToPoint()等のメソッドを実行し、アニメーションが完了した後はOnMapAnimationListenerのonAnimationEndにて完了の通知を受け取れます。
引数にanimationIdを設定するとonAnimationEndのanimationIdに同様のIdが通知されます。
duration、CameraOptions.setDuration()にてduration:0を指定するとアニメーションは行われず
OnMapAnimationListenerのonAnimationEndによるアニメーションの完了通知も行われません。
サンプルコードは以下の通りです。
map.changeOrientation(map.getOrientation() + 90, duration, "changeOrientation", new OnMapAnimationListener() {
@Override
public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
}
});
map.changeZoomLevel(zoomLevel, duration, "changeZoomLevel", new OnMapAnimationListener() {
@Override
public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
}
});
map.changeTilt(30, duration, "changeTilt", new OnMapAnimationListener() {
@Override
public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
}
});
map.changePadding(300, 500, 0, 0, duration, "changePadding", new OnMapAnimationListener() {
@Override
public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
}
});
map.moveToPoint(cameraOptions, "moveToPoint", new OnMapAnimationListener() {
@Override
public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
}
});
resultはアニメーションがどのように完了したかを通知します
| 完了通知 | 通知内容 |
|---|---|
| CANCELLED_ALL | アニメーションがキャンセル |
| COMPLETED_ALL | アニメーション完了 |
| COMPLETED_WITH_SKIP | 他のアニメーションと処理が被りアニメーションがスキップされた状態 |
マップモード変更時のアニメーション後の通知
マップモードを変更した際のアニメーションが完了した後はOnMapAnimationListenerのonAnimationEndにて完了の通知を受け取れます。
map.setMapMode(Map.MapMode.HEADING_UP, cameraOptions, "setMapMode", new OnMapAnimationListener() {
@Override
public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
}
});
OnMapAnimationListenerのonAnimationEndの動作に関しては、カメラのアニメーション後の通知の動作と同様です。