dispatchTouchEvent,onUserInteraction,onTouchEvent 呼叫時序(按鍵監聽函式呼叫過程)
-
一、只有一個Activity時:一次拇指點選事件(包括ACTION_DOWN,ACTION_UP),呼叫時序如下:
-
dispatchTouchEvent
-
onUserInteraction
-
onTouchEvent (ACTION_DOWN)
-
dispatchTouchEvent
-
onTouchEvent (ACTION_UP,不會觸發onUserInteraction)
-
二、只有一個Activity,當鍵盤鍵按下時,時序如下
-
dispatchKeyEvent
-
onUserInteraction
-
onKeyDown
-
dispatchKeyEvent
-
onUserInteraction
-
onKeyUp (注意與觸控不同,當鬆開按鍵時onUserInteraction也會觸發。)
-
三、Activity裡有一個Layout,在Layout裡有個按鈕。一次拇指觸控點選事件(包括ACTION_DOWN,ACTION_UP),方法邏輯順序如下:
-
Activity的dispatchTouchEvent
-
Activity的onUserInteraction
-
Layout的dispatchTouchEvent
-
Layout的onInterceptTouchEvent
-
Button的onTouchEvent(ACTION_DOWN)
緊跟著是一個ACTION_UP事件
-
Activity的dispatchTouchEvent(不觸發Activity的onUserInteraction,它對ACTION_UP不起作用。)
-
Layout的dispatchTouchEvent
-
Layout的onInterceptTouchEvent
-
Button的onTouchEvent
-
Button的onClick
如果在onTouchEvent裡返回true,消費了該事件,那麼onClick將不會被響應。
但是如果不寫onClick事件,而onTouchEvent事件返回false,也沒有上述時序中的最後一步,其他時序即事件不會再向上傳遞,估計是onClick有預設響應不處理,而onClick不會有返回值。但是如果是繼承了一個View而且又覆寫了onTouchEvent,若返回false,那麼觸控會向上傳遞。
時序如下
-
Activity的dispatchTouchEvent
-
Activity的onUserInteraction
-
Layout的dispatchTouchEvent
-
Layout的onInterceptTouchEvent
-
Button的onTouchEvent (ACTION_DOWN)
-
Layout的onTouchEvent (ACTION_DOWN)
緊跟著是一個ACTION_UP事件
-
Activity的dispatchTouchEvent(不觸發Activity的onUserInteraction,它對ACTION_UP不起作用。)
-
Layout的dispatchTouchEvent
-
Layout的onInterceptTouchEvent
-
Button的onTouchEvent
onClick事件不再發生。
-
對於鍵盤監聽
VIEW和Activity本身都有相應鍵盤事件的ONKEYUP和ONKEYDOWN
對於VIEW,可以setOnKeyListener監聽鍵盤事件,如果既對VIEW寫了上述偵聽,又覆寫了ONKEYUP,DOWN事件,那麼首先進入ONKEYDOWN,UP。