方法1:
public boolean dispatchTouchEvent(MotionEvent ev)
????該方法用來進(jìn)行事件的分發(fā),即無論ViewGroup或者View的事件,都是從這個方法開始的。
方法2:
public boolean onInterceptTouchEvent (MotionEvent ev)
????在方法1內(nèi)部調(diào)用,表示是否攔截當(dāng)前事件。默認(rèn)不攔截。
????如果攔截了事件,那么將不會分發(fā)給子View。
方法3:
public boolean onTouchEvent(MotionEvent ev)
????在方法1內(nèi)部調(diào)用,表示是否對事件進(jìn)行處理。
????以上三個方法非常重要,它們的關(guān)系可以用如下偽代碼呈現(xiàn):
public boolean dispatchTouchEvent(MotionEvent ev){
????boolean handle =false;
if(onInterceptTouchEvent(ev)){
? ? ? ? handle = onTouchEvent(ev);
}else{
? ? ? ? handle = child.dispatchTouchEvent(ev);
? ? }
return handle;
詳細(xì):
if (actionMasked == MotionEvent.ACTION_DOWN) {
? ? cancelAndClearTouchTargets(ev);
? ? resetTouchState();
}
首先這里先判斷事件是否為DOWN事件,如果是,則初始化,由于一個完整的事件序列是以DOWN開始,以UP結(jié)束,所以如果是DOWN事件,那么說明是一個新的事件序列,所以需要初始化之前的狀態(tài)。
mFirstTouchTarget =null;
mFirstTouchTarget 最終指向消耗事件的View,如果都不消耗,那么最后事件會交由Activity處理。
onTouch() 方法的返回值決定了 onTouchEvent() 方法要不要執(zhí)行,如果 onTouch() 返回 true,則 onTouchEvent() 不會再執(zhí)行,返回 false ,則 onTouchEvent() 繼續(xù)執(zhí)行,而 onClick() 的回調(diào)是在 onTouchEvent() 方法中調(diào)用