從這段偽代碼中冻河,我們可以看出來原环,在dispatchTouchEvent中,先調(diào)用VIewGroup自身的onInterceptTouchEvent方法婚脱,判斷自己是否要攔截,如果這時候自己攔截勺像,那就調(diào)用自己的onTouchEvent方法障贸,如果onTouchEvent方法返回true,那么這次的事件就算消耗完了吟宦,事件傳遞到此為止篮洁,如果返回了false,說明這次沒有消耗MotionEvent殃姓,那么這次的事件就會往上返回嘀粱,由上一級繼續(xù)處理;如果當(dāng)前ViewGroup的onInterceptTouchEvent返回了false辰狡,那就會調(diào)用它的子view的dispatchTouchEvent方法,這樣這個事件就傳遞下去了垄分。
參照上圖先說說具體得到的結(jié)論:
1)onInterceptTouchEvent負(fù)責(zé)對touch事件進行攔截宛篇,對于嵌套的view最先執(zhí)行的是事件攔截方法的是最外層的那個view的onInterceptTouchEvent方法,然后依次執(zhí)行子視圖的onInterceptTouchEvent,然后在執(zhí)行子視圖的子視圖的事件攔截方法(當(dāng)然在這里假設(shè)所有嵌套視圖的onInterceptTouchEvent都會得到執(zhí)行,讓每個視圖的onInterceptTouchEvent返回false即可)薄湿。參照上圖叫倍,所以onInterceptTouchEvent執(zhí)行順序就是A--->B--->C--->D.也就是由父視圖到子視圖傳遞〔蛄觯總之吆倦,事件攔截機制是由父視圖開始發(fā)起對事件的攔截(出事了老子先上,兒子稍后)坐求。參照上圖當(dāng)手指觸摸事件時蚕泽,父視圖A首先發(fā)起對該起事件的攔截,如果A攔截失敗,就交給它的子視圖B進行攔截须妻;如果B攔截失敗就交給B的子視圖C再進行攔截..直到某一子視圖對該次事件攔截成功仔蝌。
2)某一視圖攔截事件成功與否的判斷標(biāo)識是onInterceptTouchEvent方法的返回值,當(dāng)返回true的時候說明攔截成功荒吏,返回false的時候說明當(dāng)前視圖對事件攔截失敗敛惊。
3)下面說說攔截成功的情況,假設(shè)C視圖對當(dāng)前touch事件攔截成功绰更。攔截成功意味著此次事件不會再傳遞到D視圖了瞧挤。所以此時的D視圖的onInterceptTouchEvent就得不到運行。事件攔截成功后儡湾,緊接著就會對事件進行處理特恬,處理的方法交給onTouchEvent方法處理。這是不是意味著當(dāng)前touch事件是由C視圖的onTouchEvent方法來處理呢盒粮?這要由C視圖的onTouchEvent方法的返回值來決定鸵鸥。當(dāng)C視圖的onTouchEvent返回true的時候,當(dāng)前事件就由C全權(quán)處理丹皱。如果返回的false,說明C視圖對此事件不做處理或者處理不了妒穴,怎么辦呢?兒子不行老爸來摊崭,于是事件就交到了B視圖的onTouchEvent方法中讼油。同樣B對此事件處理與否還是看B的onTouchEvent返回值
4)在A B C D的onInterceptTouchEvent和onTouchEvent都返回false的情況下,方法執(zhí)行的順序依次為A.onInterceptTouchEvent-->B.onInterceptTouchEvent-->C.onInterceptTouchEvent-->D.touchEvent(最深的子視圖沒重寫onInterceptTouchEvent)-->C.touchEvent-->B.touchEvent-->A.touchEvent.也就是說攔截事件是父視圖優(yōu)先有子視圖進行攔截呢簸,處理事件是子視圖優(yōu)先父視圖進行處理矮台。
總結(jié):onInterceptTouchEvent負(fù)責(zé)對事件進行攔截,攔截成功后交給最先遇到onTouchEvent返回true的那個view進行處理根时。