2010年9月11日 星期六

Android - onTouchEvent 、 onClickEvent 、 onLongClickEvent 初步認識

昨天花了將近一天搞了touch event 和 Long touch event。
來做一下筆記吧。(內容有問題,歡迎指正哦^^)

官方文件提到與UI的事件通知,有以下二種方式:

1.定義event Listener並註冊Listener.(Define an event listener and register it with the View.)

Listener的名稱規則 - OnListener
註冊 - setOnClickListener().

2. 覆寫View原有的callback 方法 (Override an existing callback method for the View.)

例:onTouchEvent() 、onTrackballEvent() 、onKeyDown()

onTouchEvent()

大致上就是View家族Activity家族,會擁有onTouchEvent。


而比較重要的是當我們所認知的「一次觸碰」,其實發生了ACTION_DOWN與ACTION_UP。

這麼多類別都有擁有onTouchEvent,會引起的議題即是優先順序。

我們先建立一個Activity 並放置一個LinearLayout。LinearLayout中放置一個TextView。並分別添加onTouchEvent,可參考下圖:





可能還是搞不懂我要做什麼,我們作一個測試,當觸碰TextView時TouchEvent的處理順序為何。

測試結果是TextView → LinearLayout→Activity 。

但實際上的Log是四筆:

TextView_onTouch
LinearLayout_onTouch
Activity_onTouch 
Activity_onTouch 

為什麼Activity_onTouch會被觸發二次?因為「ACTION_DOWN」一次,「ACTION_UP」再一次。

為什麼 ACTION_UP不會觸發TextView與LinearLayout的Touch event?因為在「ACTION_DOWN」時,TextView與LinearLayout都 return false ,故事件不會再傳入。

重要的來了!MotionEvent 一但回傳true後,同一個event都會交由該 function(指回傳true的function)處理,不會再向上呼叫。

同理,如果將TouchEvent稍作修改。TextView - onTouch() 回傳true,結果將會變更為:

TextView_onTouch_ACTION_DOWN
TextView_onTouch_ACTION_UP

後面寫的有亂…有空再來修修…抱歉囉!