GoogleMap par défaut ne fournit pas d'événement pour le démarrage et l'arrêt du glissement de la carte. J'ai déjà signalé ce problème ici .
Je veux faire personnalisé handler
qui utilisera l'événement ordinaire onTouch
et le combinera avec setOnCameraChangeListener
.
Cependant, je n'ai pas réussi à trouver comment accéder à l'événement onTouch
de l'objet GoogleMap
. Il ne fournit pas un tel rappel .
Je me demande comment puis-je gérer l'événement onTouch pour la carte dans API Google Map v2 ?
Voici une solution de contournement possible pour déterminer les événements de début et de fin de glisser:
Vous devez étendre SupportMapFragment
ou MapFragment
. Dans onCreateView()
vous devez envelopper votre MapView
dans un FrameLayout
personnalisé (dans l'exemple ci-dessous, c'est la classe TouchableWrapper
), dans laquelle vous interceptez les événements tactiles et reconnaît si la carte est tapée ou non. Si votre onCameraChange
est appelé, vérifiez simplement si la vue cartographique est activée ou non (dans l'exemple ci-dessous, il s'agit de la variable mMapIsTouched
).
Exemple de code:
MISE À JOUR 1:
getView()
dispatchTouchEvent()
au lieu de onInterceptTouchEvent()
FrameLayout personnalisé:
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);
}
}
Dans votre MapFragment personnalisé:
@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;
}
Dans votre caméra, modifiez la méthode de rappel:
private final OnCameraChangeListener mOnCameraChangeListener = new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if (!mMapIsTouched) {
refreshClustering(false);
}
}
};
Il existe un moyen plus simple de le faire, gérez vos cas sur onCameraMoveStarted
écouteur comme celui-ci
Sous l'extrait de code
@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();
}
}