View的事件體系全面分析

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

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

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

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