¿Cómo se maneja el evento OnTouch para el mapa en Google Map API v2?

GoogleMap de forma predeterminada no proporciona eventos para el inicio del arrastre del mapa y la detención del arrastre. Ya he informado sobre ese problema aquí .

Quiero crear un handler personalizado que use el evento plain onTouch y combinarlo con setOnCameraChangeListener .

Sin embargo, no pude encontrar cómo puedo acceder onTouch evento onTouch del objeto GoogleMap . No proporciona dicha callback .

Me pregunto cómo puedo manejar el evento onTouch para el mapa en Google Map API v2 .

Aquí hay una posible solución para determinar los eventos de inicio de arrastre y fin de arrastre:

MapFragment extender MapFragment o MapFragment . En onCreateView() tiene que ajustar su MapView en un FrameLayout personalizado (en el ejemplo a continuación, es la clase TouchableWrapper ), en la que intercepta eventos táctiles y reconoce si el mapa está intervenido o no. Si se llama a onCameraChange , simplemente verifique si la vista del mapa está presionada o no (en el ejemplo a continuación esta es la variable mMapIsTouched ).

Código de ejemplo:

ACTUALIZACIÓN 1:

  • devolver la vista original creada en getView()
  • utilice dispatchTouchEvent() lugar de onInterceptTouchEvent()

FrameLayout personalizado:

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

En su MapFragment personalizado:

 @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; } 

En su cámara, cambie el método de callback:

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

Hay una manera más simple de hacer esto, manejar sus casos en onCameraMoveStarted oyente de onCameraMoveStarted de onCameraMoveStarted como este

Debajo del fragmento de código

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