Android在MotionEvent里定義了一系列的手勢事件
其中包括:
MotionEvent.ACTION_DOWN:當屏幕檢測到第一個觸點按下之后就會觸發到這個事件。
MotionEvent.ACTION_MOVE:當觸點在屏幕上移動時觸發,觸點在屏幕上停留也是會觸發的,主要是由於它的靈敏度很高,而我們的手指又不可能完全靜止(即使我們感覺不到移動,但其實我們的手指也在不停地抖動)。
MotionEvent.ACTION_POINTER_DOWN:當屏幕上已經有觸點處於按下的狀態的時候,再有新的觸點被按下時觸發。
MotionEvent.ACTION_POINTER_UP:當屏幕上有多個點被按住,松開其中一個點時觸發(即非最后一個點被放開時)觸發。
MotionEvent.ACTION_UP:當最后一個觸點松開時被觸發。
MotionEvent.ACTION_SCROLL:非觸摸滾動,主要是由鼠標、滾輪、軌跡球觸發。
MotionEvent.ACTION_CANCEL:不是由用戶直接觸發,有系統再需要的時候觸發,例如當父view通過使函數onInterceptTouchEvent()返回true,從子view拿回處理事件的控制權是,就會給子view發一個ACTION_CANCEL事件,這里了view就再也不會收到事件了。可以將其視為ACTION_UP事件對待。
onInterceptTouchEvent()函數與onTouchEvent()的區別:
1、onInterceptTouchEvent()是用於處理事件(類似於預處理,當然也可以不處理)並改變事件的傳遞方向,也就是決定是否允許Touch事件繼續向下(子view)傳遞,一但返回True(代表事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子view將沒有機會參與Touch事件),同時把事件傳遞給當前的view的onTouchEvent()處理;返回false,則把事件交給子view的onInterceptTouchEvent()
2、onTouchEvent()用於處理事件,返回值決定當前view是否消費(consume)了這個事件,也就是說在當前view在處理完Touch事件后,是否還允許Touch事件繼續向上(父view)傳遞,一但返回True,則父view不用操心自己來處理Touch事件。返回true,則向上傳遞給父view(注:可能你會覺得是否消費了有關系嗎,反正我已經針對事件編寫了處理代碼?答案是有區別!比如ACTION_MOVE或者ACTION_UP發生的前提是一定曾經發生了ACTION_DOWN,如果你沒有消費ACTION_DOWN,那么系統會認為ACTION_DOWN沒有發生過,所以ACTION_MOVE或者ACTION_UP就不能被捕獲。)