イベント

Maps SDK for Android を使うと、マップ上のイベントをリッスンできます。

コードサンプル

GitHub の ApiDemos リポジトリには、イベントとリスナーの機能を示すサンプルが含まれています。

地図へのクリックまたは長押しクリック イベント

ユーザーによる地図上の地点へのタップに応答するには、GoogleMap.setOnMapClickListener(OnMapClickListener) を呼び出して、地図に設定可能な OnMapClickListener を使用します。ユーザーが地図上の場所をクリック(タップ)すると、その場所を示す onMapClick(LatLng) イベントが届きます。なお、画面上の該当位置の情報(ピクセル単位)が必要な場合は、経度と緯度の座標と、画面でのピクセル座標に変換可能な Projection をその地図から取得することができます。

GoogleMap.setOnMapLongClickListener(OnMapLongClickListener) を呼び出して地図に設定できる OnMapLongClickListener を使用して、長押しクリック イベントをリッスンすることもできます。 このリスナーは、クリック リスナーと同様に動作し、長押しクリック イベントが発生すると onMapLongClick(LatLng) コールバックで通知されます。

ライトモードでのクリック イベントの無効化

ライトモードの地図でクリック イベントを無効にするには、MapView または MapFragment を含むビューで setClickable() を呼び出します。これは、たとえば 1 つ以上の地図をリスト表示していて、クリック イベントで地図とは無関係なアクションを呼び出すようにしたい場合に役立ちます。

クリック イベントを無効にするオプションは、ライトモードでのみ使用できます。クリック イベントを無効にすると、マーカーもクリックできなくなります。クリック イベントを無効にしても、地図上の他のコントロールに影響することはありません。

MapView の場合:

MapView view;
...
view.setClickable(false);

MapFragment の場合:

MapFragment fragment;
...
fragment.getView().setClickable(false);

カメラの変更イベント

地図ビューは、平面を見下ろすカメラとしてモデル化されています。カメラのプロパティを変更すると、地図のズームレベル、ビューポート、視点にも反映されます。詳しくは、カメラに関するガイドをご覧ください。ユーザーが行った操作によってカメラが影響を受ける場合もあります。

カメラ変更リスナーを使用すると、カメラの移動を追跡することができます。アプリには、カメラのモーション開始イベント、進行中イベント、終了イベントについて通知されます。また、カメラが移動している理由(ユーザーの操作や、組み込みの API アニメーション、またはデベロッパーによる制御などのうち、どれが原因となっているか)を確認することもできます。

次のサンプルでは、カメライベントで使用可能なすべてのリスナーを示しています。

public class MyCameraActivity extends FragmentActivity implements
        OnCameraMoveStartedListener,
        OnCameraMoveListener,
        OnCameraMoveCanceledListener,
        OnCameraIdleListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

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

        SupportMapFragment mapFragment =
            (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;

        mMap.setOnCameraIdleListener(this);
        mMap.setOnCameraMoveStartedListener(this);
        mMap.setOnCameraMoveListener(this);
        mMap.setOnCameraMoveCanceledListener(this);

        // Show Sydney on the map.
        mMap.moveCamera(CameraUpdateFactory
                .newLatLngZoom(new LatLng(-33.87365, 151.20689), 10));
    }

    @Override
    public void onCameraMoveStarted(int reason) {

        if (reason == OnCameraMoveStartedListener.REASON_GESTURE) {
            Toast.makeText(this, "The user gestured on the map.",
                           Toast.LENGTH_SHORT).show();
        } else if (reason == OnCameraMoveStartedListener
                                .REASON_API_ANIMATION) {
            Toast.makeText(this, "The user tapped something on the map.",
                           Toast.LENGTH_SHORT).show();
        } else if (reason == OnCameraMoveStartedListener
                                .REASON_DEVELOPER_ANIMATION) {
            Toast.makeText(this, "The app moved the camera.",
                           Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCameraMove() {
        Toast.makeText(this, "The camera is moving.",
                       Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraMoveCanceled() {
        Toast.makeText(this, "Camera movement canceled.",
                       Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraIdle() {
        Toast.makeText(this, "The camera has stopped moving.",
                       Toast.LENGTH_SHORT).show();
    }
}

使用可能なカメラリスナーは次のとおりです。

  • OnCameraMoveStartedListeneronCameraMoveStarted() コールバックは、カメラが移動を開始すると呼び出されます。このコールバック メソッドでは、カメラのモーションの reason を受け取ります。この理由は次のいずれかです。

    • REASON_GESTURE は、地図のパン、傾斜、ピンチ操作によるズーム、回転など、ユーザーが地図上で行った操作に応答してカメラが移動したことを示します。
    • REASON_API_ANIMATION は、API により、カメラが操作以外のユーザー アクション(ズームボタンのタップ、現在地ボタンのタップ、マーカーのクリックなど)に応答して移動したことを示します。
    • REASON_DEVELOPER_ANIMATION は、アプリがカメラの移動を開始したことを示します。
  • OnCameraMoveListeneronCameraMove() コールバックは、カメラが移動しているとき、またはユーザーがタッチ スクリーンを操作しているときに複数回にわたって呼び出されます。コールバックが呼び出される頻度の目安として、API ではフレーム 1 つにつきコールバックが 1 回呼び出されることを知っておくと役立ちます。ただし、このコールバックは非同期的に呼び出されるため、画面に表示される要素とは同期されません。また、カメラの位置が変わらなくても、onCameraMove() の次のコールバックが行われる場合もあります。

  • OnCameraIdleListenerOnCameraIdle() コールバックは、カメラが移動を停止したときと、ユーザーがマップの操作を停止したときに呼び出されます。

  • OnCameraMoveCanceledListenerOnCameraMoveCanceled() コールバックは、現在のカメラの移動が中断したときに呼び出されます。OnCameraMoveCanceled() コールバックの直後に、新しい reasononCameraMoveStarted() コールバックが呼び出されます。

    アプリで GoogleMap.stopAnimation() を明示的に呼び出した場合、OnCameraMoveCanceled() コールバックは呼び出されますが、onCameraMoveStarted() コールバックは呼び出されません

マップにリスナーを設定するには、該当する set-listener メソッドを呼び出します。 たとえば、OnCameraMoveStartedListener からコールバックをリクエストするには、GoogleMap.setOnCameraMoveStartedListener() を呼び出します。

カメラの対象(緯度と経度)、ズーム、方向、傾斜は、CameraPosition から取得できます。これらのプロパティについて詳しくは、カメラの位置に関するガイドをご覧ください。

お店やサービスなどのスポットでのイベント

スポット(地図上の場所)は、対応するアイコンとともに基本地図にデフォルトで表示されます。店舗、レストラン、ホテルといったビジネス スポットのほか、公園、学校、政府機関などもスポットに該当します。

スポットでのクリック イベントに対しては応答できます。お店やサービスなどのスポットに関するガイドをご覧ください。

インドアマップ イベント

インドアマップのアクティブなレベルを特定してカスタマイズするには、イベントを使用します。新しい建物がフォーカスされたか、建物内の新しいレベルがアクティブになったときにリスナーが呼び出されるよう設定するには、OnIndoorStateChangeListener インターフェースを使用します。

現在フォーカスされている建物を取得するには、GoogleMap.getFocusedBuilding() を呼び出します。 地図の中心を特定の経度と緯度に設定すると、通常はその経度と緯度にある建物が取得されますが、取得が保証されるわけではありません。

次に、現在アクティブなレベルを特定するには、IndoorBuilding.getActiveLevelIndex() を呼び出します。

IndoorBuilding building = mMap.getFocusedBuilding();
if (building == null) {
  return null;
}
return building.getLevels().get(building.getActiveLevelIndex());

これは、アクティブなレベルに対してカスタムのマークアップ(マーカー地面オーバーレイタイル オーバーレイ、ポリゴン、ポリライン、およびその他のシェイプなど)を表示する場合に役立ちます。

ヒント: 路面レベルに戻るには、IndoorBuilding.getDefaultLevelIndex() でデフォルトのレベルを取得して、IndoorLevel.activate() でアクティブなレベルに設定します。

マーカーおよび情報ウィンドウ イベント

マーカーのクリックやドラッグ イベントなどのマーカー イベントをリッスンして応答するには、対応するリスナーを、マーカーが帰属する GoogleMap オブジェクトに設定します。詳しくは、マーカー イベントに関するガイドをご覧ください。

情報ウィンドウでイベントをリッスンすることもできます。

シェイプおよびオーバーレイ イベント

ポリラインポリゴン地面オーバーレイ上でのクリック イベントは、リッスンして応答することができます。

現在地イベント

アプリは、現在地レイヤに関連する以下のイベントに応答できます。

  • ユーザーが現在地ボタンをクリックすると、アプリは GoogleMap.OnMyLocationButtonClickListener から onMyLocationButtonClick() コールバックを受け取ります。
  • ユーザーが現在地を示す青い点をクリックすると、アプリは GoogleMap.OnMyLocationClickListener から onMyLocationClick() コールバックを受け取ります。

詳しくは、現在地レイヤに関するガイドをご覧ください。