Android Activity 和 ViewGroup中事件觸發和傳遞機制,androidviewgroup
1.在只有Activity的情況:
1)Touch事件觸發流程:
首先觸發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
-------------------------------------------------------------------