View 事件的分發機制 (一)

Android View 事件

在渲染 佈局 展現 相關事件的觸發順序 總結如下:

Constructors

 onFinishiInflate() 當View 和它的所有子對象從 XML 中導入之後,調用此方法

Layout

 onMeasure(int int ) View 會調用此方法 來確認自己及所有子對象的大小

onLayout(boolean  int int int int int ) : 當View 要爲所有子對象分配大小 和位置時 調用此方法

onSizeChanged(int int int int ) 當View  要 繪製它的內容時 會調用此方法

Drawing 

 onDraw (Canvas ) 當View 要繪製它的內容時 調用此方法

onKeyUp(int, KeyEvent) 當一個按鍵釋放事件發生時,調用此方法 
onMotionEvent(MotionEvent) 當一個動作事件(如觸摸)發生時,調用此方法


Focus 
onFocusChanged(boolean, int) 當View獲得或失去焦點時,調用此方法 

AttachingonAttachedToWindow() 當View附加到一個窗體上時,調用此方法 
onDetachedFromWindow() 當View離開它的窗體時,調用此方法 

當你爲一個 activty 添加一個可見的 view, 並且運行這個activty時,android通常情況下會自動按照下列順序來觸發view的相關事件 
onAttachedToWindow 
onMeasure 
onSizeChanged 
onLayout 
onDraw  

在TouchEvent 中 返回true 則說明 消耗掉了這個事件,返回值是false 則沒有消耗掉,會繼續傳遞下去

在 View 中跟 Touch 相關的事件有 dispatchTouchEvent , interceptTouchEvnet , onTouchEvent 三種。

dispatchTouchEvent 是負責分發事件的,事件從 activity 傳遞出來之後,

最先到達的就是最頂層 view 的 dispatchTouchEvent ,

然後它進行分發,如果返回 false ,

則交給這個 view 的 interceptTouchEvent 方法來決定是否要攔截這個事件,如果 interceptTouchEvent 返回 true ,也就是攔截掉了,則交給它的 onTouchEvent 來處理,如果 interceptTouchEvent 返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchTouchEvent 再來開始這個事件的分發。

如果事件傳遞到某一層的子 view 的 onTouchEvent 上了,這個方法返回了 false ,那麼這個事件會從這個 view 往上傳遞,都是 onTouchEvent 來接收。而如果傳遞到最上面的 onTouchEvent 也返回 false 的話,這個事件就會“消失”,而且接收不到下一次事件。(我說的一次事件指的是 down 到 up 之間的一系列事件) 

 如果這一次事件沒有人消耗掉,則系統不會給你下一次事件,因爲他會認爲你這次的事件阻塞了,沒必要給下一次。onTouchEvent如果不消耗的話,會從子view傳遞到父view

 

發佈了99 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章