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