ViewGroup事件分發(fā)機(jī)制

方法1:

public boolean dispatchTouchEvent(MotionEvent ev)

????該方法用來進(jìn)行事件的分發(fā),即無論ViewGroup或者View的事件,都是從這個方法開始的。

方法2:

public boolean onInterceptTouchEvent (MotionEvent ev)

????在方法1內(nèi)部調(diào)用,表示是否攔截當(dāng)前事件。默認(rèn)不攔截。

????如果攔截了事件,那么將不會分發(fā)給子View。

方法3:

public boolean onTouchEvent(MotionEvent ev)

????在方法1內(nèi)部調(diào)用,表示是否對事件進(jìn)行處理。


????以上三個方法非常重要,它們的關(guān)系可以用如下偽代碼呈現(xiàn):

public boolean dispatchTouchEvent(MotionEvent ev){

????boolean handle =false;

if(onInterceptTouchEvent(ev)){

? ? ? ? handle = onTouchEvent(ev);

}else{

? ? ? ? handle = child.dispatchTouchEvent(ev);

? ? }

return handle;

詳細(xì):

if (actionMasked == MotionEvent.ACTION_DOWN) {

? ? cancelAndClearTouchTargets(ev);

? ? resetTouchState();

}

首先這里先判斷事件是否為DOWN事件,如果是,則初始化,由于一個完整的事件序列是以DOWN開始,以UP結(jié)束,所以如果是DOWN事件,那么說明是一個新的事件序列,所以需要初始化之前的狀態(tài)。

mFirstTouchTarget =null;

mFirstTouchTarget 最終指向消耗事件的View,如果都不消耗,那么最后事件會交由Activity處理。

onTouch() 方法的返回值決定了 onTouchEvent() 方法要不要執(zhí)行,如果 onTouch() 返回 true,則 onTouchEvent() 不會再執(zhí)行,返回 false ,則 onTouchEvent() 繼續(xù)執(zhí)行,而 onClick() 的回調(diào)是在 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)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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