點(diǎn)擊事件的事件分發(fā)归苍,就是對(duì)MotionEvent事件的分發(fā)過程,即當(dāng)一個(gè)MotionEvent產(chǎn)生了以后,系統(tǒng)需要把這個(gè)事件傳遞給一個(gè)具體的View恨诱。
ViewGroup有該攔截方法胜茧;View并沒有攔截方法粘优,不存在分發(fā),只能在onTouchEvent方法中進(jìn)行處理消費(fèi)或者不消費(fèi)呻顽。
點(diǎn)擊事件的分發(fā)過程由三個(gè)方法共同完成:
1.dispatchTouchEvent
public boolean dispatchTouchEvent(MotionEvent ev)
用來進(jìn)行事件的分發(fā)雹顺。事件傳遞給一個(gè)View,這個(gè)View的dispatchTouchEvent方法就一定會(huì)被調(diào)用廊遍。
返回值表示是否消費(fèi)了當(dāng)前事件嬉愧。
返回true可能是View本身的onTouchEvent方法消費(fèi),也可能是子View的dispatchTouchEvent方法中消費(fèi)喉前,本次的事件終止没酣。
返回false表示View及子View均沒有消費(fèi)事件,將調(diào)用父View的onTouchEvent方法卵迂。
2.onInterceptTouchEvent
public boolean onInterceptTouchEvent(MotionEvent event)
在 dispatchTouchEvent 方法的內(nèi)部調(diào)用裕便,用來判斷是否攔截某個(gè)事件,ViewGroup有該攔截方法见咒,View并沒有攔截方法偿衰。
返回true表示攔截了事件,那么事件將不再向下分發(fā)而是調(diào)用View本身的onTouchEvent方法。
返回false表示不做攔截下翎,事件將向下分發(fā)到子View的dispatchTouchEvent方法囱嫩。
3.onTouchEvent
public boolean onTouchEvent(MotionEvent event)
真正對(duì)MotionEvent進(jìn)行處理或者說消費(fèi)的方法。在dispatchTouchEvent進(jìn)行調(diào)用漏设。
返回true表示事件被消費(fèi)墨闲,本次的事件終止。
返回false表示事件沒有被消費(fèi)郑口,將調(diào)用父View的onTouchEvent方法鸳碧。
小結(jié):
沒有攔截的情況下,將逐級(jí)向下分發(fā)犬性,直到最末端的子View瞻离,子View的onTouchEvent優(yōu)先處理,不處理時(shí)則逐級(jí)回調(diào)父級(jí)的onTouchEvent方法乒裆。
有攔截的情況下套利,事件不再向下傳遞。由攔截的View本身的onTouchEvent處理鹤耍,如該View未消費(fèi)掉事件肉迫,則調(diào)用父級(jí)View的onTouchEvent方法處理。
補(bǔ)充:
MotionEvent有下面兩種:
單擊操作:ACTION_DOWN -> ACTION_UP
點(diǎn)擊后滑動(dòng)一段距離稿黄,再抬起:ACTION_DOWN -> ACTION_MOVE -> ... -> ACTION_MOVE -> ACTION_UP喊衫。
onTouchEvent中,如果不消耗ACTION_DOWN杆怕,則在同一個(gè)事件序列中族购,當(dāng)前View再也無法接收到該事件的后續(xù)事件(ACTION_MOVE,ACTION_UP等)陵珍。如果消耗了ACTION_DOWN寝杖,則還可以消耗ACTION_MOVE,ACTION_UP等互纯。