來做一下筆記吧。(內容有問題,歡迎指正哦^^)
官方文件提到與UI的事件通知,有以下二種方式:
1.定義event Listener並註冊Listener.(Define an event listener and register it with the View.)
Listener的名稱規則 - On
註冊 - setOnClickListener().
2. 覆寫View原有的callback 方法 (Override an existing callback method for the View.)
例:onTouchEvent() 、onTrackballEvent() 、onKeyDown()
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
後面寫的有亂…有空再來修修…抱歉囉!
沒有留言:
張貼留言