原理饒口令:事件階段兩步走、向下分發、向上傳遞、分發可攔截、先分發,後傳遞,事件消費不傳遞
事件分發中重要的方法
- dispatchTouchEvent 分發事件(只要觸摸控件,就會調用控件的DispathTouchEvent方法)
- onInterceptTouchEvent 攔截事件
- OnTouch View類的抽象方法,讓調用者去setOntouchListener的時候實現的方法
- onTouchEvent View類自己的方法,複寫View的時候,自己去覆蓋父類的OnTouchEvent方法。
ViewGroup事件分發原理:
- 當點擊屏幕的時候,獲取手指在屏幕上的位置,然後調用當前Activity根佈局ViewGroup的dispatchTouchEvent方法。
- 判斷disallowIntercept(是否禁用掉攔截功能,默認false)或(!oninterceptTouchEvent(ev))爲true (事件攔截):分發階段
- 判斷當前手指的點是否位於ViewGroup的子結點上(View或ViewGroup),
- 如果是則調用子結點的DisaptchTouchEvent方法
(事件向子控件分發):分發階段
- 如果是則調用子結點的DisaptchTouchEvent方法
(事件向子控件分發):分發階段
- 判斷當前手指的點是否位於ViewGroup的子結點上(View或ViewGroup),
- 如果不是則調用自己父類(View)的DisapchTouchEvent方法,自己來消費當前事件,如果自己不消費當前事件,
則將事件傳遞至父控件進行處理,如果父控件也不處理,繼續向上傳遞。 :傳遞階段
代碼詳解
- 判斷disallowIntercept(是否禁用掉攔截功能,默認false)或(!oninterceptTouchEvent(ev))爲true (事件攔截):分發階段
View的事件分發處理:
- 當自己的DisaptchTouchEvent方法被調用的時候
如果OnTouch返回True,那麼就不會執行當前類的OnTouchEvent方法了。
如果當前方法返回true,表示消費掉當前的事件,那麼事件也就不會再向上傳遞了。 - OnTouchEvent詳解
事件分發有幾點需要理清楚的知識點:
- 事件分發中的View和ViewGroup區別。ViewGroup僅僅是負責事件分發的,和事件的傳遞。向子控件分發事件還是被傳遞從而調用自身(父類)的DispatchToucheEvent方法。
- 觸摸到了任何一個控件,就一定會調用該控件的dispatchTouchEvent方法
- 如果子控件dispatchTouchEvent一直返回false,表示不消費當前的事件,那麼之後事件會向上傳遞。
- touch事件的層級傳遞: 如果在執行ACTION_DOWN時返回false,後面一系列其它的action就不會執行。簡單的說:當dispatchTouchEvent時行事件分發的時候,只有前一個Action返回true。纔會觸發後一個Action。 下面是示意圖
FLY:以上是自己在學習的過程中所做的筆記,如果有錯誤的言論或者有沒說明白的歡迎評論。咱們共同學習、共同進步