【问题标题】:Android viewpager - detect swipe directionAndroid viewpager - 检测滑动方向
【发布时间】:2014-06-22 21:43:32
【问题描述】:

我在 Android 中使用 viewpager,想控制用户滑动页面的方式。

我正在使用此代码来检测滑动的方向:

// Detects the direction of swipe. Right or left. 
// Returns true if swipe is in right direction
public boolean detectSwipeToRight(MotionEvent event){

 int initialXValue = 0; // as we have to detect swipe to right
 final int SWIPE_THRESHOLD = 100; // detect swipe
 boolean result = false;

        try {                
            float diffX = event.getX() - initialXValue;

                if (Math.abs(diffX) > SWIPE_THRESHOLD ) {
                    if (diffX > 0) {

                        // swipe from left to right detected ie.SwipeRight
                        result = false;
                    } else {

                        Log.e("swipeToLeft", "swipeToLeft");
                        result = true;
                    }
                }
            } 
         catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }

然而,此代码总是返回“false”。必须对代码进行哪些更改才能正常工作?

【问题讨论】:

  • 你在手势检测监听器中使用这个方法吗?
  • @mapo 不,我在我的自定义类的 onInterceptTouchEvent(MotionEvent event) 方法中使用它,它从 viewpager 扩展而来。

标签: android android-viewpager swipe


【解决方案1】:

考虑到您始终将起点初始化为 0,您的代码总是返回 false 似乎是正确的

int initialXValue = 0;

我认为您必须检测滑动动作的起点,而不仅仅是管理与您的终点相关的事件。

你必须考虑两个不同的变量。

int downX; //initialized at the start of the swipe action
int upX; //initialized at the end of the swipe action

buttonIcons.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(final View v, final MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = event.getX();

                return true;

            case MotionEvent.ACTION_UP:

                upX = event.getX();
                final float deltaX = downX - upX;

                if (deltaX > 0 && deltaX > SWIPE_MIN_DISTANCE) {

                  //DETECTED SWIPE TO RIGHT

                }
                if (deltaX < 0 && -deltaX > SWIPE_MIN_DISTANCE) {

                   //DETECTED SWIPE TO LEFT

                }
                return true;

            }

            return false;
        }
    });
}

【讨论】:

  • 但是 SWIPE_MIN_DISTANCE 的值是多少?
  • SWIPE_MIN_DISTANCE 是您决定检测有效滑动(而不仅仅是触摸)所必需的阈值。例如,在原始问题中 deimos1988 使用了一个名为 SWIPE_THRESHOLD 的变量,其值为 100。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2014-09-03
  • 2011-07-23
  • 1970-01-01
  • 2017-10-18
相关资源
最近更新 更多