基礎(chǔ)概念
1、view中事件傳遞會調(diào)用的幾個方法

2、ViewGroup中事件傳遞會調(diào)用的幾個方法

3,事件指的是觸摸事件MotionEvent,而且事件有很多種,常見的有ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_CANCEL,ACTION_OUTSIDE等。
4、事件一般從Activity開始傳遞,然后傳遞到window,然后傳遞給頂級View,然后向下傳遞(子View)。
5、事件序列指的是以ACTION_DOWN作為開始,通常以ACTION_UP結(jié)束的一系列事件,當(dāng)ACTION_DOWN再次觸發(fā)的時候就是另外一個事件序列。
ViewGroup對事件的分發(fā)過程
1、如果當(dāng)前ViewGroup能夠收到事件,那么它的dispatchTouchEvent一定會被調(diào)用。如果你重寫這個方法,只要你沒有執(zhí)行這行代碼super.dispatchTouchEvent(ev),那么事件將不會向下傳遞,并且當(dāng)前ViewGroup的onInterceptTouchEvent和onTouchEvent都將不會被執(zhí)行。
2、在ViewGroup的super.dispatchTouchEvent(ev)這個方法中,會去決定是否攔截當(dāng)前的事件。

3、如果ACTION_DOWN被子View消耗過(成功處理過,onTouch或onTouchEvent返回true),那么在事件序列中的下一個事件里mFirstTouchTarget就會指向當(dāng)前子元素,因此mFirstTouchTarge!=null。如果此次事件ViewGroup的requestDisallowInterceptTouchEvent設(shè)置為true,那么disallowIntercept為true(默認為flase),此時可知,當(dāng)前ViewGroup的onInterceptTouchEvent不會被調(diào)用,且事件不會被攔截,子View會收到事件。
4、如果當(dāng)前事件是ACTION_DOWN,無論你是否設(shè)置requestDisallowInterceptTouchEvent,disallowIntercept必定為false,因為在事件為ACTION_DOWN時,都會重置狀態(tài)。那么可知,此時ViewGroup的onInterceptTouchEvent必定會調(diào)用,此時如果onInterceptTouchEvent返回true那么子view收不到事件,反之,則子view則會收到事件
5、如果當(dāng)ACTION_DOWN被ViewGroup攔截后,那么可知在此次事件序列接下來的事件中mFirstTouchTarget都會為null,那么可知此時ViewGroup的onInterceptTouchEvent不會被調(diào)用,intercepted=true即會攔截事件,子View不會收到事件
6、如果當(dāng)前ViewGroup處理當(dāng)前事件(子View沒有處理),而且onTouchEvent返回true,那么當(dāng)前ViewGroup將會消耗當(dāng)前事件,父元素的onTouchEvent將不會調(diào)用。
7、如果當(dāng)前ViewGroup處理當(dāng)前事件(子View沒有處理),你設(shè)置了onTouchListener,那么OnTouch事件將會被調(diào)用,如果返回true,當(dāng)前view的onTouchEvent不會被調(diào)用,且父元素的onTouchEvent也不會被調(diào)用。如果返回false,當(dāng)前view的onTouchEvent會被調(diào)用。
View的事件分發(fā)過程
1、如果當(dāng)前View能夠收到事件,那么它的dispatchTouchEvent一定會被調(diào)用。如果你重寫這個方法,只要你沒有執(zhí)行這行代碼super.dispatchTouchEvent(ev),那么事件將不會向下傳遞,并且當(dāng)前ViewGroup的onInterceptTouchEvent和onTouchEvent都將不會被執(zhí)行。
2、如果當(dāng)前View能夠收到事件,你設(shè)置了onTouchListener,那么OnTouch事件將會被調(diào)用,如果返回true,當(dāng)前view的onTouchEvent不會被調(diào)用,且父元素的onTouchEvent也不會被調(diào)用。如果返回false,當(dāng)前view的onTouchEvent會被調(diào)用。
3、如果當(dāng)前View能夠收到事件,而且onTouchEvent返回true,那么當(dāng)前View將會消耗當(dāng)前事件,父元素的onTouchEvent將不會調(diào)用。