В моем приложении для Android я использую onFling()
метод onTouchListener
SimpleOnGestureListener
для обнаружения пролистывания влево, вверх, вправо, вниз.
Проблема в том, когда я провожувверх он также вызывает пролистывание влево или вправо.
Я пытался поиграть со значением SWIPE_THRESHOLD
, но это не имело значения, даже когда я увеличил его до 5000
с 50
.
Как я могу убедиться, что при смахивании вверх будет выполняться только свайп вверх.
public class OnSwipeTouchListener implements OnTouchListener
{
public static final int SWIPE_THRESHOLD = 50;
public static final int SWIPE_VELOCITY_THRESHOLD = 50;
protected GestureDetector gestureDetector;
final int IDLE = 0;
final int TOUCH = 1;
final int PINCH = 2;
int touchState;
double dist0, distCurrent;
private Context CONTEXT;
public OnSwipeTouchListener(Context ctx)
{
gestureDetector = new GestureDetector(ctx, new GestureListener());
CONTEXT = ctx;
}
public OnSwipeTouchListener() {
}
public void onSwipeRight()
{
}
public void onSwipeLeft()
{
}
public void onSwipeTop(float diffY)
{
}
public void onSwipeBottom(float diffY)
{
}
public void onDoubleTap(){
}
// public abstract void onSwipeRight();
//
// public abstract void onSwipeLeft() ;
//
// public abstract void onSwipeTop(double diff) ;
//
// public abstract void onSwipeBottom(double diff);
//
// public abstract void onPinch(double distCurrent) ;
@Override
public boolean onTouch(View v, MotionEvent event)
{
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends SimpleOnGestureListener
{
@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(diffY);
}
else
{
onSwipeTop(diffY);
}
result = true;
}
}
catch(Exception exception)
{
exception.printStackTrace();
}
return result;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
OnSwipeTouchListener.this.onDoubleTap();
return super.onDoubleTap(e);
}
}
}
РЕДАКТИРОВАТЬ: я хочу достичь, когда пользователь смахивает вверх, а затем проведите пальцем влево или вправо не долженменя уволили / вызвали (которые вызываются прямо сейчас, когда я провожу вверх)огонь swipeLeft()
или swipeRight()
, когда я swipeTop()
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
{
boolean result = false;
try
{
if(Math.abs(velocityX) > Math.abs(velocityY)){
//Horizontal Swipe
if(velocityX < 0){
//Swipe Left
onSwipeLeft();
result = true;
}
else if(velocityX > 0){
//Swipe Right
onSwipeRight();
result = true;
}
}
else if(Math.abs(velocityY) > Math.abs(velocityX)){
//Vertical Swipe
if(velocityY < 0){
//Swipe Top
onSwipeTop(Math.abs(e1.getY() - e2.getY()));
result = true;
}
else if(velocityY > 0){
//Swipe Bottom
onSwipeBottom(Math.abs(e1.getY() - e2.getY()));
result = true;
}
}
}
catch(Exception exception)
{
exception.printStackTrace();
}
return result;
}
Теперь вот проблема.Я использую библиотеку https://github.com/lsjwzh/RecyclerViewPager
и устанавливаю onTouchListener
с GestureDetector
с помощью вышеуказанного onFling()
метода.Несмотря на то, что я установил пользовательский onTouchListener
, кажется, RecyclerViewPager
, похоже, получает команды / жесты прокрутки после пользовательского метода onFling()
.
Я попытался установить recyclerViewPager.setOnFlingListener(null)
, но это не сработало.Как отключить жесты, передаваемые в recyclerViewPager после установки настраиваемого onTouchListener?