標籤:android 事件處理
一.dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent區別
- dispatchTouchEvent是第一個收到事件的介面, 無論在View還是ViewGroup中;
- onInterceptTouchEvent攔截介面在ViewGroup中才有;因為攔截只是為了不向子View分發事件,View中並沒有子View;
- onTouchEvent介面是事件最終處理的地方;
onTouchEvent返回Ture ,代表事件被處理,以後的move,up事件都會分發到該View繼續處理; onTouchEvent返回False,則以後的move,up事件就不會分發到該View;
二.onInterceptTouchEvent詳解實現該方法用以攔截所有的螢幕觸摸運動事件。它可以觀察到所有分發到子視圖的事件,並且在任何時候都擁有當前手勢的所有權。該方法返回true表示攔截ViewGroup到子View的事件,false則相反。簡單說來onInterceptTouchEvent處理事件(類似於預先處理,當然也可以不處理)並改變事件的傳遞方向,也就是決定是否允許Touch事件繼續向下(子控制項)傳遞,一但返回True(代表事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控制項將沒有機會參與Touch事件),同時把事件傳遞給當前的控制項的onTouchEvent()處理;返回false,則把事件交給子控制項的onInterceptTouchEvent()。使用該功能要十分的小心,因為他將會和View.onTouchEvent(MotionEvent)相當複雜的進行互動,並要求兩個方法都要很好的實現。事件將以下列的順序被接收:
- 該方法內將接收到DOWN事件。
- DOWN事件要不被子視圖處理要不被ViewGroup自己的onTouchEvent()方法處理。處理的意思就是onToucheEvent()返回true,你就會繼續接收到其他的手勢(而不是尋找父視圖來處理它)。如果ViewGroup的onToucheEvent()返回true,在onInterceptTouchEvent()中將不會接收到接下來的事件,所有的觸摸處理像正常的發生在ViewGroup的onTouchEvent()中。
- 對於返回false的情況,接下來所有的事件(直到最終的UP事件)都會先被傳遞到這裡然後才會傳遞給目標的onTouchEvent()(譯者註:即返回true的onTouchEvent)。
- 如果該處返回true,這個方法內將不會接收到接下來所有的事件:目標的View會接收到CANCEL事件,並且接下來所有的事件都會分發到ViewGroup的onTouchEvent()方法,事件就不會出現在這裡了。
ACTION_CANCEL事件:當 當前控制項(子控制項,兒子)收到前驅事件(ACTION_MOVE或者ACTION_MOVE)後,它的父控制項(老爸)突然插手,截斷事件的傳遞,這時,當前控制項就會收到ACTION_CANCEL,收到此事件後,不管子控制項此時返回true或者false,都認為這一個動作已完成,不會再回傳到父控制項的OnTouchEvent中處理,同時後續事件,會通過dispatchEvent方法直接傳送到父控制項這裡來處理。這和之前的結論有點相悖,之前說過如果子控制項的OnTouchEvent返回false,表明事件未被處理,是回傳到父控制項去處理的,這裡糾正一下,只有ACTION_DOWN事件才可以被回傳,ACTION_MOVE和ACTION_UP事件會跟隨ACTION_DOWN事件,即ACTION_DOWN是哪個控制項處理的,後續事件都傳遞到這裡,不會上拋到父控制項,ACTION_CANCEL也不能回傳。還有一點,觸摸地區的範圍問題,如果觸摸地區在子控制項內,同時父控制項沒有截斷事件傳遞,剛不管子控制項是否攔截此事件,都會傳遞到子控制項的OnTouchEvent中處理,可以看成一種責任吧,因為我點的就是你,你父親沒有攔截,說明他不想處理,那到你這裡了,不管你攔不攔截,都得你來處理。
結論:ACTION_CANCEL事件是收到前驅事件後,後續事件被父控制項攔截的情況下產生,onTouchEvent的事件回傳到父控制項只會發生在ACTION_DOWN事件中
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android事件處理機制