原文首發於微信公衆號:躬行之(jzman-blog),歡迎關注交流!微信
Android 事件分發機制是比較重要的一塊內容,總結一下 Android 事件分發的一些知識,計劃分爲四篇文章來寫,內容以下:函數
本篇是第一篇,但願從總體流程上敘述一下大體的分發過程,使讀者可以對事件分發有個初步的瞭解,內容以下:學習
Android 應用中的全部組件都繼承了 View 類,View 類是 Android 中全部 UI 組件的基類,View 有一個重要的子類是 ViewGroup,ViewGroup 一般做爲其餘 View 的容器使用,裏面能夠包含普通的 View,也能夠是其餘 ViewGroup,經過 View 與 Viewgroup 的這種關係共同構成了整個 View 樹的結構,如 LinearLayout 不只是一個 View ,仍是一個 ViewGroup,裏面能夠包含各類 View,固然這個 View 也能夠是 ViewGroup,以此類推。spa
在 Android 設備中,操做主要依靠的就是各類手勢,好比滑動、拖動、單擊等各類操做,這一系列操做能夠很方便的與 Android 設備進行交互,前面可知不一樣 View 處於不一樣的層級,問題來了,那麼當咱們操做的時候如何正確的讓特定的 View 響應某種操做呢,不一樣的 View 之間會不會發生滑動衝突呢,答案是確定的,解決這樣的問題就必須的充分了解 View 的工做機制、各類事件的分發過程以及具體的分發對象。cdn
Android 中事件分發的是 MotionEvent 對象,MotionEvent 中封裝了許多與各類事件發生位置相關的函數以及各類相關的事件類型,每一個 MotionEvent 都包含一系列動做,好比當手指觸摸屏幕的一瞬間,系統就會產生一系列的觸摸事件對象,每一個觸摸事件對象都表明這不一樣的動做,好比按下、滑動、擡起等動做,這些動做分別對應着 ACTION_DOWN、ACTION_MOVE、ACTION_UP 等具體的事件,這一系列事件通常是由 ACTION_DOWN 事件開始,中間若干 ACTION_MOVE 事件,最後以 ACTION_UP 結束,此外,若是事件被攔截還會觸發 ACTION_CANCEL 事件。總之,Android 事件分發的對象就是 MotionEvent 對象,當 MotionEvent 對象產生以後,系統會將這個事件分發給最終可以消費此事件的 View。對象
Android 中的事件分發實際上指的就是 View 的事件分發,View 的事件分發主要是下面三個方法:blog
這三個方法分別對應事件的分發、事件的攔截以及事件的處理,另外,View 沒有 interceptTouchEvent() 方法,一方面 View 裏面沒有其餘子 View 不須要攔截事件,另外一方面能夠理解爲 View 的 interceptTouchEvent() 方法返回 true,事件自己由該 View 攔截,消不消費是 onTouchEvent() 的事,反正,View 不考慮事件的攔截。繼承
Android 事件分發從 Activity 的 dispatchTouchEvent() 方法開始,經過一系列傳遞分發給 ViewGroup 的 dispatchTouchEvent() 方法,若是當前 ViewGroup 不攔截事件,則繼續向子 View 分發事件,而後以此類推直到被哪一個 View 處理,若是沒有任何 View 處理該事件,當事件由父 View 向子 View 傳遞到最深層次的 View 時,事件將向父 View 的方向回傳事件,最後交由 Activity 的 onTouchEvent() 進行處理。事件
若是當前 ViewGroup 攔截該事件,則事件不在向子 View 分發,而是調用其 onTouchEvent() 方法處理事件,固然事件是否處理主要看相應的 onTouchEvent() 方法的返回值,若是 onTouchEvent() 方法返回 true,表示事件就此消費,反之,返回 false 表示事件沒有被消費,將交由父 View 的 onTouchEvent() 方法進行處理,若是父 View 中一直沒有處理,則最後將交由 Activity 的 onTouchEvent() 進行處理。源碼
若是事件在分發過程當中被某個 View 處理了,好比說是 ACTION_DOWN 事件,當該事件被處理了,後面的 ACTION_MOVE、ACTION_UP 事件將由處理該事件的那個 View 直接接收,也就是說一旦某個事件被某個 View 處理了,後面的一系列事件不在判斷是否攔截這些事件,而是直接接收,由於一個完整的事件序列始終以 ACTION_DOWN 事件開始,而後若干 ACTION_MOVE 事件,最後以 ACTION_UP 結束。
Android 事件傳遞機制主要內容大體如上所述,但實際分發流程確定較爲複雜,下一篇將從源碼角度來看 Android 事件分發機制。 我的微信公衆號:jzman-blog 能夠一塊兒交流學習!