View滑动冲突处理方法(外部拦截法、内部拦截法)

1、外部拦截法 (子view代码无需修改)(符合view事件分发机制)

说明:需要在父ViewGroup,重写onInterceptTouchEvent方法,根据业务需要,判断哪些事件是父Viewgroup需要的,需要的话就对该事件进行拦截,然后交由onTouchEvent方法处理,若不需要,则不拦截,然后传递给子view或子viewGroup,

代码:
public boolean onInterceptTouchEvent(MotionEvent ev) {
    int y= (int) ev.getY();
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            yDown=y;
            isIntercept=false;
            break;
        case MotionEvent.ACTION_MOVE:
            yMove=y;
            if (yMove-yDown<0){                    //根据业务需求更改判断条件,判断是时候需要拦截
                isIntercept=false;
            }else if(yMove-yDown>0&&getChildAt(0).getScrollY()==0){
                isIntercept=true;
            }else if(yMove-yDown>0&&getChildAt(0).getScrollY()>0){
                isIntercept=false;
            }
            break;
        case MotionEvent.ACTION_UP:
            isIntercept=false;
            break;
    }
    return isIntercept;         //返回true表示拦截,返回false表示不拦截
}

2、内部拦截法(父viewgroup需要重写onInterceptTouchEvent)(不符合view事件分发机制)

说明:顾名思义就是在子view中拦截事件,父viewGroup默认是不拦截任何事件的,所以,当事件传递到子view时,
子view根据自己的实际情况来,如果该事件是需要子view来处理的,那么子view就自己消耗处理,如果该事件不需要由子view来处理,那么就调用getParent().requestDisallowInterceptTouchEvent()方法来通知父viewgroup来拦截
这个事件,也就是说,叫父容器来处理这个事件,这刚好和view的分发机制相反。

代码:    **(需要注意,要确保MotionEvent.ACTION_DOWN时不拦截)**

//子view的代码·
public boolean dispatchTouchEvent(MotionEvent ev) {
    int y= (int) ev.getY();
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            getParent().requestDisallowInterceptTouchEvent(true);
            yDown=y;
            break;
        case MotionEvent.ACTION_MOVE:
            yMove=y;
            Log.e("mes",yMove+"!!!");
            int scrollY = getScrollY();
            if (scrollY == 0&&yMove-yDown>0) {    //根据业务需求判断是否需要通知父viewgroup来拦截处理该事件
                //允许父View进行事件拦截
                Log.e("mes",yMove-yDown+"拦截");
                getParent().requestDisallowInterceptTouchEvent(false);
            }
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return super.dispatchTouchEvent(ev);
}
//父viewgroup代码     (要确保down是不拦截,move和up时要拦截)
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if(ev.getAction()==MotionEvent.ACTION_DOWN){
        return false;
    }else{
        return true;
    }
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值