- 事件分發(fā)是這樣的:子View首先得到事件處理權,處理過程中,父View可以對其攔截,但是攔截了以后就無法再還給子View(本次手勢內(nèi))。
- NestedScrolling機制是這樣的:內(nèi)部View在滾動的時候,首先將dx,dy交給NestedScrollingParent,NestedScrollingParent可對其進行部分消耗,剩余的部分還給內(nèi)部View。
Android事件分發(fā)機制詳解與實戰(zhàn)剖析,一張事件分發(fā)流程圖,讓你徹底搞明白

image.png
1.同一個事件序列是指從手指接觸屏幕(ACTION_DOWN)的那一刻起,到手指離開屏幕(ACTION_UP)的那一刻結束,中間含不定數(shù)量的 ACTION_MOVE 事件。
2.某個 View 一旦決定攔截事件,那么這一個事件序列都只能由它處理,并且它的 onInterceptTouchEvent() 方法也不會再調(diào)用。換句話說,比如一個 ViewGroup 里面有數(shù)個子 View,一旦 ACTION_DOWN 事件從 Activity 傳到這個 ViewGroup 被其攔截,則后續(xù)的 MOVE 和 UP 等事件也不會傳遞到里面的子 View 中。
3.如果一個 View 一旦開始處理事件,如果它不消耗 ACTION_DOWN 事件,即 onTouchEvent()返回為 false,那么同一事件序列中的其他事件也不會再交給它處理,直接會調(diào)用其父 View 的 onTouchEvent()。
4.如果 View 不消耗除 ACTION_DOWN 以外的其他事件,那么這個點擊事件會消失,此時父元素的 onTouchEvent() 并不會被調(diào)用,并且當然 View 可以持續(xù)收到后續(xù)的事件,最終這些消失的點擊事件會傳遞給 Activity 處理。
5.ViewGroup 默認不攔截事件,View 沒有 onInterceptTouchEvent() 方法,一旦有事件傳遞給它,則直接會調(diào)用 onTouchEvent(),并且起默認都會消耗掉事件。除非它是不可點擊的(即 clickable 和 longClickable 均為 false)。View 的 longClickable 默認都為 false,而 clickable 分情況,比如 Button 默認為 true,TextView 默認為 false。
6.View 的 enable 屬性不會影響 onTouchEvent() 的默認返回值,哪怕一個 View 是 disable 狀態(tài)的,只要它的 clickable 或者 longClickable 有一個為 true,那么它的 onTouchEvent() 就會返回 true。
7.requestDisallowInterceptTouchEvent() 可以在子元素中干預父元素的事件分發(fā)過程,但是無法干預 ACTION_DOWN 事件。
8.事件優(yōu)先順序:
setOnTouchListener() => onTouchEvent() => onClickListener()
【轉】Android onTouch()和onTouchEvent()區(qū)別
事件處理之onTouchEvent()和onTouch()方法精煉詳解
Android NestedScrolling機制
Android NestedScrolling機制完全解析 帶你玩轉嵌套滑動
NestedScrolling事件機制源碼解析
事件分發(fā)不夠,NestedScrolling來湊
NestedScrolling詳解+示例
NestedScrolling機制(一)——概述
NestedScrolling機制(二)——實例
NestedScrolling機制(三)——機制本質(zhì)以及源碼解析
NestedScrolling機制(四)——最后一個例子