Android View 事件分發(fā)機(jī)制源碼解析

簡(jiǎn)述

點(diǎn)擊事件的傳遞順序?yàn)椋篈ctivity -> Window -> View
主要的函數(shù)為:dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent

源碼解析

那么我們先從Activity來(lái)看
當(dāng)手機(jī)點(diǎn)擊屏幕的時(shí)候,首先會(huì)觸發(fā)Activity的dispatchTouchEvent 方法

public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();   //activity在棧頂時(shí),用戶對(duì)手機(jī):觸屏點(diǎn)擊,按home,back,menu鍵都會(huì)觸發(fā)此方法
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

就倆個(gè)if判斷,上面那個(gè)看名字跟我們需要看的東西沒(méi)什么關(guān)聯(lián),那么我們來(lái)到下面這個(gè)if判斷,getWindow().superDispatchTouchEvent(ev)我們跟進(jìn)去看這段
首先getWindow(),在我們看過(guò)setContentView的源碼之后我們知道這個(gè)東西的實(shí)例是PhoneWindow得來(lái)的,那么我們來(lái)到PhoneWindow下的superDispatchTouchEvent

public boolean superDispatchTouchEvent(MotionEvent event) {
        return mDecor.superDispatchTouchEvent(event);   //mDecor是什么東西
    }
//DecorView.java下的
public boolean superDispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }

其實(shí),mDecor這個(gè)東西在看過(guò)setContentView的源碼之后也知道,這個(gè)東西其實(shí)就是在我們每次調(diào)用setContentView的時(shí)候,會(huì)先添加一個(gè)R.id.content的布局,然后再將我們的布局添加上去,在這里的mDecor也就是我們的最頂級(jí)的View,繼承于FrameLayout,來(lái)到DecorView下的superDispatchTouchEvent,也是調(diào)用父類的dispatchTouchEvent,前面說(shuō)到DecorView是繼承于FrameLayout的,那么自然就調(diào)用到ViewGroup的dispatchTouchEvent,到這里點(diǎn)擊事件就從Activity傳遞到ViewGroup去了。


最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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