web-dev-qa-db-ja.com

Google Map API v2で地図のonTouchイベントを処理する方法

デフォルトでは、GoogleMapはマップのドラッグスタートとドラッグストップのイベントを提供しません。 この問題はここで報告済みです

customhandlerを作成します。これはプレーンonTouchイベントを使用し、setOnCameraChangeListenerと結合します。

しかし、onTouchオブジェクトのGoogleMapイベントにアクセスする方法を見つけることができませんでした。そのようなcallbackは提供しません。

Google Map API v2でマップのonTouchイベントをどのように処理できますか?

31
Alexey Zakharov

ドラッグ開始イベントとドラッグ終了イベントを決定するための可能な回避策は次のとおりです。

SupportMapFragmentまたはMapFragmentを拡張する必要があります。 onCreateView()では、MapViewをカスタマイズされたFrameLayoutでラップする必要があります(以下の例では、TouchableWrapperクラスです)。ここで、タッチイベントをインターセプトします。マップがタップされたかどうかを認識します。 onCameraChangeが呼び出されたら、マップビューが押されているかどうかを確認します(下の例では、変数mMapIsTouchedです)。

サンプルコード:

更新1:

  • getView()の元の作成済みビューを返します
  • dispatchTouchEvent()の代わりにonInterceptTouchEvent()を使用します

カスタマイズされたFrameLayout:

private class TouchableWrapper extends FrameLayout {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
        mMapIsTouched = true;
        break;

    case MotionEvent.ACTION_UP:
        mMapIsTouched = false;
        break;
        }

        return super.dispatchTouchEvent(ev);
    }
    }

カスタマイズしたMapFragmentで:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);

    mTouchView = new TouchableWrapper(getActivity());
    mTouchView.addView(mOriginalContentView);

    return mTouchView;
}

@Override
public View getView() {
    return mOriginalContentView;
}

カメラ変更コールバックメソッドで:

private final OnCameraChangeListener mOnCameraChangeListener = new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        if (!mMapIsTouched) {
            refreshClustering(false);
        }
    }
};
41
AZ13

これを行う簡単な方法があり、onCameraMoveStartedリスナーでケースを処理します

コードスニペットの下

@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();
    }
}
2
Flaviu Nes