Android 事件分发过程(个人理解纯文字)

ViewGroup dispatchTouchEvent执行过程:
        1,先判断如果是down事件,会直接改变reset mGroupFlags 的值, disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0 为false,则根据intercepted = onInterceptTouchEvent的返回值。
        2,如果不是down事件,且判断子view是否拦消耗了(mFirstTouchTarget != null),如果没消耗,则不用执行onInterceptTouchEvent,拦截值 intercepted 直接等于true。
        3,如果不是down事件,且判断子view是否拦消耗了 (mFirstTouchTarget != null) ,如果被消耗且子View调用 getParent().requestDisallowInterceptTouchEvent(true) 使得子View上层的所有 ViewGroup 的 disallowIntercept = (mGroupFlags &FLAG_DISALLOW_INTERCEPT) != 0 为 true ,则子View上层的所有 ViewGroup不执行onInterceptTouchEvent,且所有intercepted值都直接为false。
4,如果不是down事件,且判断子view是否拦消耗了 (mFirstTouchTarget != null) ,如果被消耗,但 disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0 为 false , intercepted = onInterceptTouchEven。最后通过判断 如果满足 ! canceled(非取消事件) && !intercepted 事件就会传递给子view
一般来说intercepted = onInterceptTouchEven
1.如果是在onInterceptTouchEvent中返回true,则事件不会向下传递,直接进行onTouchEvent,若onTouchEvent的Down事件返回的是true,则事件消耗,后续(例如move,up)也会传递给view但不再运行onInterceptTouchEvent方法;若onTouchEvent的Down事件返回false,则后续(例如move,up)不会传递给view。
2.如果是在onInterceptTouchEvent中返回false,则事件继续向下传递,如果子view不消耗事件,即onTouchEvent的Down事件返回false,则事件又运行到onTouchEvent,
若onTouchEvent的Down事件返回的是true,则事件消耗,后续(例如move,up)也会传递给view但不再运行onInterceptTouchEvent方法(即上述dispatchTouchEvent执行过程第二点);若onTouchEvent的Down事件返回false,则后续(例如move,up)不会传递给view。
总结:如果某view一开始能接受到Down事件,并onTouchEvent返回true,则就能持续的接受后续事件(后续的返回值不影响事件消耗,同时此view是一个viewGroup,则此view的onInterceptTouchEvent方法不会再执行),并不再传递,但如果其父view在后续过程中在方法onInterceptTouchEvent中进行拦截,即返回true,则以后的后续事件(例如move,up)不会进入view的onTouchEvent,而是直接去了父view的onTouchEvent(后续的返回值依然不影响事件消耗),事件依然不再传递。
View dispatchTouchEvent执行过程:
如果设置onTouch监听,onTouch执行在onTouchEvent之前,如果Down事件返回false,则传递给onTouchEvent。
1,如果这个View可点击(Button或有onClick事件的其他View),且返回为super.onTouchEvent,就会执行到onClick事件,并且后续所有事件都能接收到。
2,如果这个View不可点击(非Button或无onClick事件的其他View),且返回为super.onTouchEvent,并且后续所有事件无法接收到。
3,如果这个View不可点击(非Button或无onClick事件的其他View),且返回值不为super.onTouchEvent,如果Down事件的返回值是自己设置的true(后续事件都能接收到)或false(后续事件无法接收到)。
如果Down事件返回true,不传给onTouchEvent,但后续事件继续接收。后续事件可以继续得到时,通过后续事件的返回值判断是否(false:进入,true:不进入)进入onTouchEvent。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值