View事件分發(fā)流程

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

  • 事件分發(fā):dispatchTouchEvent(),每個(gè)view只要事件能夠到達(dá),就會(huì)觸發(fā)這個(gè)方法,返回結(jié)果受當(dāng)前view的onTouchEvent的返回結(jié)果和下級(jí)View的dispatchTouchEvent的結(jié)果影響,結(jié)果表示是否消耗了當(dāng)前事件。
  • 事件攔截:onInterceptTouchEvent():在dispatchTouchEvent的處理中,處理是否攔截當(dāng)前的事件,如果攔截當(dāng)前的事件,就在當(dāng)前view中處理當(dāng)前的事件,結(jié)果表示是否攔截此事件。
  • 事件響應(yīng):onTouchEvent():如果當(dāng)前ViewGroup攔截了事件,或分發(fā)到當(dāng)前View中,會(huì)觸發(fā)此事件,結(jié)果表示是否消耗此事件。
  • 三者關(guān)系如下
//偽代碼
public boolean dispatchTouchEvent(MotionEvent ev)
{
    boolean consume = false;
    if (onInterceptTouchEvent(ev))
    {
        consume = onTouchEvent(ev);
    }
    else
    {
        consume = child.dispatchTouchEvent(ev);
    }

    return consume;
}

2,事件分發(fā)機(jī)制的一些總結(jié):

  • 某個(gè)View一旦開(kāi)始處理事件,但是沒(méi)有消耗ACTION_DOWN,該事件會(huì)重新交給父級(jí)元素處理。其它事件,則不會(huì)交給父級(jí)元素處理,事件直接結(jié)束。

  • ViewGroup默認(rèn)不攔截任何事件,View沒(méi)有onInterceptTouchEvent方法,一旦接收到事件,直接觸發(fā)onToucheEvent,且View默認(rèn)不消耗事件,除非它可點(diǎn)擊的。

  • onTouchEvent和onToucheListener,onClickListener,setTouchDelegate之間的關(guān)系:

    1. onTouchListener自定義了事件處理方法,它的優(yōu)先級(jí)最高,會(huì)先響應(yīng)它的方法。如果沒(méi)有定義,才會(huì)執(zhí)行系統(tǒng)的onTouchEvent的方法
    2. onClickListener是由多個(gè)onTouchEvent事件組成,所以它的觸發(fā)是最晚的,優(yōu)先級(jí)最低
    3. setTouchDelegate自定義的View的作用范圍,如果設(shè)置它,會(huì)優(yōu)先響應(yīng)它的onTouchEvent.
最后編輯于
?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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