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