View事件分发机制

  • android开发艺术探索内容
  • 主要就是三个方法
    • dispatchTouchEvent
    • onInterceptTouchEvent
    • onTuochEvent
    • -
  • dispatchTouchEvent(MotionEvent ev)

    用来进行 事件的分发, 如果事件能够传递给当前的view,此方法一定会调用,返回结果手当前view的onTuochEvent 和下级view的dispatchTouchEvent方法的影响,表示消耗当前的事件

  • onInterceptTouchEvent(MotionEvent ev)

    在上个方法的内部调用,用来判断是否需要 拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列中,此方法不会再次调用, 返回结果表示是否拦截当前事件

  • onTuochEvent(MotionEvent ev)
    在dispatchTouchEvent内部调用,用来处理 点击事件,返回结果表示是否消耗当前事件, 如果不消耗,则在同一个事件序列中, 当前view无法再次接受到事件
  • 如何用代码表示
 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean consume = false ;
        if (onInterceptTouchEvent(ev)){
            consume = onTouchEvent(ev);
        }else {
            consume = getChild().dispatchTouchEvent(ev);;
        }
        return consume ;
    }

点击事件开始:会先传递到 根布局–>dispatchTouchEvent –>onInterceptTouchEvent返回true ,该事件会由根布局处理–>onTouchEvent调用!
如果 根布局的onInterceptTouchEvent返回false –>该事件由它的子布局的dispatchTouchEvent 处理 内部在执行上面的操作…

  • 实际开发中
    • viewpager 嵌套viewpager
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean consume = false ;
             if (第一页向左滑 或者最后一页向右滑){
            consume = true; 
        }else{
            consume = false;
        }
        return consume;
    }

这时候可以重写最外一层viewpager的onInterceptTouchEvent()方法,在里面根据逻辑:如果里面的viewpager滑动到第一页向左滑 或者最后一页向右滑,这时就 return true,表示要由最外层的viewpager处理滑动事件,当里面的viewpager不再上面的情况,就返回false,由里面的viewpager自己处理滑动事件!

-

复杂的嵌套中,如果当前控件想获取事件

这时就调用下面的方法,getParent()表示得到当前控件的父类及父类的的父类…requestDisallowInterceptTouchEvent() 传入true表示都不要拦截我的这个事件!这个事件由当前控件自己处理!!!

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值