淺談自定義View中一些常用的回撥方法
1. 構造方法
1.public View(Context context)
2.public View(Context context, @Nullable AttributeSet attrs)
3.public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
4.public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
構造方法嚴格來說不算回撥,但除了方法一外都不需要我們手動呼叫,而且是自定義View僅有的必須要宣告的方法。
構造方法1:當不在佈局檔案中宣告而在程式碼中建立View時呼叫的方法
構造方法2:當在佈局檔案中宣告,且沒有在styles.xml中預設主題級或item級的預設屬性時呼叫。attrs就是一組佈局檔案中的值(包括預設屬性和自定義屬性)
構造方法3:當在佈局檔案中宣告,在attrs.xml中有宣告一個屬性,並在styles.xml中的主題item宣告這個屬性的值(即View的一組預設屬性)呼叫
構造方法4:當在佈局檔案中宣告,在styles.xml中的主題裡沒有宣告但單獨聲明瞭View的一組預設屬性時呼叫。注意點
2. void onFinishInflate();
當系統解析XML中宣告的View後回撥此方法,呼叫順序:內層View->外層View,如果是viewgroup,適合在這裡獲取子View。注意點
:
如果View沒有在XML中宣告而是直接在程式碼中構造的,則不會回撥此方法
此時無法獲取到View的寬高和位置
3. void onAttachedToWindow();
當view 被新增到window中回撥,呼叫順序:外層View->內層View。在XML中宣告或在程式碼中構造,並呼叫addview(this view)
方法都會回撥該方法。注意點
:
此時View僅僅被新增到View,而沒有開始繪製所以同樣獲取不到寬高和位置
4. void onDetachedFromWindow();
看名字就知道是與void onAttachedToWindow();
對應的方法,在VIew從Window中移除時回撥,如執行removeView()
方法。注意點
:
如果一個View從window中被移除了,那麼其內層View(如果有)也會被一起移除,都會回撥該方法,且會先回調內層View的onDetachedFromWindow()
5. void onWindowFocusChanged(boolean hasWindowFocus);
當View所在的Window獲得或失去焦點時被回撥此方法。除了常見的設定view的onGlobalLayoutListener,也可以通過這個方法取到VIew的寬高和位置;也適合在判斷當失去焦點時停止一些工作,如圖片輪播,動畫執行等,當獲取到焦點後繼續執行。hasWindowFocus
:View所在Window是否獲取到焦點,當該Window獲得焦點時,hasWindowFocus等於true,否則等於false。
6. boolean onTouchEvent(MotionEvent event);
當手指觸控View的時候回撥該方法,前提是觸控事件沒有被攔截或者被子View消費掉。該方法是事件分發流程中最後的消費者。event
:觸控事件物件,包含了該事件的所有資訊,如觸控的型別(down、move、up),觸控位置等。返回值
:true:事件被消費了,false:沒有被消費,事件傳遞到外層View,super方法:同false。