解决RecyclerView中嵌套CoordinatorLayout的滑动冲突

可滚动控件嵌套,有可能导致滑动冲突。
项目中RecyclerView嵌套CoordinatorLayout,导致触摸事件被RecyclerView拦截。

下方代码仅在水平与垂直方向上判断手势方向,后续触摸动作依据第一次判断结果进行处理,继承CoordinatorLayout类,重写dispatchTouchEvent方法

    private float downX;
    private float downY;
    private boolean isDispatch;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        float removingX;//垂直方向移动距离
        float removingY;//水平方向移动距离

        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                downX=ev.getX();
                downY=ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                removingX = downX - ev.getX();
                removingY = downY - ev.getY();
                //第一次移动触点,且移动的距离大于10像素
                if(!isDispatch && Math.sqrt(removingX*removingX + removingY*removingY) > 10){
                    /*根据子控件是否拦截,以及移动方向(触点移动,X坐标可能变化,根据垂直方向距离与水平方向距离判断)判断是否拦截事件,
                    之后所有事件都按照本次判断结果处理*/
                    isDispatch = super.dispatchTouchEvent(ev) && Math.abs(removingY) > Math.abs(removingX);
                    //请求父控件不要拦截事件
                    getParent().requestDisallowInterceptTouchEvent(isDispatch);
                    return isDispatch;
                }
                break;
            case MotionEvent.ACTION_UP:
                //手指抬起后,清除本次触摸时间的拦截结果
                isDispatch=false;
                break;
        }

        return super.dispatchTouchEvent(ev);
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值