上一篇,我们大体理解了Intercept拦截
而之前 也了解了 分发的过程,
和简单点击,分析了执行顺序
具体代码可以见https://github.com/2954722256/demo_event
这篇简单理解下 消费(本篇应该不难,主要是理解)
回顾
前面,我们有说过,
如果我们点击一个View,会dispatchTouchEvent到对应的View
这个时候,就消费掉了, 不会回传
如果我们点击一个ViewGroup,会dispatchTouchEvent到对应的ViewGroup
这个时候,不会被消费,会回传
那么,会不会有点击一个 ViewGroup的时候,不回传的时候呢?
也就在ViewGroup消费呢?
我们试试
代码
还是之前拦截的代码
给ViewGroup添加点击事件
点击 自定义的EventButton
可以发现对应的过程
MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
EventViewGroup ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- LL setOnTouchListener onTouch ----> ACTION_DOWN ----> noMsg
EventViewGroup ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- LL setOnClickListener onClick ----> nullEvent ----> noMsg
我们可以发现,此时ViewGroup也没有回传
对应的点击执行顺序 和 View 类似, 到对应的Touch之后, 到最后的 onClick, 都没有回传了
给ViewGroup添中的ViewGroup添加点击事件
点击 自定义的TouchEventChilds
可以发现对应的过程
MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventFather ---- onInterceptTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- onInterceptTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- childs setOnTouchListener onTouch ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- childs setOnClickListener onClick ----> nullEvent ----> noMsg
我们可以发现 和前面差不多
对应的点击执行顺序 和 View 类似, 到对应的Touch之后, 到最后的 onClick, 都没有回传了
ViewGroup添加点击事件,但点击里面的Button
点击 自定义的TouchEventChild2的Button
可以发现对应的过程
MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventFather ---- onInterceptTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- onInterceptTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds2 ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds2 ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
我们可以发现 和前面差不多
对应的点击执行顺序 和 View 类似, 到对应的Touch之后, 都没有回传了
但是没有执行ViewGroup的TouchEvent和ClickListener等操作
简单小结
大体可以发现
· 我们点击是先通过 dispatchTouchEvent 传到点击的控件后, 再回传判断 Touch或者Click操作的。
如果回传的过程中,有多个可以消费的地方, 在离回传最近的地方进行消费
后面的控件获得不到监听
添加 onInterceptTouchEvent拦截
这个时候, 如果我们在Child上面,添加拦截
再点击Child2
MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventFather ---- onInterceptTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- onInterceptTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- childs setOnTouchListener onTouch ----> ACTION_DOWN ----> noMsg
TouchEventChilds ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- childs setOnClickListener onClick ----> nullEvent ----> noMsg
我们可以发现,被拦截以后,就不会继续向下 dispatchTouchEvent了,
这时候,Child的消费是最近的,所以会响应Child对应的Touch和Click相关的事件
下一篇我们可以了解dispatchTouchEvent事件分发浅析(六)MOVE/UP