View的事件體系全面分析

基礎(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)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容