自定義組件_事件處理機制

1、Android的事件觸發和響應過程
這裏寫圖片描述
A、事件完整的響應過程:
先傳遞事件:Activity -> ViewGroup -> View
再處理事件:View -> ViewGroup -> Activity

事件傳遞和處理過程中涉及的幾個方法:
1)分發事件
public boolean dispatchTouchEvent(MotionEvent ev)
向子組件傳遞事件的動力源
Activity、ViewGroup、View都有該方法,該方法不管返回true還是false都會阻止事件的繼續傳遞。所以,dispatchTouchEvent方法的返回值一般都要設置爲return super.dispatchTouchEvent(ev)。

2)攔截事件
public boolean onInterceptTouchEvent(MotionEvent ev)
用於攔截事件的傳遞,可以用於防止事件繼續傳遞
只有ViewGroup纔有該方法。

3)響應處理事件
public boolean onTouchEvent(MotionEvent event)
該方法默認返回true。
返回值爲true表示事件已被組件處理完畢,組件的上一級不會繼續處理該事件。
返回值爲false表示事件還可以讓上一級組件繼續處理。

2、事件場景理解
這裏寫圖片描述
場景1:不攔截事件,也不處理事件
這裏寫圖片描述
在一個事件週期中,事件有“記憶”的功能,如果事件沒有任何組件來處理,則ACTION_MOVE的動作直接交給最外層處理。

場景2:把TextView的clickable屬性手動改成true,或者直接重寫onTouchEvent()方法,使其返回true。
這裏寫圖片描述
場景3:手動重寫LinearLayout的onInterceptTouchEvent()方法,使其返回true,攔截事件,再重寫onTouchEvent()方法,返回true
這裏寫圖片描述
注意:
(1)這一系列的傳遞流程都是dispatchTouchEvent()方法來控制的,如果不人爲地干預,事件將由上自下依次傳遞(因爲默認是返回false不會攔截的),傳遞到最底層的View,就由它的onTouchEvent()方法來處理事件,若處理成功返回true,若處理失敗返回false,事件依次向上傳遞,每個View都調用自己的onTouchEvent()方法來處理事件,若處理成功就終止傳遞,若處理失敗就繼續向上傳遞。

(2)經過人爲的干預,若在向下傳遞的過程中被攔截了,即onInterceptTouchEvent()方法返回true,則事件將停止向下傳遞,直接由當前的onTouchEvent()方法來處理,若處理成功則OK,若處理不成功,則事件會向上傳遞。

(3)另外,dispatchTouchEvent()方法中還有“記憶”的功能,如果第一次事件向下傳遞到某View,它把事件繼續傳遞交給它的子View,它會記錄該事件是否被它下面的View給處理成功了,(怎麼能知道呢?如果該事件會再次被向上傳遞到我這裏來由我的onTouchEvent()來處理,那就說明下面的View都沒能成功處理該事件);當第二次事件向下傳遞到該View,該View的dispatchTouchEvent()方法機會判斷,若上次的事件由下面的view成功處理了,那麼這次的事件就繼續交給下面的來處理,若上次的事件沒有被下面的處理成功,那麼這次的事件就不會向下傳遞了,該View直接調用自己的onTouchEvent()方法來處理該事件。

(4)“記憶”功能的信息只在一系列事件完成之前有效,如從ACTION_DOWN事件開始,直到後續事件ACTION_MOVE,ACTION_UP結束後,“記憶”的信息就會清除。也就是說如果某View處理ACTION_DOWN事件失敗了(onTouchEvent()返回false),那麼後續的ACTION_MOVE,ACTION_UP等事件就不會再傳遞到該View了,由其父View自己來處理。在下一次發生ACTION_DOWN事件的時候,還是會傳遞到該View的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章