Android: обнаружение жестов

В моем приложении я пытаюсь захватить событие fling на виде (a ScrollView, если быть точным, но попытался с помощью LinearLayout).

Установив точки останова, я вижу, что MotionEvents выполняется правильно до точки, в которой должен срабатывать onFling().

Поток событий выглядит следующим образом:

  • Вид onTouchEvent
  • OnGestureListener onDown
  • OnGestureListener onShowPress
  • OnGestureListener onLongPress

Я в недоумении о том, как продолжать отлаживать что-то подобное, и поиск в Google не сильно повышается. Любые указатели?

Я также прикрепляю соответствующее представление, которое должно обрабатывать жесты:

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

Ответ 1

Возьмите MotionEvent из Activity не из вашего представления. Когда ваш детектор Gesture основан на MotionEvent, который поступает из Activity, вы получите событие onFling. Поэтому вам нужно переместить onTouchEvent() из GestureScrollView в класс Activity. Привет!