1. 程式人生 > >淺談自定義View中一些常用的回撥方法

淺談自定義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的一組預設屬性時呼叫。注意點

: 屬性賦值優先順序:Xml定義 (方法二)> Xml的style定義(方法二) > defStyleAttr (方法三)> defStyleRes> theme直接定義(方法四) 構造方法四要求api21以上,所以我們一般採用構造方法二(沒有預設屬性)或構造方法三(有預設屬性)

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。