事件分發(fā)機(jī)制歧蕉,就是介紹view的click、touch康铭、滑動(dòng)等操作的事件傳遞流程惯退。是很重要的一個(gè)知識(shí)體系。對(duì)于在開(kāi)發(fā)中遇到的滑動(dòng)失效从藤、沖突等情況催跪,只有了解了事件的分發(fā)機(jī)制,才能充分解決問(wèn)題夷野。
一懊蒸、先要知道的一些東西
- 事件在三大層進(jìn)行傳遞:Activity、ViewGroup悯搔、View骑丸。
- Touch事件相關(guān)細(xì)節(jié)(發(fā)生觸摸的位置、時(shí)間妒貌、歷史記錄通危、手勢(shì)動(dòng)作等)被封裝成MotionEvent對(duì)象。
- 在MotionEvent對(duì)象中包含著一系列需要分發(fā)的事件:
MotionEvent.ACTION_DOWN:按下View(所有事件的開(kāi)始)
MotionEvent.ACTION_MOVE:滑動(dòng)View
MotionEvent.ACTION_CANCEL:非人為原因結(jié)束本次事件
MotionEvent.ACTION_UP:抬起View(與DOWN對(duì)應(yīng)) - 一次完整的MotionEvent事件灌曙,是從用戶觸摸屏幕到離開(kāi)屏幕黄鳍。整個(gè)過(guò)程的動(dòng)作序列:ACTION_DOWN(1次) -> ACTION_MOVE(N次) -> ACTION_UP(1次)。
- 處理事件的三個(gè)方法:
- dispatchTouchEvent:負(fù)責(zé)分發(fā)事件平匈;
- onInterceptT1ouchEvent:攔截事件,只在ViewGroup中存在藏古,而且是在dispatchTouchEvent內(nèi)部調(diào)用增炭;
- onTouchEvent:處理事件;
- 三個(gè)方法不同返回值的意義:
- return true:事件就停止傳遞了拧晕,既不向下傳遞隙姿,也不向上傳遞,到此為止了厂捞。
- return false:事件停止向下傳遞输玷,開(kāi)始向上(父類)傳遞。也就是說(shuō)不消費(fèi)事件靡馁,并讓事件繼續(xù)往父控件的方向從下往上流動(dòng)欲鹏。
- return super:繼續(xù)按照默認(rèn)的流程繼續(xù)傳遞。
二臭墨、事件分發(fā)的流程
- 如果中間不手動(dòng)對(duì)事件進(jìn)行處理和攔截赔嚎,那么默認(rèn)的流程是從父控件依次向子控件傳遞,然后再?gòu)淖涌丶骰馗缚丶?br> 從Activity---->ViewGroup--->View 從上往下調(diào)用dispatchTouchEvent方法,一直到最下面的子控件(該控件下沒(méi)有子控件了)的時(shí)候尤误,再由View--->ViewGroup--->Activity從下往上調(diào)用onTouchEvent方法侠畔。
-
明白了上面的東西,再來(lái)看下面這個(gè)經(jīng)典的流程圖:
二损晤、ACTION_DOWN软棺、ACTION_MOVE和ACTION_UP,這三個(gè)事件的傳遞
上面說(shuō)的都是ACTION_DOWN的傳遞流程尤勋,ACTION_MOVE和ACTION_UP的傳遞流程不太一樣喘落。
只有當(dāng)在onTouchEvent中返回true,對(duì)事件進(jìn)行了終止時(shí)斥黑,這三者的流程不一樣揖盘。其余在dispatchTouchEvent 和 onInterceptTouchEvent 中返回true、false锌奴、super兽狭,在onTouchEvent中返回false、super時(shí)ACTION_DOWN鹿蜀、ACTION_MOVE和ACTION_UP這三者的流程是一致的箕慧。
下面來(lái)看幾張圖,這里直接用了《圖解 Android 事件分發(fā)機(jī)制》中的圖片茴恰。這里只列出了onTouchEvent颠焦,另外兩個(gè)方法和down完全一樣,就不貼圖了往枣。
參考:
圖解 Android 事件分發(fā)機(jī)制
Android事件分發(fā)機(jī)制詳解:史上最全面伐庭、最易懂