Android事件分發(fā)及源碼分析

1.touch事件
一個(gè)事件總是以ACTION_DOWN作為開(kāi)始,在手勢(shì)移動(dòng)過(guò)程中會(huì)重復(fù)產(chǎn)生多個(gè)ACTION_MOVE事件,用戶操作結(jié)束事件的標(biāo)志為ACTION_UP,而意外終止事件則會(huì)觸發(fā)ACTION_CANCEL。通常ACTION_DOWN的分發(fā)最重要。
2.三個(gè)主要相關(guān)方法

dispatchTouchEvent(MotionEvent ev)
onInterceptTouchEvent(MotionEvent ev)
onTouchEvent(MotionEvent event)

ViewGroup中這三個(gè)方法之間關(guān)系的偽代碼如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean consume = false;
    if (onInterceptTouchEvent(ev)) {
        consume = onTouchEvent(ev);
    } else {
        consume = child.dispatchTouchEvent(ev);
    }
    return consume;
}

View 沒(méi)有onInterceptTouchEvent,所以一般view調(diào)用dispatchTouchEvent后就調(diào)用onTouchEvent
我們看這個(gè)dispatchTouchEvent的偽代碼:
1.onInterceptTouchEvent(ev)默認(rèn)返回false,所以通常ViewGroup會(huì)往子元素分發(fā),除非你在onInterceptTouchEvent返回true表示攔截,然后會(huì)調(diào)用onTouchEvent
2.而onTouchEvent默認(rèn)返回true,消費(fèi)掉。
3.只能一個(gè)View把事件序列攔截并且消耗。實(shí)際源碼中,某個(gè)ViewGroup決定攔截后,這個(gè)事件序列剩下的就會(huì)只交給他處理。同時(shí)它的onInterceptTouchEvent不再調(diào)用了。可見(jiàn)在onInterceptTouchEvent中,ACTION_DOWN一般返回false。因?yàn)樗绻鹴rue,剩下事件不會(huì)傳給子元素了。比如嵌套滑動(dòng)中,父元素橫向滑動(dòng),子元素縱向滑動(dòng),父元素ACTION_DOWN時(shí)不攔截,子元素能收到ACTION_DOWN,在ACTION_MOVE父元素決定要不要攔截,如果父元素決定攔截,則剩下事件父元素處理,父元素滑動(dòng),子元素收到ACTION_CANCEL?。如果父元素不攔截,則剩下事件能傳到子元素。

?著作權(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)容

  • 今日偶然看到的文中有“江湖感”一詞,頓被打動(dòng)。 人生前18年從未離開(kāi)過(guò)家,也未曾有過(guò)任何遠(yuǎn)游經(jīng)歷,每一天都被家人精...
    姜啤雜貨鋪閱讀 281評(píng)論 0 0
  • 1>memset:1、 頭文件:#include <memory.h>功 能: 將s所指向的某一塊內(nèi)存中的每個(gè)字...
    SuperDing閱讀 1,039評(píng)論 0 2
  • 浮生一夢(mèng) 君子固窮 浩然正氣 楚狂歌鳳
    華白螭閱讀 214評(píng)論 0 0
  • 今天賴團(tuán)長(zhǎng),赤裸裸的炫富。好想打她,叫花雞,烤玉米,金針菇,紅薯,竹筒飯。女的負(fù)責(zé)干活,男的負(fù)責(zé)繡花。 晚上參加了...
    隨心自在321閱讀 121評(píng)論 0 1

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