【Android開發坑系列】之事件分發機制

總結一下:html

  1. 事件序列的定義:從手觸摸屏幕(含)到離開屏幕(含)期間所發生的一系列交互事件。
    主要由ACTION_DOWNACTION_MOVEACTOIN_UP、ACTION_CANCEL等組成,其中一次事件序列中,DOWN和UP都只有最多一個,MOVE有若干個,能夠爲0個。
    定律:某個View只有將ACTION_DOWN處理(消費)掉,纔會有機會處理後面的ACTION_MOVE和ACTION_UP。

  2. 定律:正常狀況下,一個事件序列只能被一個View 攔截且消耗。 由於一旦一個元素攔截了某事件,那麼同一個事件序列內的全部事件都會直接交給它處理,所以同一個事件序列中的事件不能分別由兩個View同時處理。 可是經過特殊手段能夠作到,好比一個View將本該本身處理的事件經過 onTouchEvent 強行傳遞給其餘 View 處理。

  3. 事件分發中只有兩個主角:ViewGroup和View。
    ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個有關方法,View僅包含dispatchTouchEvent、onTouchEvent兩個有關方法。其中ViewGroup又繼承於View。
    ViewGroup 默認不攔截任何事件。Android 源 碼中 ViewGroup 的 onInterceptTouchEvent 方法默認返回 false。

  4. 事件傳遞的兩種方式:
    隧道方式:從根元素依次往下傳遞直到最內層子元素;
    冒泡方式:從最內層子元素依次往外傳遞直到根元素。
    dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,則上層再也不處理)。

  5. parent.requestDisallowInterceptTouchEvent(boolean)的做用:在子View中有機會告訴父View是否要攔截事件。
    注意:沒法經過調用該方法讓父View攔截ACTION_DOWN事件。

 

參考:spa

《Android開發藝術探索》
《Android - 事件模型》https://www.cnblogs.com/bill-joy/archive/2012/03/20/2407928.html htm

相關文章
相關標籤/搜索