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

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

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

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