PS:好久沒有寫博客了,項目正式開始啟動了,但是怎么也打不起精神來...可能還是不適應放假留校...這下一年只能回家一次了...傷感...寫篇博客舒坦下...
學習內容:
Android中dispatchTouchEvent和OnInterceptTouchEvent和OnTouchEvent三個方法之間的聯系...這三個方法研究了整整一個下午,也沒有理解的特別的好...說實話,java的源代碼我始終都沒有看懂究竟是怎么個調用過程...不過還是把自己理解的結果寫一下把...
這三個方法是相互關聯的,表示的是Android中觸摸事件的分發過程...這個觸摸事件一般設計到三個過程,DOWN按下操作,MOVE移動操作,UP抬起操作,有的時候MOVE操作可以沒有...首先我們需要理解一個非常重要的問題就是Android如何對觸摸事件進行捕獲,分發,和響應的過程,沒有了這個過程我們完全不知道這三個事件是怎么一回事...我簡單的先放上一張圖片..

這張圖片反映了完整的觸摸事件發生,分發,以及響應的一個過程...我簡單的闡述這個過程的實現:當我們按下屏幕出發ACTION_DOWN操作的時候,那么dispatchTouchEvent()方法就被啟動了,這個方法通過調用OnInterceptTouchEvent來判斷,本層的View是否進行攔截...如果進行攔截,那么這個ACTION_DOWN操作的響應只會在本層的View中進行響應..然后對ACTION_DOWN進行消費...如果ACTION_DOWN操作被消費,那么本層的View還會去響應ACTION_MOVE和ACTION_UP操作...如果沒有進行消費,那么就會返回信息,並且不會執行ACTION_MOVE和ACTION_UP操作...估計大家看到這里的時候就會認為(這樓主寫的什么玩意...)...其實我剛看的時候也是這樣...
我們拿一個實例來看...不上什么代碼...這里上代碼也不好理解...我們就拿我們手機里的滑屏幕操作來說...滑屏操作最熟悉不過了,但是我們大家往往沒有注意到,我們的手機桌面上有很多應用圖標...我們在短時間按住桌面圖標然后滑動屏幕這個操作我們也能實現,只要不是長時間按着就可以實現屏幕滑動的效果,並沒有由於桌面上的圖標而受到影響..其實這個例子我們就很好理解了...在這里把事情交代清楚...(ACTION_DOWN:手按下屏幕...觸發dispatchTouchEvent) ,(最外層的ViewGroup:主屏幕),(下一層ViewGroup:桌面圖標)...然后我們的主屏幕調用OnInterceptTouchEvent()函數進行攔截...這里必須要攔截,只有主屏幕進行攔截操作,這樣下一層的ViewGroup,也就是桌面圖標才不會去對ACTION_DOWN進行響應操作...也就是說,通過攔截后,主屏幕ViewGroup層調用OnTouchEvent進行響應...這樣下一層的ViewGroup,也就是桌面圖標層就不會有響應操作...我再放兩張圖...


結合這兩張圖,大家再理解一下,總結一下,只要某一層產生了攔截,那么ACTION_DOWN操作就不會再向子ViewGroup進行傳遞了...但是響應OnTouchEvent(),也就是這個方法,不一定在本層的ViewGroup進行響應...因為TouchEvent可以向上傳遞...再上一張圖片...


上面的圖片就是原因,因為只有當本層的ViewGroup對ACTION_DOWN進行消費之后才不會向上進行傳遞,並且當被消費之后,才會去響應ACTION_MOVE和ACTION_UP操作...
總之:
android中的Touch事件都是從ACTION_DOWN開始的:
單手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
