从 MotionEvent 中的不可滚动视图检测滚动

Detect Scroll from unScrollable View in MotionEvent

我正在使用一个滚动视图,它有一个滚动触发器,处于不可滚动状态,我想检测可能的滚动,但我不想滚动视图,而是想用这个值做其他事情。

@Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (!mScrollable) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    y = event.getY();

                case MotionEvent.ACTION_UP:
                    y = event.getY();

                case MotionEvent.ACTION_MOVE:
                    double newY = event.getY();
                    double difY = y - newY;
                    mCallbacks.onScrollChanged((int) difY, false, false);
                    y = newY;

            }
            return false;
        } else return super.onInterceptTouchEvent(event);
    }

此代码 return difY 为 0,如果情况 return 为真,则根本不会调用 ACTION_MOVE。

onInterceptTouchEvent 用于告诉 Android 框架您的视图对当前发生的触摸事件感兴趣,并希望继续接收有关它的更新,直到它结束。

要实际处理触摸,您应该重写 onTouchEvent,这是将继续接收触摸的回调,直到它被取消或 ACTION_UP

一个 quick/dirty 解决方法是 return 始终 trueonInterceptTouchEvent 上并将您当前的代码移动到 onTouchEvent。这种方式的优点是容易做到,缺点是它会阻止你所有的视图parentView接收触摸事件。

正确的做法是 return只有在您的视图检测到 difY != 0 之后才 return 为真 onInterceptTouchEvent,然后在 onTouchEvent[=20] 期间继续处理触摸=]