1.touch事件
一個(gè)事件總是以ACTION_DOWN作為開(kāi)始,在手勢(shì)移動(dòng)過(guò)程中會(huì)重復(fù)產(chǎn)生多個(gè)ACTION_MOVE事件,用戶操作結(jié)束事件的標(biāo)志為ACTION_UP,而意外終止事件則會(huì)觸發(fā)ACTION_CANCEL。通常ACTION_DOWN的分發(fā)最重要。
2.三個(gè)主要相關(guān)方法
dispatchTouchEvent(MotionEvent ev)
onInterceptTouchEvent(MotionEvent ev)
onTouchEvent(MotionEvent event)
ViewGroup中這三個(gè)方法之間關(guān)系的偽代碼如下:
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if (onInterceptTouchEvent(ev)) {
consume = onTouchEvent(ev);
} else {
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
View 沒(méi)有onInterceptTouchEvent,所以一般view調(diào)用dispatchTouchEvent后就調(diào)用onTouchEvent
我們看這個(gè)dispatchTouchEvent的偽代碼:
1.onInterceptTouchEvent(ev)默認(rèn)返回false,所以通常ViewGroup會(huì)往子元素分發(fā),除非你在onInterceptTouchEvent返回true表示攔截,然后會(huì)調(diào)用onTouchEvent
2.而onTouchEvent默認(rèn)返回true,消費(fèi)掉。
3.只能一個(gè)View把事件序列攔截并且消耗。實(shí)際源碼中,某個(gè)ViewGroup決定攔截后,這個(gè)事件序列剩下的就會(huì)只交給他處理。同時(shí)它的onInterceptTouchEvent不再調(diào)用了。可見(jiàn)在onInterceptTouchEvent中,ACTION_DOWN一般返回false。因?yàn)樗绻鹴rue,剩下事件不會(huì)傳給子元素了。比如嵌套滑動(dòng)中,父元素橫向滑動(dòng),子元素縱向滑動(dòng),父元素ACTION_DOWN時(shí)不攔截,子元素能收到ACTION_DOWN,在ACTION_MOVE父元素決定要不要攔截,如果父元素決定攔截,則剩下事件父元素處理,父元素滑動(dòng),子元素收到ACTION_CANCEL?。如果父元素不攔截,則剩下事件能傳到子元素。