У меня есть фрагмент с видом, который содержит различные элементы. Некоторые кликабельны, некоторые нет. Я хотел бы вызвать функцию во фрагменте жестом смахивания.
Я создал класс 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). ,
Какие-нибудь примеры того, как это делается правильно?