1.在只有Activity的情况:
1)Touch事件触发流程:
class="brush:csharp;gutter:true;">首先触发dispatchTouchEvent 然后触发onUserInteraction 再次onTouchEvent 如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up) 触发dispatchTouchEvent 再次onTouchEvent 当ACTION_up事件时不会触发onUserInteraction(可查看源代码)
2)键盘事件触发流程
首先触发dispatchKeyEvent 然后触发onUserInteraction 再次onKeyDown 如果按下紧接着松开,则是俩步 紧跟着触发dispatchKeyEvent 然后触发onUserInteraction 再次onKeyUp 注意与触摸不同,当松开按键时onUserInteraction也会触发。
总之: Activity.dispatchTouchEvent(MotionEvent) - 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。(同理 dispatchKeyEvent)
2.Activity里有一个Layout,在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将不会被响应 但是如果你不写ONCLICK事件,而ONTOUCH事件返回FLASE
3.总结:
Android事件触发流程:
-------------------------------------------------------------------
首先触发ACTIVITY的dispatchTouchEvent
然后触发ACTIVITY的onUserInteraction
然后触发LAYOUT的dispatchTouchEvent
然后触发LAYOUT的onInterceptTouchEvent
-------------------------------------------------------------------