ViewGrop 滑动与 子View点击事件冲突解决办法

横向滑动的ViewGroup中做如下操作

    private boolean mScrolling;
    private float touchDownX;
    private float touchDownY;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDownX = event.getX();
                touchDownY = event.getY();
                mScrolling = false;
                break;
            case MotionEvent.ACTION_MOVE:
                int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
                if (Math.abs(touchDownX - event.getX()) >= slop || Math.abs(touchDownY - event.getY()) >= slop) {
                    mScrolling = true;
                } else {
                    mScrolling = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                mScrolling = false;
                break;
        }
        return mScrolling;
    }

    private float x2 = 0;
    private float y2 = 0;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return true;
            case MotionEvent.ACTION_UP:
                x2 = event.getX();
                y2 = event.getY();

                float slop = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, getResources().getDisplayMetrics());

                // swipe left
                if (touchDownX - x2 > slop) {
                    // TODO 左滑操作
                }
                // swipe right
                if (touchDownX - x2 < -slop) {
                    // TODO 右滑操作
                }
                break;
        }

        return super.onTouchEvent(event);
    }

或者

    private boolean mScrolling;
    private float touchDownX;
    private float touchDownY;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDownX = event.getX();
                touchDownY = event.getY();
                mScrolling = false;
                break;
            case MotionEvent.ACTION_MOVE:
                int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
                if (Math.abs(touchDownX - event.getX()) >= slop || Math.abs(touchDownY - event.getY()) >= slop) {
                    mScrolling = true;
                } else {
                    mScrolling = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                mScrolling = false;
                break;
        }
        return mScrolling;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return true;
            case MotionEvent.ACTION_UP:
                int deltaX = (int) (event.getX() - touchDownX);
                int deltaY = (int) (event.getY() - touchDownY);
                int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
                if (Math.abs(deltaX) > slop) {
                    // swipe left
                    if (deltaX < -Math.abs(deltaY) * 2) {
                        // TODO 左滑操作
                    }
                    // swipe right
                    if (deltaX >= Math.abs(deltaY) * 2) {
                        // TODO 右滑操作
                    }
                }
                break;
        }

        return super.onTouchEvent(event);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值