事件傳遞的順序:Activity
-> ViewGroup
-> View
Android事件分發機制主要由“事件分發”—>“事件攔截”—>“事件響應”這三步來進行邏輯控制的。
事件分發:public boolean dispatchTouchEvent(MotionEvent ev)
當監聽到有觸發事件時,首先由Activity進行捕獲,然後事件就進入事件分發的流程。Activity本身沒有事件攔截,從而將事件傳遞給最外層的View的dispatchTouchEvent(MotionEvent ev)方法,該方法將對事件進行分發。
return true : View消費所有事件。
return false :停止分發,交由上層控件的onTouchEvent方法進行消費,如果本層控件是Activity,那麼事件將被系統消費、處理。
super.dispatchTouchEvent(ev): 將事件交由本層的事件攔截onInterceptTouchEvent方法處理。
事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)
return true: 對事件攔截,交由本層的onTouchEvent進行處理。
return false: 不攔截,分發到子View,由子View的dispatchTouchEvent方法處理。
super.onInterceptTouchEvent(ev):默認表示事件攔截,交由本層的onTouchEvent進行處理。
事件響應:public boolean onTouchEvent(MotionEvent ev)
return true: 表示onTouchEvent處理完事件後消費了此次事件。
return false: 不響應事件,不斷的傳遞給上層的onTouchEvent方法處理,直到某個View的onTouchEvent返回true,則認爲該事件被消費。如果到最頂層View還是返回false,那麼該事件不消費,將交由Activity的onTouchEvent進行處理。
return: super.onTouchEvent,不響應事件,結果與return返回false一樣
TouchTestActivity----dispatchTouchEvent
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_DOWN
ChildLayout-----ACTION_DOWN
ParaentLayout---ACTION_DOWN
TouchTestActivity----ACTION_DOWN
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_MOVE
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_MOVE
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_MOVE
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_UP
沒有組件處理事件,固事件回傳給頂層父控件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_DOWN
ChildLayout-----ACTION_DOWN
ParaentLayout---ACTION_DOWN
fu控件攔截事件,但是沒有處理事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ParaentLayout---ACTION_DOWN
父控件攔截並處理事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ParaentLayout---ACTION_DOWN
ParaentLayout---dispatchTouchEvent
ParaentLayout---ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---ACTION_UP
子控件(viewGroup)攔截事件但不處理
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
ChildLayout-----ACTION_DOWN
ParaentLayout---ACTION_DOWN
子控件(viewGroup)攔截事件並且處理事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
ChildLayout-----ACTION_DOWN
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----ACTION_UP
子控件(View)分發事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
沒有進view的onTouchEvent
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_DOWN
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_UP
爲方便自己理解,所做的記錄。如有不妥,請大神提點。
參考於:https://blog.csdn.net/salmon_zhang/article/details/76746159 文章