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()では回転角を指定して変更する事ができます。

orientation

ズームレベル

設定することで地図の縮尺を変更することができます。

zoom

Map.changeZoomLevel()ではズームレベル指定してズームすることができます。

Map.zoomIn/Out()では呼び出し毎にズームレベル0.5単位で拡大、縮小することができます。ズームの単位を変更することも可能です。

Map.zoomTo()ではズームレベルではなく表示領域を指定します。

傾き

設定することで地図の傾きを変更することができます。
Map.changeTilt()では傾きを指定して設定することができます。

tilt

パディング

設定することで地図の上下左右のパディング領域を変更することができます。
Map.changePadding()ではパディング領域を指定して変更する事ができます。

changeOrientation(), setCenterCoordinate()等の地図の表示を変更する関数はパディング領域を除いた領域に適用されます。
例えば地図画面の上部に別のUI部品を表示した際にその分、上部にパディングを設定することでユーザーから見た地図の中心を適切に保つことが可能です。

padding

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

地図の表示変更通知

地図の表示変更をリスナーにより検知することができます。変更内容と対応するリスナーは以下の通りです。

変更内容リスナーリスナー追加関数
回転角変化OnMapRotateChangeListeneraddOnMapRotateChangeListener
傾き変化OnMapTiltChangeListeneraddOnMapTiltChangeListener
縮尺変化OnMapScaleChangeListeneraddOnMapScaleChangeListener

カメラのアニメーション後の通知

Map.moveToPoint()等のメソッドを実行し、アニメーションが完了した後はOnMapAnimationListeneronAnimationEndにて完了の通知を受け取れます。

引数にanimationIdを設定するとonAnimationEndanimationIdに同様のIdが通知されます。

durationCameraOptions.setDuration()にてduration:0を指定するとアニメーションは行われず

OnMapAnimationListeneronAnimationEndによるアニメーションの完了通知も行われません。

サンプルコードは以下の通りです。

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他のアニメーションと処理が被りアニメーションがスキップされた状態

マップモード変更時のアニメーション後の通知

マップモードを変更した際のアニメーションが完了した後はOnMapAnimationListeneronAnimationEndにて完了の通知を受け取れます。

map.setMapMode(Map.MapMode.HEADING_UP, cameraOptions, "setMapMode", new OnMapAnimationListener() {
    @Override
    public void onAnimationEnd(@NonNull String animationId, @NonNull AnimationResult result) {
    }
});

Note:

OnMapAnimationListeneronAnimationEndの動作に関しては、カメラのアニメーション後の通知の動作と同様です。