標籤:
基於 《android 群英傳 》的讀書筆記
View的測量—onMeasure()
測量的模式可以有以下三種:
EXACTLY
即精確值模式,當我們將控制項的layout_width屬性或layout_height屬性指定為具體參數值時,系統使用的就是EXACTLY
AT_MOST
即最大值模式,當控制項的layout_width屬性或layout_hright屬性是warp_content時,控制項大小一般隨著控制項的子控制項或內容的變化而變化,此時控制項尺寸只要不超過父控制項允許的尺寸即可
UNSPECIFIED
不指定其大小的測量模式,view想多大就多大,通常情況下在繪製view時才會使用。
view類預設的onMeasure()方法只支援EXACTLY的模式,所以如果在自訂控制項的時候不重寫onMeasure()方法的話,就只能使用EXACTLY模式
View 的 繪製——onDraw()
要想在android的介面上繪製相應的映像,就必須在Canvas上進行繪製。Canvas就像是一個畫板,使用paint就可以在上面作畫了。
一般情況下,可以使用重寫view類中的onDraw()方法來繪圖,onDraw()中有一個參數,就是Canvas canvas對象,使用這個對象就可以進行繪圖。
ViewGroup的測量
viewgroup回去管理其子view,其中一個管理項目就是負責子view的顯示大小。當viewgroup的大小為warp_content時,viewgroup就需要對子view進行遍曆,以便獲得所有子view 的大小,從而決定自己的大小,而在其他模式下會通過具體的指定來設定自身的大小
viewgroup在測量時通過遍曆所有的子view,從而調用子view的Measure方法來獲得每一個子view的測量結果,前面所說的對view的測量,就是這裡執行的。
ViewGroup的繪製
viewgroup通常情況下不需要繪製,因為它本身沒有需要繪製的東西,如果不是指定viewgroup的背景顏色,那麼viewgroup的onDraw()方法都不會被調用。但是,viewgroup會使用dispatchDraw()方法來繪製其子view,其過程同樣是通過遍曆所有的子view,並調用子view的繪製方法來完成繪製工作。
自訂view
在自訂View時,我們通常回去重寫onDraw()方法來繪製view的顯示內容。如果該view還需要使用wrap_content屬性,那麼還必須重寫onMeasure()方法。另外,通過自訂attrs屬性,還可以設定新的屬性值。
對現有控制項的擴充
1.對TextView進行擴充 2.閃動的文字效果
建立複合控制項
TopBar 1.定義屬性 系統提供了TypedArray這樣的資料結構來擷取自訂的屬性集--通 過一個方法,將你在atts.xml中定義的declare-styleable的所有 屬性的值儲存到TypedArray中。需要注意的是,當擷取完所有屬性 2.群組控制項 3.引用UI模板 在引用前必須指定引用第三方控制項的名字空間。
View來實現全新的控制項
建立一個自訂view的痛點在於繪製控制項和實現互動。 通常需要繼承View類,並重寫它的onDraw(),onMeasure()等方法來 實現繪製邏輯,同時需要重寫onTouchEvent()等觸控事件來實現互動 邏輯
自訂ViewGroup
側滑效果
Android控制項架構與自訂控制項詳解