總結一下:html
- 事件序列的定義:從手觸摸屏幕(含)到離開屏幕(含)期間所發生的一系列交互事件。
主要由ACTION_DOWN、ACTION_MOVE、ACTOIN_UP、ACTION_CANCEL等組成,其中一次事件序列中,DOWN和UP都只有最多一個,MOVE有若干個,能夠爲0個。
定律:某個View只有將ACTION_DOWN處理(消費)掉,纔會有機會處理後面的ACTION_MOVE和ACTION_UP。
- 定律:正常狀況下,一個事件序列只能被一個View 攔截且消耗。 由於一旦一個元素攔截了某事件,那麼同一個事件序列內的全部事件都會直接交給它處理,所以同一個事件序列中的事件不能分別由兩個View同時處理。 可是經過特殊手段能夠作到,好比一個View將本該本身處理的事件經過 onTouchEvent 強行傳遞給其餘 View 處理。
- 事件分發中只有兩個主角:ViewGroup和View。
ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個有關方法,View僅包含dispatchTouchEvent、onTouchEvent兩個有關方法。其中ViewGroup又繼承於View。
ViewGroup 默認不攔截任何事件。Android 源 碼中 ViewGroup 的 onInterceptTouchEvent 方法默認返回 false。
- 事件傳遞的兩種方式:
隧道方式:從根元素依次往下傳遞直到最內層子元素;
冒泡方式:從最內層子元素依次往外傳遞直到根元素。
dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,則上層再也不處理)。
- parent.requestDisallowInterceptTouchEvent(boolean)的做用:在子View中有機會告訴父View是否要攔截事件。
注意:沒法經過調用該方法讓父View攔截ACTION_DOWN事件。
參考:spa
《Android開發藝術探索》
《Android - 事件模型》https://www.cnblogs.com/bill-joy/archive/2012/03/20/2407928.html htm