在Android中,人們主要通過手指與系統交互。Android把所有的touch事件都被封裝成MotionEvent來進行處理,其中包括了手指點擊的位置,時間等信息。其事件類型主要包括:ACTION_DOWN,ACTION_UP,ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP,ACTION_CANCEL。
這些事件是有觸發順序的,下面舉兩個栗子:
只有一個手指點擊在view范圍內,依次觸發的事件:手指按下ACTION_DOWN→手指移動ACTION_MOVE→手指抬起ACTION_UP
多個手指點擊在view范圍內,依次觸發的事件:第一根手指按下ACTION_DOWN→隨後的手指按下ACTION_POINTER_DOWN→有手指抬起ACTION_POINTER_UP→最後一根手指抬起ACTION_UP。
為了處理這些事件,Android定義了三種方法:
dispatchTouchEvent()函數:負責分發傳遞事件。
onInterceptTouchEvent()函數:負責攔截事件
onTouchEvent()函數和 OnTouchListener監聽:負責消費和處理事件
事件傳遞流程
當一個事件被觸發,事件的傳遞從Activity.dispatchTouchEvent()開始,一直從最外層的父view開始向裡面的子view傳遞,直到被攔截。在傳遞過程中,view可以通過onInterceptTouchEvent()函數進行攔截,一旦父view攔截了該事件,則不再向下傳遞。
如果被觸發的事件被傳遞至最內層的view,一直未被攔截消費,則會反向向外傳遞,這時候父view可以通過onTouchEvent函數對事件進行消費,直到activity。另外,如果被觸發的ACTION_DOWN事件在某一層未被消費,那麼接下來的事件是無法被傳遞進來的。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11