Обнаружение жестов смахивания во фрагментах - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть фрагмент с видом, который содержит различные элементы. Некоторые кликабельны, некоторые нет. Я хотел бы вызвать функцию во фрагменте жестом смахивания.

Я создал класс onSwipeTouchListener (украденный из других потоков здесь в stackoverflow)

public class OnSwipeTouchListener implements View.OnTouchListener {

public final GestureDetector gestureDetector;

public OnSwipeTouchListener(Context context) {
    gestureDetector = new GestureDetector(context, new GestureListener());
}

public void onSwipeLeft() { }

public void onSwipeRight() { }

public boolean onTouch(View v, MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

    private static final int SWIPE_DISTANCE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float distanceX = e2.getX() - e1.getX();
        float distanceY = e2.getY() - e1.getY();
        if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
            if (distanceX > 0) {
                onSwipeRight();
            } else {
                onSwipeLeft();
            }
            return true;
        }
        return false;
    }
}

Во фрагменте в onViewCreated он добавляется как:

        view.setOnTouchListener(new OnSwipeTouchListener(getActivity()) {

        @Override
        public void onSwipeLeft() {
            changeDate(RIGHT);
        }

        @Override
        public void onSwipeRight() {
            changeDate(LEFT);
        }

    });

Это работает очень хорошо, пока не начнется смахивание ни на одном из элементов (активном или нет). Я хотел бы, чтобы смахивание работало независимо от того, где оно начинается.

В качестве альтернативы я попытался использовать onInterceptTouchEvent в layout / ViewGroup (сделал пользовательский класс макета). Это на самом деле работало довольно хорошо. Мне удалось перехватить смахивание (или ACTION_MOVE motionevents) до того, как они прибыли в дочернее представление, но, поскольку я хочу использовать жесты смахивания во фрагменте, его не слишком много для перехвата жестов в макете (или классе ViewGroup). ,

Какие-нибудь примеры того, как это делается правильно?

...