[圖解]Android View的事件分發機制

[圖解]Android View的事件分發機制

在這裏插入圖片描述
圖中箭頭藍色代表事件向下傳遞的方向
橙色代表事件回傳的方向
綠色代表事件的處理方向
黃色代表類的關係
連線代表同一個對象

點擊事件的產生和事件序列

分析最普通最常用的一種情況,用戶點擊手機屏幕,會產生一個ACTION_DOWN事件,代表屏幕被摁下。同時,若手指移動,則會產生ACTION_MOVE事件,代表手指移動。最後,用戶手指離開屏幕,產生ACTION_UP事件,代表用戶手指離開屏幕。這就是點擊事件的產生。由於用戶在操作手機時,手指點擊後,一定會擡起。所以我們通常用ACTION_DOWN代表一個事件序列的開始,ACTION_UP代表一個事件序列的結束。在DOWN和UP之間,可以存在其他的不同點擊事件,而由這一系列點擊事件構成的有序事件組,叫做事件序列。

與事件分發有關的方法

1.onTouchEvent()和onTouch()

這兩個方法負責對攔截下來的事件進行處理。onTouchEvent()方法來自於View類中我們重寫的方法。onTouch()方法來自於我們在View類外部設置的觸摸監聽器(setOnTouchListener)中的接口onTouchListener中的方法。Android的事件分發的處理存在兩套事件處理過程,一個是內部的onTouchEvent()方法,一個是外部的onTouch()方法。且外部的方法優先級高於內部的方法,這樣設計的目的是方便開發者在類的外部對事件進行處理,以免類的內部過於臃腫。

2.onInterceptTouchEvent()

該方法負責對父級傳遞過來的事件進行攔截。若返回true,則攔截。若返回false,則不攔截。

3.dispatchTouchEvent()

該方法負責對事件進行向下分發,內部會調用onInterceptTouchEvent()方法,onTouchEvent()方法和onTouch()方法。若返回true,代表事件由自己處理。若返回false,代表向下分發。

事件分發流程

首先,用戶點擊屏幕產生點擊事件序列,每個點擊事件依次向下傳遞。
最開始會傳給Activity。一般情況下,Activity不會對事件進行攔截,而是直接傳給最頂級的view。
Activity內部的事件傳遞過程:最先傳給Window類的實現類PhoneWindow類,然後傳給DecorView類,最後傳給最頂級的View。
最頂級的View一般爲ViewGroup(內部有多個View),它首先會調用dispatchTouchEvent()方法對事件進行分發,內部會調用onInterceptTouchEvent()方法對事件進行攔截,若返回false,則不攔截並把事件傳給下一層的View。
最後,事件會被傳給最底層的View,它不需要對事件進行分發,只需要判斷是否處理事件。首先會判斷View是否在外部設置了TouchListener,若設置了,則執行接口onTouchListener中的onTouch()方法。若沒有設置,則會執行View類中的onTouchEvent()方法。同時,若onTouch()方法的返回值爲true,代表事件被消耗,若返回false,代表事件處理失敗,onTouch()方法對事件處理失敗時會調用onTouchEvent()方法進行處理。若onTouchEvent()方法也無法處理,則返回false。此時,代表當前的View無法處理該點擊事件,而由於當前的View爲最底層的view,事件無法向下分發,所以只能向上一層回傳。若在回傳過程中仍沒有被處理最後會被傳到最頂級的View。然後,最頂級的View將事件交給Activity來處理,通過調用Activity的onTouchEvent()方法來處理,最後完成事件的處理流程。

注意

一個事件序列由DOWN開始,UP結束。若一個View攔截了DOWN事件,則該事件序列中的其他事件都會交給該View來處理,直到事件序列結束。

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