Scrollview中的滑动无法一直运行

时间:2015-11-04 04:22:21

标签: android scrollview gesturedetector

我有一个布局,其中我使用了ScrollView。 现在我还实现了' CustomScrollView'这样我就可以过滤滑动查看的操作。

这是我的自定义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次。

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

感谢。!!

1 个答案:

答案 0 :(得分:1)

也许onFling()未被调用的问题在于CustomScrollView有时也拦截水平手势/滚动?

我会尝试使用这个小类,这是为了更好地过滤掉水平手势,然后连接你的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);
    }
}

组合滚动视图和手势可能是一项艰巨的任务,需要对特定案例进行多次调整和调整。我非常肯定在过滤部分(因为它已在生产环境中进行过测试和测试),对手势检测器所在的部分不太确定,这需要进行测试。