深入Android Touch事件傳遞機制

2021-08-27 14:36:38 字數 2469 閱讀 9112

隨著android學習的深入,發現android中的touch事件是乙個你必須要啃的硬骨頭,本人花了一些時間去搞明白這些事,不敢說搞的非常透徹,但也絕不是淺嘗輒止。下面我就用最通俗的話分享給大家。

一、什麼是touch事件/機制

即是使用者用手指頭放到手機螢幕上到手指頭全部離開的整個過程(也叫一次事件)。有可能只是簡單的action_down(按下) ->action_move(在螢幕上移動)… -> action_up(抬起),也可能有action_cancle,系統呼叫,然後事件結束;也有可能是action_down ->action_pointer_down(第二個手指按下) -> action_move… -> action_pointer_up(多個手指按下時,抬起乙個手指時)-> action_up。其實不管怎樣,整個思路就是手指頭放到手機螢幕上到手指頭全部離開的整個過程

二、對於這一次事件,系統做了什麼,系統是怎麼來處理這些事件的?

這個問題才是關鍵!解決這個問題需要先了解兩個知識,第一,大家都知道android檢視的架構,viewgroup裡面可以包含viewgroup和子view,記憶體允許的情況下無限巢狀(當然也沒人那麼幹)。第二,touch事件傳遞和攔截,是通過三個跟touch有關的方法完成的,dispatchtouchevent、onintercepttouchevent(viewgroup裡定義)、ontouchevent,這裡就舉乙個例子來解釋這幾個函式的作用! linearlayout(以後的linearlayout我就簡稱l)裡面有個button,如果使用者觸控到了button,首先action_down事件傳遞給l(如果l外面還有viewgroup,那麼事件肯定是先傳遞給最外層的viewgroup,現在就當布局裡面就乙個l,l裡面有個button),首先action_down 先被送到l的dispatchtouchevent裡,這裡是用來判斷事件是不是分發給子view和分發給哪個子view的,在viewgroup的原始碼裡該方法裡會呼叫onintercepttouchevent,這樣action_down,就到了l的onintercepttouchevent方法,這個方法的返回值決定本次事件要不要攔截不給你的兒子(子view)?①、如果返回true,那麼本次事件子view將捕獲不到,就會執行自己的ontouchevent。執行完,然後到了l的dispatchtouchevent方法返回,該方法的返回值是在告訴系統,下一次事件,我還要不要,如果是true,那麼意思是下一次事件我還要,如果是false,那麼意思是我啥也不想幹了,事件不要再來了。②、返回false,那麼action_down就到了button的dispatchtouchevent方法,它和l的dispatchtouchevent稍有不同,它不會去判斷觸控的地方是那個view所在的區域,他會執行button的ontouchevent,這樣action_down就到了button的ontouchevent,執行完返回,然後到了button的dispatchtouchevent方法返回,該方法的返回值是在告訴系統,下一次事件,我還要不要,如果是true,那麼意思是下一次事件我還要,如果是false,那麼意思是我啥也不想幹了,事件不要再來了。

button的ontouchevent返回值的true與false決定了這乙個事件(注意是乙個事件而不是一次事件)是被誰消費掉,如果return true,那麼button消費掉這乙個事件,父view,l的ontouchevent將得不到呼叫,如果reutrn false那麼事件由父view l的ontouchevent來處理,l處理後返回true與false,同樣道理,如果true事件被消費掉,如果false那麼就交給activity的ontouchevent來處理。整個action_down就結束了,哇,乙個action_down就這麼複雜,如果你這麼覺得的話那就是沒看懂我上面說的,多讀幾遍,我上面說的是事件的傳遞機制,不管是action_down、action_move還是action_up它的機制都是這樣的,所以,搞明白這個就ok了。其實我上面說的返回值,如果返回true怎麼樣,返回false怎麼樣,那是針對你自己需求時,就像一些系統原有的控制項button、listview等,如果沒有特殊處理它們的ontouchevent是一定返回true的。那麼如果想觸控listview完成,側滑或者上拉下拉等,就只能在listview的外面寫乙個viewgroup等,在這個自定義的viewgroup中得到使用者的事件,判斷出使用者的意圖,從而確定把事件分發給誰處理。

三、事件傳遞的順序-附加篇

如果你不是很了解觸控事件的傳遞順序,那麼這裡我可以很負責的告訴你,聽好了,首先你的觸控事件會傳遞給最外層的view(當然它一般是viewgroup),即是你layout檔案裡面,最外層的那個view,如果你這個view裡面有很多子view,系統會判斷你觸控的區域是那個子view所在的區域,然後事件傳遞給最外層view的子view,如果子view裡面還有子view,ok,繼續走你,就這樣一層一層的傳遞給你觸控的那個view,所以這裡也可以看出,在布局檔案裡巢狀太多是很浪費效能的。如果view的ontouchevent返回false,傳遞過程中的view的ontouchevent都返回false,那麼事件傳遞給檢視所在的活動(activity)。有乙個檢視ontouchevent返回了true,那麼活動的ontouchevent就不會被呼叫

深入Android Touch事件傳遞機制

隨著android學習的深入,發現android中的touch事件是乙個你必須要啃的硬骨頭,本人花了一些時間去搞明白這些事,不敢說搞的非常透徹,但也絕不是淺嘗輒止。下面我就用最通俗的話分享給大家。一 什麼是touch事件 機制 即是使用者用手指頭放到手機螢幕上到手指頭全部離開的整個過程 也叫一次事件...

Android touch事件傳遞

android的touch事件分發機制,涉及到每一層級的處理和傳遞,比較複雜,本文是在參考以下日誌和android原始碼的基礎上總結的,在此表示感謝 1.touch事件傳遞過程 touch事件經過android核心層的處理,最終會傳遞到activity的dispatchtouchevent方法,由此...

android touch事件解析

android touch事件 乙個簡單的觸控螢幕所經歷的事件 action down action move action move action move.action move action up,即乙個acitondown,多個actionmove,乙個actionup android每個g...