事件攔截機制簡單分析

1 ViewGroup來說,有三個重要的事件攔截和處理的方法: dispatchTouchEvent (MotionEvent e) , onInterceptTouchEvent(MotionEvent e), onTouchEvent(MotionEvent e)
2 對於View來說,有兩個重要的事件攔截和處理方法: dispatchTouchEvent(MotionEvent e), onTouchEvent(MotionEvent e)
注: 從上述方法可知,有分發事件,攔截事件,處理事件

舉例1
嵌套結構是: 最外層是ViewGroupA,中間層是ViewGroupB,最底層是MyView, 並重寫上述方法,不做任何處理時,執行過程如下,

這裏寫圖片描述

分析: **事件的傳遞順序是: ViewGroupA–>ViewGroupB–>MyView
事件的處理順序是: MyView–>ViewGroupB–>ViewGroupA**
log輸出的記錄爲: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
ViewGroupB onTouchEvent
ViewGroupA onTouchEvent

舉例2
嵌套結構是: 最外層是ViewGroupA,中間層是ViewGroupB,最底層是MyView, 並重寫上述方法,其中ViewGroupA中的onInterceptTouchEvent 事件返回true 將事件攔截下來,執行過程如下,

這裏寫圖片描述

log輸出的記錄爲: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupA onTouchEvent

舉例3
嵌套結構是: 最外層是ViewGroupA,中間層是ViewGroupB,最底層是MyView, 並重寫上述方法,其中ViewGroupB中的onInterceptTouchEvent 事件返回true 將事件攔截下來,執行過程如下,
這裏寫圖片描述

log輸出的記錄爲: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
ViewGroupB onTouchEvent
ViewGroupA onTouchEvent
舉例4
嵌套結構是: 最外層是ViewGroupA,中間層是ViewGroupB,最底層是MyView, 並重寫上述方法,其中MyView中的onTouchEvent 事件返回true 將事件攔截下來,執行過程如下,

這裏寫圖片描述

log輸出的記錄爲: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
舉例5
嵌套結構是: 最外層是ViewGroupA,中間層是ViewGroupB,最底層是MyView, 並重寫上述方法,其中ViewGroupB中的dispatchTouchEvent 事件返回true 將事件攔截下來,執行過程如下,
這裏寫圖片描述

log輸出的記錄爲: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
ViewGroupB onTouchEvent

另: MotionEvent 是android爲觸摸事件封裝的一個類, 觸摸事件就是一個動作的類型加座標就可以完成,
其中可以通過MotionEvent 中的event.getX()與event.getRawX獲取座標點; 通過不同的ACTION(比如 MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE)來區分不用的動作類型.

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