前言
Drawable表示的是一種可以在Canvas上進行繪制的抽象的概念。
層次關系
分類
自定義Drawable
有點:1.使用簡單較自定義View;2.非圖片類型的Drawable占用空間小,減少apk體積;3.可以用來做出一些特殊的UI效果。
簡介
Drawable常用來作為View的背景。一般通過XML來定義,通過代碼略顯復雜。
Drawable的內(nèi)部寬高這個參數(shù)比較重要,通過getIntrinsicWidth與getInttrinsicHeight獲取。并不是所有的Drawable都有內(nèi)部寬高。圖片Drawable的內(nèi)部寬高就是圖片的寬高。顏色Drawable是沒有內(nèi)部寬高的。Drawable的內(nèi)部寬高不等同與它的大小。一般來說,Drawable是沒有大小的。當作為View的背景時,會被拉伸/壓縮到View的同等大小。
層次關系
打開Drawable源碼,Ctrl + H打開類的派生結構圖

看到有很多種的Drawable
Drawable的分類
1.BitmapDrawable
<bitmap/>
BitmapDrawable表示一張圖片。實際開發(fā)中,可以直接引用原始的圖片,也可以用XML的方式來描述它來設置更多的效果。比如antialias(抗鋸齒),dither(抖動效果),filter(過濾效果),gravity(圖片在容器的位置)等。
2.ShapeDrawable
<shape/>
實際開發(fā)中這個接觸得比較多。我開發(fā)過的項目中圓角矩形按鈕就用ShapeDrawable作為背景。支持rectangle矩形,oval圓形,line橫線,ring圓環(huán),radius四角圓弧。用顏色填充圖形,支持漸變,描邊支持虛線。drawable固有大小(insrinsic)屬性的含義。有大體了解,用的時候查api就行了。
3.LayerDrawable
<layer-list/>
Drawable疊加,一個<item/>標簽表示一個層。android:top等數(shù)據(jù)表示Drawable相對于View的上下左右偏移量。所有的drawable都會被縮放到View的大小。下面的item會覆蓋上面的item.
4.StateListDrawable
<selector/>
也表示Drawable的集合,每個Drawable對應View的一個狀態(tài)。
要注意的屬性:constantSize表示是否有固定大小,true切換狀態(tài)時最大大小會設置成固有大小。
variablePadding表示是否有固定的padding.
5.LevelDrawable
<level-list/>
也是Drawable的集合,里邊的item可以設置最大最小的level.范圍0-10000.通過Drawable的setLevel方法控制Drawable的顯示。如果作為ImageView的前景,可以用Image的setImageLevel來設置。
7.TransitionDrawable
<transition/>
用于實現(xiàn)Drawable之間的淡入淡出效果。
8.InsetDrawable
<inset/>
當一個View希望自己的背景比自己的實際大小小的時候用InsetDrawable.
9.ScaleDrawable
<scale/>
控制Drawable的縮放.設置scaleWidth與scaleHeight的值來來控制縮放比,同時將level設置,表示縮放的比例,level的值在0到10000之間,也會影響縮放大小
10.ClipDrawable
<clip/>
裁剪Drawable,通過設置level來控制裁剪比例,level的值在0到10000之間。通過android:clipOrigentation與android:gravity來控制裁剪方向。
11.自定義Drawable
Drawable的工作原理是draw方法,重寫draw方法來自定義Drawable.
自定義的Drawable無法在xml中使用,且要注意getIntrinsicXxx方法,因為對View的wrap_content有影響。