View的事件分發機制總結

事件分發機制是指系統對用戶手指接觸屏幕時所產生的一系列MotionEvent對象在View的層級中如何傳遞所制定的機制。

1.MotionEvent

MotionEvent是一個類,Android將輸入事件都生成了 MotionEvent對象。主要有這幾種事件類型:

類型 說明
ACTION_DOWN 代表手指剛接觸屏幕
ACTION_MOVE 代表手指在屏幕上移動
ACTION_UP 代表手指剛從屏幕鬆開
ACTION_CANCEL 代表事件序列結束(一般爲父view攔截事件)

 

 

 

 

 

 

還有一些與多指觸碰有關的這裏不展開討論。

 

2.事件序列

 從手指觸摸到屏幕開始直到手指離開屏幕所產生的​一系列事件叫做同一事件序列。一個完整的事件序列,一般是以DOWNk開始,以UP結束,當然也有以CANCEL結束的,中間可能有多個MOVE。當一個View處理某個事件時,這個事件序列的後序事件都會直接傳給此view。

3.分發流程

   與分發過程有關的3個方法:

   ①dispatchTouchEvent(MotionEvent ev) ——進行事件分發

   ②onInterceptTouchEvent(MotionEvent ev)——進行事件攔截,viewGroup才擁有此方法,在dispatchTouchEvent()方法中調用

   ③onTouchEvent(MotionEvent ev)——進行點擊事件處理,在dispatchTouchEvent()方法中調用

 分發過程:

    1.當事件產生時,首先傳遞給activity,我們知道activity加載時先添加phoneWindow,phoneWindow又會添加DecorView,所以DecorView爲activity的根view,事件處理工作最後交給DecorView,而DecorView又將事件處理交給根viewGroup,調用根vewGroup的dispatchTouchEvent方法。

    2.在此方法中,首先判斷事件是否爲down事件,是的話進行一些初始化工作(將上次事件序列的狀態清空)。接着進行一個判斷語句,如果事件爲down事件或者mFirstTouchTarget不爲空,則進行if語句,否則直接將攔截標誌位設爲true,表示viewGroup攔截此事件。mFirstTouchTarget表示的是上個事件的處理者,如果爲空則表示沒有處理者。所以這個判斷語句表示如果是down事件,是一個事件序列的開始,應該詢問子view是否處理,如果是其他事件並且mFirstTouchTarget爲空,沒人處理上個事件,則子view中沒人處理,由viewGroup直接攔截處理。

   3.在判斷語句中,先得到disallowIntercept的值,這個標誌位表示子view是否允許父view攔截除down之外事件,子view可通過調用requestDisallowInterceptTouchEvent來設置。爲false的話表示不允許,直接將攔截標誌位設爲false。爲true的話,表示允許,將調用viewGroup的onInterceptTouchEvent(),根據此方法的返回值設置攔截標誌位,默認爲false,有需要時需重寫此方法。

  4.如果viewGroup不攔截事件,則需遍歷子view,判斷子view是否能夠接收事件,如能接收則交給子view。遍歷子view爲倒序遍歷,則從最上層子view開始,判斷條件爲觸摸點位置是否在子view範圍內,或者子view是否在播放動畫,均不符合則遍歷下一個。最終如果由子view符合條件則調用子view的dispatchTouchEvent()方法,沒有的話則調用super.dispatchTouchEvent()方法。viewGroup繼承於View,所以調用的是View的dispatchTouchEvent方法。

  5.在View的dispatchTouchEvent()方法中,如果onTouchListener不爲空並且onTouch()方法返回true則表示事件被消費,不會再執行onTouchEvent()方法。在onTouchEvent()方法中,只要View的CLICKABLE和LONG_CLICKABLE有一個爲true,那麼OnTouchEvent()方法就會返回true消費此事件。如果View設置了點擊事件OnClickListener,那麼就會執行onClick方法。如果子view的dispatchTouchEvent()方法返回false,則會調用父view的onTouchEvent()方法。

    

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