1、ViewGroup1的 onInterceptTouchEvent如果在ACTION_DOWN就返回true,
那么ViewGroup1的onInterceptTouchEvent的ACTION_MOVE、ACTION_UP, 都不会执行;
而是ViewGroup1的onTouchEvent的ACTION_DOWN将会响应;
如果ViewGroup1的onTouchEvent的ACTION_DOWN返回true,
那么ViewGroup1的onTouchEvent的ACTION_MOVE/ACTION_UP将会响应;
2、ViewGroup1的 onInterceptTouchEvent如果在ACTION_DOWN就返回false,
那么ViewGroup1的onInterceptTouchEvent的ACTION_MOVE/ACTION_UP, 就会被执行;
如果ViewGroup1的onInterceptTouchEvent的ACTION_MOVE/ACTION_UP返回true,
那么ViewGroup1的onTouchEvent的相对应的ACTION_MOVE/ACTION_UP将会响应;
如果ViewGroup1的onTouchEvent的ACTION_MOVE返回true,
那么ViewGroup1的onTouchEvent的ACTION_UP将会响应;
Example:activity里有一个LAYOUT,在布局里有个按钮。
如果在按钮上触发一个CLICK事件
首先触发ACTIVITY的dispatchTouchEvent
然后触发ACTIVITY的onUserInteraction
然后触发LAYOUT的dispatchTouchEvent
然后触发LAYOUT的onInterceptTouchEvent
然后触发BUTTON的onTouch(这是一个ACTION_DOWN事件)
紧跟着是一个ACTION_UP事件
触发ACTIVITY的dispatchTouchEvent
注意不再触发ACTIVITY的onUserInteraction,因为他对ACTION_UP不起作用。
然后触发LAYOUT的dispatchTouchEvent
然后触发LAYOUT的onInterceptTouchEvent
然后触发BUTTON的onTouch
最后触发BUTTON的onClick.
如果你在ONTOUCH事件里返回true,消费了此事件,那么ONCLICK将不会被响应
下面贴出 ViewGroup 的 onInterceptTouchEvent和onTouchEvent方法调用顺序。
另外 ,view是没有onInterceptTouchEvent方法的。
用一句话概括:自顶向下的事件分发与自底向上的事件响应机制。
下面介绍一下三个方法的区别:
1、dispatchTouchEvent作用:决定事件是否由onInterceptTouchEvent来拦截处理。
- 返回super.dispatchTouchEvent时,由onInterceptTouchEvent来决定事件的流向
- 返回false时,不会继续分发事件,自己内部只处理了ACTION_DOWN
- 返回true时,不会继续分发事件,自己内部处理了所有事件(ACTION_DOWN,ACTION_MOVE,ACTION_UP)
2、onInterceptTouchEvent作用:拦截事件,用来决定事件是否传向子View
- 返回true时,拦截后交给自己的onTouchEvent处理
- 返回false时,不拦截,交给子View来处理
3、onTouchEvent作用:事件最终到达这个方法
- 返回true时,内部处理所有的事件
- 返回false时,事件会向上传递,由onToucEvent来接受,如果最上面View中的onTouchEvent也返回false的话,那么事件就会消失。
测试案例:
ViewGroup里有一个View。
全部默认:
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onInterceptTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--dispatchTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--dispatchTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onInterceptTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--dispatchTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onTouchEvent:false
ViewGroup--onInterceptTouchEvent : true
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onInterceptTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--dispatchTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onInterceptTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onTouchEvent:false