1. 程式人生 > >【Android學習筆記】onInterceptTouchEvent()、onTouchEvent()

【Android學習筆記】onInterceptTouchEvent()、onTouchEvent()

一、資源:

二、重點

  • 首先要明確onInterceptTouchEvent()這個方法只針對於ViewGroup,事件傳到ViewGroup一般先觸發onInterceptTouchEvent(),View是沒有這個方法的
  • 具體傳遞的流程見資源1,很詳細,對理解很有幫助
  • onInterceptTouchEvent()改變事件傳遞的方向
    • false->下一個物件
    • true->本物件
  • onTouchEvent() 用於處理事件,返回值決定當前控制元件是否消費(consume)了這個事件。
    • false->繼續下一步處理
    • true->已經消費,不繼續處理

三、問題思考

1、是不是無論哪種情況下,最後一個發生的onTouchEvent()的返回值均為true?

我做了試驗,onTouchEvent()和onTouchEvent()均返回false情況,一個滑動手勢只捕捉到了ACTION_DOWN

所以我認為android應該是有個機制,讓頂部有效的onTouchEvent自定返回true,按照資源1的描述看來,此後的時間資訊都直接傳給了最頂部的有效onTouchEvent()處理了。

若頂部有效的onTouchEvent自定返回false的話,那麼開始的資訊得不到消費,比如Action_DOWN,那後面的動作也沒辦法觸發啊!


2、我感覺onInterceptTouchEvent()其實只能處理Action_DOWN,因為我覺得問題1正確的話,此後的Action_UP,Action_MOVE都會被最後一個有用的onTouchEvent擷取?

理由同問題描述,資訊最後都彙總到返回true的onTouchEvent哪裡,onInterceptTouchEvent()根本沒有機會啊。

但是在一些程式中,我確實看到了onInterceptTouchEvent()截取了ACTION_MOVE,ACTION_UP等操作,如何實現的,不解!!

“我研究了下。 需要往 screen 加 onclick事件,才能兩個螢幕這樣切換。 沒弄懂onInterceptTouchEvent。 為什麼要加 onclick呢,因為如果不加,那麼 onInterceptTouchEvent return false 也是直接執行 onTouchEvent 而不是繼續執行 onInterceptTouchEvent 如果加了onclick,那麼 onInterceptTouchEvent return false 會直接執行 onInterceptTouchEvent。 求解答。”

首先得明確onInterceptTouchEvent()是ViewGroup的方法,不是View的方法!
前半句好理解:設當前ViewGroup稱為Parent,點選的子View為Child,
所以就算 onInterceptTouchEvent return false它也只能觸發Child和Parent的onTouchEvent, 你那個時候Parent.onTouchEvent返回的應該也是true,此後的動作都直接傳到Parent.onTouchEvent

後半句無法理解,onclick在onTouchEvent中的ACTION_UP實現(參見下一篇),如果問題1的成立,那麼後面的ACTION_MOVE,ACTION_UP都傳不到非頂層的函式,所以說問題1是癥結所在!!