Android View的事件分發(fā)機制和滑動沖突
本文原創(chuàng)渊抽,轉(zhuǎn)載請注明出處称勋。歡迎關(guān)注我的 簡書耀鸦。
安利一波我寫的開發(fā)框架:MyScFrame喜歡的話就給個Star
View的事件分發(fā)機制
說白了捶枢,就是一個點擊事件的傳遞稀拐,從手指觸碰到屏幕那一刻開始到手指離開屏幕結(jié)束火邓。
由一個MotionEvent.ACTION_DOWN
事件,若干個MotionEvent.ACTION_MOVE
事件,一個MotionEvent.ACTION_UP
事件構(gòu)成德撬。
涉及到的重要方法有:
boolean dispatchTouchEcent(MotionEvent ev) //用來分派event:只要事件傳遞到了當(dāng)前View,那么該方法就一定會被調(diào)用铲咨。返回結(jié)果表示是否消耗當(dāng)前事件。
boolean onInterceptTouchEvent(MotionEvent event)//用來攔截event:該方法是在dispatchTouchEcent方法內(nèi)部調(diào)用的蜓洪,可以用來判斷是否攔截某個事件纤勒。如果當(dāng)前View攔截了某個事件隆檀,那么在這同一個事件序列中摇天,此方法不會再次被調(diào)用粹湃。返回結(jié)果表示是否攔截當(dāng)前事件。
boolean onTouchEvent(MotionEvent event)//用來處理event:該方法也是在dispatchTouchEcent方法內(nèi)部調(diào)用的泉坐,用來處理事件为鳄。返回結(jié)果表示是否處理當(dāng)前事件,如果不處理腕让,那么在同一個事件序列里面孤钦,當(dāng)前View無法再收到后續(xù)的事件。
現(xiàn)在來說明下這三個方法之間的關(guān)系纯丸,這里需要區(qū)分為ViewGroup與View
ViewGroup:
public boolean dispatchTouchEvent(MotionEvent ev){
if(onInterceptTouchEvent(ev)){
return onTouchEvent(ev);
}else{
return child.dispatchTouchEvent(ev);
}
}
View:
public boolean dispatchTouchEvent(MotionEvent ev){
return onTouchEvent(ev);
}
onTouch偏形,OnClick關(guān)系
他們的調(diào)用優(yōu)先級依次是onTouch>OnClick
這里要說的一點是,OnClick是在onTouch的MotionEvent.ACTION_UP
之后才會被調(diào)用到觉鼻,假設(shè)我們在MotionEvent.ACTION_UP
的時候return true
那么OnClick事件就不會執(zhí)行俊扭,所以如果你同時監(jiān)聽了Touch與OnClick事件,可以用MotionEvent.ACTION_UP
的時候return true
的方式來截斷事件的傳遞坠陈。
我的另外一篇文章中就有使用到:自定義View仿iOS的UiSwitch控件
既然已經(jīng)了解了View的事件分發(fā)機制统扳,那么滑動沖突應(yīng)該也就能迎刃而解了吧。這里就不在敘述了畅姊,可參考陳添的這篇文章。