Android dispatchTouchEvent 事件分發學習總結


前段時間做一個需求,涉及一些Android事件分發的內容,所以趁此機會,認真學了一下,以下是一些總結。

dispatchTouchEvent函數在Activity,View 和ViewGroup中都有定義,並且處理的邏輯也是不同的。

Activity:
當發生點擊事件后,最先響應的是Activity的dispatchTouchEvent()函數,Activity會把TouchEvent傳給自身綁定的rootView(一般就是DecorView),由rootView進行處理。
如果TouchEvent一直沒有消費掉,最后會調用Activity的onTouchEvent()函數來處理事件。

ViewGroup:
ViewGroup運行dispatchTouchEvent()函數時,首先會調用onInterceptTouchEvent()函數,這是個攔截函數,如果需要攔截子View的點擊事件,可以在這里添加一些邏輯;默認返回值是false,此時會按照添加子View時的順序將事件分發給各個子View,由各個子View處理事件;如果添加了攔截的邏輯,返回值為true的話,會給各個子View發送Action_Cancel指令,並且所有事件都變為已處理。
子View處理事件時邏輯類似,如果是ViewGroup則繼續分發,如果是View的話,則執行View的邏輯。

View:
View處理事件時先看是否有onTouchListener,如果有的話,優先執行onTouchListener的onTouch函數,如果沒有處理,則執行onTouchEvent函數。
ViewGroup本質也是View,子view都沒消費事件的話,也會走View的邏輯。

 

當子view不想被攔截時可以通過requestDisallowInterceptTouchEvent(true)函數來阻止攔截。

下面是整體的一張流程圖,要比文字更清晰一點:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM