# Android Drawable子類整理
概述
Drawable資源是Android應用中使用最廣泛的資源,它不僅可以使用各種格式的圖片資源,也可以使用多種xml檔案資源。
1.一種可以在Canvas上進行繪製的抽象的概念;
2.顏色、圖片等都可以是一個Drawable;
3.Drawable可以通過XML定義,或者通過程式碼建立;
4.Android中Drawable是一個抽象類,每個具體的Drawable都是其子類;
Drawable的分類
Drawable的子類包括ColorDrawable、GradientDrawable、BitmapDrawable、NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、StateListDrawable、TransitionDrawable、VectorDrawable、ShapeDrawable
1.ColorDrawable
A specialized Drawable that fills the Canvas with a specified color.
ColorDrawable是最簡單的Drawable,也是平時用的最多的,比如:
android:background = "@color/colorAccent"
ColorDrawable是一個專門用來使用指定的顏色來填充畫布的Drawable,當它被繪製到畫布上時會使用一種指定的顏色填充Paint,在畫布上繪製出一塊單色區域。
在xml檔案中使用color作為根節點來建立ColorDrawable,它只有一個android:color屬性,通過它來決定ColorDrawable的顏色,這個顏色一旦設定之後,就不能直接修改了。
<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ff000000"
/>
通過java程式碼也可以建立ColorDrawable,程式碼如下:
ColorDrawable drawable = new ColorDrawable(0xff000000);
2.BitmapDrawable
A Drawable that wraps a bitmap and can be tiled, stretched, or aligned.
BitmapDrawable是對bitmap的一種包裝,可以設定它包裝的bitmap在BitmapDrawable區域內的繪製方式,如平鋪、拉伸填充或者保持圖片原始尺寸,也可以在BitmapDrawable區域內部使用gravity指定的對齊方式。
在xml檔案中使用bitmap作為根節點來定義BitmapDrawable。
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/arrow_down"
android:tileMode="mirror"
android:antialias="true"
android:dither="true"
/>
其中,src為引用的圖片資源;tileMode屬性表示平鋪模式,一共有4中屬性:mirror,repeat,clamp,disabled;dither屬性表示是否開啟抖動,一般為true;antialias屬性表示是否開啟抗鋸齒功能,一般為true;
也可以使用java程式碼實現上述相同的效果,等價的java程式碼如下:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.arrow_down);
BitmapDrawable mBitmapDrawable = new BitmapDrawable(bitmap);
mBitmapDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);
mBitmapDrawable.setAntiAlias(true);
mBitmapDrawable.setDither(true);
mDrawable = mBitmapDrawable;
3.GradientDrawable
A Drawable with a color gradient for buttons, backgrounds, etc.
GradientDrawable表示一個漸變區域,可以實現線性漸變、發散漸變和平鋪漸變效果;
在xml檔案中使用shape作為根節點來建立GradientDrawable,它包含很多屬性和子節點,具體如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle | oval | ring | line">
// 矩形
//內部填充色
<solid android:color="@color/red" />
//圓角半徑
<corners android:radius="5dp" />
//邊框顏色和寬度
<stroke android:color="@color/orange" android:width="5dp" />
//漸變色
<gradient
android:angle="integer" //漸變角度(預設為0,即從左到右),須為45的倍數,為0時從左到右
//為90時從上到下,該屬性僅對線性漸變有效
android:centerX="integer" //漸變中心X的相對位置,範圍從0~1
android:centerY="integer" //漸變中心Y的相對位置,範圍從0~1
android:startColor="color" //顏色漸變的開始顏色
android:centerColor="integer" //顏色漸變的中心顏色
android:endColor="color" //顏色漸變的結束顏色
android:gradientRadius="integer" //漸變半徑,只有當type為radial時才能使用
android:type=["linear" | "radial" | "sweep"] //預設值為linear,即線性漸變,radial(放射性漸變),sweep(掃描式漸變)
android:useLevel=["true" | "false"] //設定為false才有漸變效果
/>
//指定大小
<size android:width="45dp" android:height="45dp" />
//內邊距
<padding
android:left="5dp" android:top="5dp"
android:right="5dp" android:bottom="5dp" />
4.ScaleDrawable
ScaleDrawable是對一個Drawable進行縮放操作,可以根據level屬性控制這個drawable的縮放比例,也可以設定它在容器中的對齊方式。在xml檔案中使用scale作為根節點來建立RotateDrawable,建立ScaleDrawable的程式碼如下: