varios studio marcadores infowindowadapter google example eventos custom color agregar android google-maps android-mapview google-maps-android-api-2

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



marker color google maps (2)

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 devolución de llamada .

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 devolución de llamada:

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