事件分發(fā)流程
事件分發(fā)對于MontionEvent事件分發(fā)导饲。
三個(gè)重要方法
- dispatchTouchEnent
用來分發(fā),事件傳遞到view币叹,該方法一定會(huì)被調(diào)用 - onInterceptionTouchEvent
判斷是否攔截某個(gè)事件赏壹,如果view攔截某個(gè)事件百拓,同一事件周期內(nèi)亮瓷,此方法不會(huì)被調(diào)用 - onTouchEvent
處理事件忍饰,消耗當(dāng)前事件,如果不消耗寺庄,同一個(gè)事件周期內(nèi),當(dāng)前view不在接受該事件力崇。
初始事件傳遞
當(dāng)一個(gè)事件產(chǎn)生后斗塘,傳遞給當(dāng)前Activity,由Activity的dispatchTouchEnent分發(fā)事件亮靴,具體由Activity的Window來完成馍盟。不過Window是抽象類,實(shí)現(xiàn)是PhoneWindow類茧吊,而PhoneWindow會(huì)將事件傳遞給Decor View贞岭。Decor View 一般當(dāng)前界面的底層view,即setContentView所設(shè)置的view的父容器搓侄。這樣事件傳遞到根view瞄桨。
簡單流程
ViewGroup 接受到一個(gè)點(diǎn)擊事件,會(huì)調(diào)用dispatchTouchEnent讶踪,如果ViewGroup的onInterceptionTouchEvent方法返回true芯侥,表示攔截當(dāng)前事件,事件傳遞給ViewGroup處理,如果onInterceptionTouchEvent返回false柱查,不攔截當(dāng)前事件廓俭,當(dāng)前事件傳遞給子view,子view的dispatchTouchEnent被調(diào)用唉工,重復(fù)上面操作研乒。
具體流程
- 如果事件傳遞到view,該view的onTouchEvent返回false淋硝,沒有處理雹熬,事件傳遞給父view,由父view的onTouchEvent處理奖地,如果所有view都沒有處理該事件橄唬,最終由Activity的onTouchEvent處理該事件。
- 如果其中一個(gè)view攔截事件参歹,如果不處理ACTION_DOWN事件仰楚,后續(xù)事件不會(huì)傳遞給該view,事件由父view處理犬庇;如果處理ACTION_DOWN事件僧界,不處理其他事件,這些事件消失臭挽,但會(huì)傳遞給Activity處理捂襟。
方法requestDisallowInterceptTouchEvent可以干預(yù)父事件的分發(fā)過程。阻止ViewGroup對其MOVE或者UP事件進(jìn)行攔截欢峰。
整個(gè)事件分發(fā)過程中葬荷,ACTION_DOWN事件能否找到目標(biāo)組件(最終處理事件的組件),對事件分發(fā)流程很重要纽帖。