OnFling проведите вверх также вызывает пролистывание влево или проведите вправо - PullRequest
0 голосов
/ 07 февраля 2019

В моем приложении для 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?

...