我們知道Android的View是一個(gè)樹型結(jié)構(gòu),ViewGroup之下可以再由ViewGroup也可以再有View。而Android的事件既是按照這個(gè)樹型結(jié)構(gòu)去傳遞和處理的臭脓。
Android的事件機(jī)制可以分割為分發(fā)、處理兩段。
一偎行、事件分發(fā)
事件分發(fā)過程中有兩個(gè)關(guān)鍵方法
dispatchTouchEvent 分發(fā)事件
onInterceptTouchEvent 攔截事件(此方法只出現(xiàn)在ViewGroup中,View中沒有)
當(dāng)一個(gè)事件被觸發(fā)首先會從根節(jié)點(diǎn)開始按照dispatchTouchEvent >>> onInterceptTouchEvent(如果有的話)的順序去執(zhí)行贰拿,
若是onInterceptTouchEvent返回true蛤袒,則會攔截下事件,直接由當(dāng)前這個(gè)層級的節(jié)點(diǎn)去選擇是否處理事件膨更,不再向下層傳遞妙真。
二、事件處理
事件的處理荚守,實(shí)際上就是我們非常熟悉的onTouchEvent方法珍德。
前面說到一個(gè)事件被觸發(fā)會按照dispatchTouchEvent >>> onInterceptTouchEvent(如果有的話)的順序去執(zhí)行,而執(zhí)行到最底層節(jié)點(diǎn)將dispatchTouchEvent >>> onInterceptTouchEvent(如果有的話)執(zhí)行完后則會執(zhí)行這個(gè)節(jié)點(diǎn)的onTouchEvent方法來處理事件矗漾。這時(shí)該最底層節(jié)點(diǎn)有兩個(gè)選擇:
1菱阵、處理這個(gè)事件。(onTouchEvent返回true)
2缩功、交給上層去處理(onTouchEvent返回false)晴及。
如果選擇返回True,那么這個(gè)事件就到此為止了嫡锌,如果選擇返回False虑稼,則會將這個(gè)事件回傳會上層的onTouchEvent。這時(shí)上層就要面臨相同的兩個(gè)選擇了势木。
三蛛倦、總結(jié)
知道了上訴事件的分發(fā)和處理流程后就可以知道,Android的事件可總結(jié)為以下流程:
dispatchTouchEvent >
onInterceptTouchEvent(如果有的話) (如果返回true啦桌,則不再分發(fā))>
dispatchTouchEvent >
onInterceptTouchEvent(如果有的話) >
onTouchEvent (如果返回true溯壶,則不再傳遞)>
onTouchEvent