簡(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去了。