首先,观看了以下两位大神的文章,获益匪浅,在此提供一下链接:
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
[Android应用]对GroupView中onInterceptTouchEvent方法的理解
而我个人关于Touch事件的理解:
android/frameworks/base/core/java/android/view/View.java
dispatchTouchEvent -> onTouch(setOnTouchListener) -> onTouchEvent
Android中touch事件的传递,先传递到ViewGroup,再传递到View
1. dispatchTouchEvent -- 事件分发的入口。会先判断onTouch结果,再判断onTouchEvent结果
onTouch返回true的话,dispatchTouchEvent return true
onTouch返回false的话,dispatchTouchEvent 与 onTouchEvent 返回值一致
2. 假如有设置OnTouchListener,onTouch就会执行;
onTouch返回false的话,onTouchEvent就会执行
onTouch返回true的话,touch事件相当于被消耗掉,onTouchEvent不会执行
3. 当View为Enabled和Clickable时,onTouchEvent就会进行Touch事件处理,并且返回true;否则返回false
在ViewGroup中,onTouchEvent默认返回false
在ACTION_UP事件中,假如有设置OnClickListener,就会执行onClick事件
-----------------------------------------------------------------------------------------------------
android/frameworks/base/core/java/android/view/ViewGroup.java
1. onInterceptTouchEvent -- ViewGroup用于拦截传递给子View的Touch事件
返回false,会处理子view的dispatchTouchEvent,接下来的每一个事件都会先传到onInterceptTouchEvent()
返回true,子view的时间被拦截,会继续处理ViewGroup的dispatchTouchEvent,onTouch 和 onTouchEvent
2. ViewGroup中重写了dispatchTouchEvent方法,具体源码分析如下
http://www.2cto.com/kf/201412/365603.html
仅仅通过概览性的官方文档是很难理解onInterceptTouchEvent函数的用途的,只有通过演绎这个抽象的规则,配以图文才能获取这个重要的知识。
很显然,默认是返回false,不做截获。
返回true之后,事件流的后端控件就没有机会处理touch事件了。
把默认的事件流中每个处理函数看作一个节点,这个节点只要返回true, 后续的事件就被截止了,这样想就很好理解。