在 xml中創(chuàng)建了一個view時,所有在xml中聲明的屬性都會被傳入到view的構造方法中的AttributeSet類型的參數(shù)當中。 通過調用Context的obtainStyledAttributes()方法返回一個TypedArray對象。然后直接用TypedArray對象獲取自定義屬性的值。TypedArray對象是共享的資源,所以在獲取完值之后必須要調用recycle()方法來回收。
自定義控件的屬性發(fā)生改變之后,控件的樣子也可能發(fā)生改變,在這種情況下就需要調用invalidate()方法讓系統(tǒng)去調用view的onDraw()重新繪制。同樣的,控件屬性的改變可能導致控件所占的大小和形狀發(fā)生改變,所以需要調用requestLayout()來請求測量獲取一個新的布局位置。
在onDraw方法中開始繪制之前,應該讓畫筆Paint對象的信息初始化完畢。這是因為View的重新繪制是比較頻繁的,這就可能多次調用onDraw,所以初始化的代碼不應該放在onDraw方法里。
為了避免你的控件看得來遲緩,確保動畫始終保持每秒60幀。
下面是官網給出的優(yōu)化建議:
- 避免不必要的代碼
- 在onDraw()方法中不應該有會導致垃圾回收的代碼。
- 盡可能少讓onDraw()方法調用,大多數(shù)onDraw()方法調用都是手動調用了invalidate()的結果,所以如果不是必須,不要調用invalidate()方法。