Question Android: détection des gestes


Dans mon application, je tente de capturer un événement fling sur une vue (un ScrollView pour être exact, mais essayé avec LinearLayout ainsi que).

En définissant des points d'arrêt, je peux voir que le MotionEvents arriver correctement jusqu'au point où le onFling() devrait tirer.

Le flux d'événements est le suivant:

  1. Les vues onTouchEvent
  2. le OnGestureListener's onDown
  3. le OnGestureListener's onShowPress
  4. le OnGestureListener's onLongPress

Je ne sais pas comment essayer de déboguer quelque chose comme ça et la recherche sur Google ne se fait pas beaucoup. Des pointeurs?

Je joins également la vue pertinente qui devrait traiter les gestes:

import android.content.Context;
import android.content.Intent;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class GestureScrollView extends ScrollView {
    private static int MAJOR_MOVE = 60;
    private GestureDetector gd;

    public GestureScrollView(final Context context) {
        super(context);
        gd = new GestureDetector(context,
                new GestureDetector.OnGestureListener() {

                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        // TODO Auto-generated method stub
                        return false;
                    }

                    @Override
                    public void onShowPress(MotionEvent e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                            float distanceY) {
                        // TODO Auto-generated method stub
                        return false;
                    }

                    @Override
                    public void onLongPress(MotionEvent e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                            float velocityY) {
                        int dx = (int) (e2.getX() - e1.getX());
                        if (Math.abs(dx) > MAJOR_MOVE
                                && Math.abs(velocityX) > Math.abs(velocityY)) {
                            if (velocityX < 0) {
                                Intent intent = new Intent(context, Main.class);
                                context.startActivity(intent);
                            }
                        }
                        return false;
                    }

                    @Override
                    public boolean onDown(MotionEvent e) {
                        // TODO Auto-generated method stub
                        return false;
                    }
                });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gd.onTouchEvent(event);
    }
}

11
2017-12-15 21:40


origine


Réponses:


Prenez le MotionEvent à partir de l'activité pas de votre vue. Lorsque votre détecteur de mouvements est basé sur MotionEvent provenant de Activity, vous obtenez l'événement onFling. Donc, vous devez déplacer onTouchEvent () de votre GestureScrollView vers votre classe d'activité. Cordialement!


2
2017-12-16 14:25