web-dev-qa-db-fra.com

Comment gérer l'événement onTouch pour la carte dans Google Map API v2?

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 ?

31
Alexey Zakharov

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:

  • retourne la vue originale créée dans getView()
  • utilisez 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);
        }
    }
};
41
AZ13

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