事件分發機制簡單分析

事件傳遞的順序: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 文章

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章