Потратив несколько часов на эту задачу, я наконец-то понял, что стало причиной проблемы. Я публикую ответ, чтобы другие могли получить пользу.
Это мой OnSwipeTouchListener
класс, который обнаруживает сенсорные события, используя GestureDetector
public class OnSwipeTouchListener implements View.OnTouchListener {
public final GestureDetector gestureDetector;
Context context;
private OnSwipeListener onSwipeListener;
OnSwipeTouchListener(Context ctx, View mainView, OnSwipeListener onSwipeListener ) {
gestureDetector = new GestureDetector(ctx, new GestureListener());
mainView.setOnTouchListener(this);
context = ctx;
this.constraintLayout=constraintLayout;
this.onSwipeListener = onSwipeListener;
}
float firstTouchX;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
default:
break;
}
return gestureDetector.onTouchEvent(event);
}
public class GestureListener extends
GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_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) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
result = true;
}
} else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
//onSwipeBottom();
} else {
//onSwipeTop();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
void onSwipeRight() {
//Toast.makeText(context, "Swiped Right", Toast.LENGTH_SHORT).show();
onSwipeListener.onRightwardsSwipe();
}
void onSwipeLeft() {
//Toast.makeText(context, "Swiped Left", Toast.LENGTH_SHORT).show();
onSwipeListener.onLeftwardsSwipe();
}
/* void onSwipeTop() {
//Toast.makeText(context, "Swiped Up", Toast.LENGTH_SHORT).show();
onSwipeListener.onRightwardsSwipe();
}
void onSwipeBottom() {
//Toast.makeText(context, "Swiped Down", Toast.LENGTH_SHORT).show();
onSwipeListener.onRightwardsSwipe();
}*/
}
Интерфейс для OnSwipeListener
, который вы можете реализовать в своей деятельности.
public interface OnSwipeListener
{
//public void onUpwardsSwipe();
//public void onDownwardsSwipe();
public void onLeftwardsSwipe();
public void onRightwardsSwipe();
}
Вы должны override
детектор жестов onTouchIntercept
в своей деятельности.
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
onSwipeTouchListener.gestureDetector.onTouchEvent(event);
// Be sure to call the superclass implementation
return super.dispatchTouchEvent(event);
}
теперь вы можете использовать OnSwipeTouchListener
для просмотра.
onSwipeTouchListener = new OnSwipeTouchListener(this, findViewById(R.id.nested_scroll_view), this);