1. 程式人生 > >dispatchTouchEvent,onUserInteraction,onTouchEvent 呼叫時序(按鍵監聽函式呼叫過程)

dispatchTouchEvent,onUserInteraction,onTouchEvent 呼叫時序(按鍵監聽函式呼叫過程)

  • 一、只有一個Activity時:一次拇指點選事件(包括ACTION_DOWN,ACTION_UP),呼叫時序如下:

  1. dispatchTouchEvent

  2. onUserInteraction

  3. onTouchEvent (ACTION_DOWN)

  4. dispatchTouchEvent 

  5. onTouchEvent (ACTION_UP,不會觸發onUserInteraction)

  •  二、只有一個Activity,當鍵盤鍵按下時,時序如下

  1. dispatchKeyEvent

  2. onUserInteraction

  3. onKeyDown

  4. dispatchKeyEvent

  5. onUserInteraction

  6. onKeyUp (注意與觸控不同,當鬆開按鍵時onUserInteraction也會觸發。)

  • 三、Activity裡有一個Layout,在Layout裡有個按鈕。一次拇指觸控點選事件(包括ACTION_DOWN,ACTION_UP),方法邏輯順序如下:

  1. Activity的dispatchTouchEvent

  2. Activity的onUserInteraction

  3. Layout的dispatchTouchEvent

  4. Layout的onInterceptTouchEvent

  5. Button的onTouchEvent(ACTION_DOWN)

緊跟著是一個ACTION_UP事件

  1. Activity的dispatchTouchEvent(不觸發Activity的onUserInteraction,它對ACTION_UP不起作用。)

  2. Layout的dispatchTouchEvent

  3. Layout的onInterceptTouchEvent

  4. Button的onTouchEvent

  5. Button的onClick

如果在onTouchEvent裡返回true,消費了該事件,那麼onClick將不會被響應。

但是如果不寫onClick事件,而onTouchEvent事件返回false,也沒有上述時序中的最後一步,其他時序即事件不會再向上傳遞,估計是onClick有預設響應不處理,而onClick不會有返回值。但是如果是繼承了一個View而且又覆寫了onTouchEvent,若返回false,那麼觸控會向上傳遞。

時序如下

  1. Activity的dispatchTouchEvent

  2. Activity的onUserInteraction

  3. Layout的dispatchTouchEvent

  4. Layout的onInterceptTouchEvent

  5. Button的onTouchEvent (ACTION_DOWN)

  6. Layout的onTouchEvent (ACTION_DOWN)

緊跟著是一個ACTION_UP事件

  1. Activity的dispatchTouchEvent(不觸發Activity的onUserInteraction,它對ACTION_UP不起作用。)

  2. Layout的dispatchTouchEvent

  3. Layout的onInterceptTouchEvent

  4. Button的onTouchEvent

onClick事件不再發生。

  •  對於鍵盤監聽

VIEW和Activity本身都有相應鍵盤事件的ONKEYUP和ONKEYDOWN

對於VIEW,可以setOnKeyListener監聽鍵盤事件,如果既對VIEW寫了上述偵聽,又覆寫了ONKEYUP,DOWN事件,那麼首先進入ONKEYDOWN,UP。