在 Scrollview 中滑动并非一直有效

Swipe in Scrollview is not working all time

我使用了一种布局 ScrollView。 现在我还实现了 'CustomScrollView' 以便我可以过滤 Swipe 视图的操作。

这是我的自定义 ScrollView :

public class CustomScrollView extends ScrollView {
    private GestureDetector mGestureDetector;

    public CustomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, new YScrollDetector());
        setFadingEdgeLength(0);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
    }

    // Return false if we're scrolling in the x direction
    class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return Math.abs(distanceY) > Math.abs(distanceX);
        }
    }
}

现在我也实现了GestureDetector。 在滑动视图时将调用 onFling 80/100 次。

我可以提出一些建议,以便我可以实施更准确的 滑动 行为吗?

谢谢。!!

也许onFling()没有被调用的问题在于CustomScrollView有时也会截取水平gestures/scrolling?

我会尝试使用这个小 class,它可以更好地过滤掉水平手势,然后连接你的 GestureDetector:

public class CustomScrollView extends ScrollView {

    private GestureDetector mGestureDetector;

    private float mHorizontalDistance;
    private float mVerticalDistance;
    private float mPreviousX;
    private float mPreviousY;

    @Override
    public boolean onInterceptTouchEvent(@NonNull MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mHorizontalDistance = mVerticalDistance = 0f;
            mPreviousX = ev.getX();
            mPreviousY = ev.getY();
            mGestureDetector.onTouchEvent(ev);
            break;
        case MotionEvent.ACTION_MOVE:
            final float curX = ev.getX();
            final float curY = ev.getY();
            mHorizontalDistance += Math.abs(curX - mPreviousX);
            mVerticalDistance += Math.abs(curY - mPreviousY);
            mPreviousX = curX;
            mPreviousY = curY;
            if (mHorizontalDistance > mVerticalDistance) {
                mGestureDetector.onTouchEvent(ev);
                return false;
            }
        }

        return super.onInterceptTouchEvent(ev);
    }
}

组合滚动视图和手势可能是一项艰巨的任务,需要针对特定​​情况进行多次微调和调整。过滤部分我比较确定(因为已经在生产环境试过了),手势检测器进来的部分不太确定,这个需要测试。