デフォルトでは、GoogleMapはマップのドラッグスタートとドラッグストップのイベントを提供しません。 この問題はここで報告済みです 。
customhandler
を作成します。これはプレーンonTouch
イベントを使用し、setOnCameraChangeListener
と結合します。
しかし、onTouch
オブジェクトのGoogleMap
イベントにアクセスする方法を見つけることができませんでした。そのようなcallbackは提供しません。
Google Map API v2でマップのonTouchイベントをどのように処理できますか?
ドラッグ開始イベントとドラッグ終了イベントを決定するための可能な回避策は次のとおりです。
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);
}
}
};
これを行う簡単な方法があり、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();
}
}