一、Drawable簡介
Drawable一般通過XML來定義,Drawable是一個抽象類,是所有Drawable的基類。
二、Drawable分類
1、BitmapDrawable:表示一張圖片,開發中,可以直接引用原始的圖片,但是也可以通過XML來描述它。例如:
<?xml version="1.0" encoding="utf-8">
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawavke/drawable_resource"
android:antialias=["true"|"false"]
android:dither=["true"|"false"]
android:filter=["true"|"false"]
android:gravity=["top"|"bottom"|"left"|"right"|"center_vertical"|"fill_vertical"|"venter_horizontal"|"fill_horizontal"|"center"|"fill"|"clip_vertical"|"clip_horizontal"]
android:mipMap=["true"|"false"]
android:tileMode=["disabled"|"clamp"|"repeat"|"mirror"]/>
src:圖片的資源id
antialias:是否開啓圖片鋸齒功能
dither:是否開啓抖動效果
filter:是否開啓過濾效果
gravity:對圖片進行定位
mipMap:圖像相關的處理技術,也叫紋理映射
tileMode:平鋪模式。
2、ShapeDrawable
ShapeDrawable是一種常見的Drawable,可以理解爲通過顏色來構造的圖形,既可以是純色的圖形,也可以是漸變的圖形。
<?xml version="1.0" encoding="utf-8">
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle"|"oval"|"line"|"ring"]>
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer"/>
<gradient
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="interger"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear"|"radial"|"sweep"]
android:useLevel=["true"|"false"]/>
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer"/>
<size
android:width="integer"
android:height="integer"/>
<solid
android:color="color"/>
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer"/>
</shape>
(1)shape:表示圖形的形狀,rectangle(矩形)、oval(橢圓)、line(橫線)、ring(圓環)
(2)corners:表示shape的角度,只適用於矩形shape
radius:爲四個角同時設定相同的角度,優先級低,會被其他四個屬性覆蓋
toLeftRadius:左上角的角度
toRightRadius:右上角的角度
bottomLeftRadius:左下角的角度
bottomRightRadius:右下角的角度
(3)gradient:與solid標籤互斥,solid純色填充,而gradient漸變效果
angle:漸變的角度,值必須是45的倍數,0表示從左到右,90表示從下到上
centerX:漸變的中心點的橫座標
centerY:漸變的中心點的縱座標,漸變的中心點會影響漸變的具體效果
startColor:漸變的起始色
centerColor:漸變的中間色
endColor:漸變的結束色
gradientRadius:漸變的半徑,當type=“radial”有效
useLevel:一般爲false,當Drawable作爲StateListDrawable使用時爲true
type:漸變的類別,有linear(線性漸變)、radial(徑向漸變)、sweep(掃描線漸變)
(4)solid:純色填充,通過color即可指定shape填充的顏色
(5)stroke:Shape的描邊
width:描邊的寬度,越大則shape的邊緣線就會越粗
color:描邊的顏色
dashWidth:虛線的線段寬度
dashGap:虛線的線段間隔
(6)padding:表示空白,不是shape的空白,是包含的View的空白,有四個屬性:left、top、right、bottom
(7)size:shape的大小:有兩個屬性width和height,表示shape的寬高
3、LayerDrawable
LayerDrawable對應的XML標籤是<layer-list>,表示一種層次的Drawable集合
例如:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#ccc"/>
</shape>
</item>
<item android:bottom="6dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
</shape>
</item>
<item
android:bottom="1dp"
android:left="1dp"
android:right="1dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
</shape>
</item>
</layer-list>
4、StateListDrawable
對應於<selector>標籤,也是表示Drawable集合,每個Drawable對應View的一種狀態。主要用於設置單擊View的背景
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true"|"false"]
android:dither=["true"|"fase"]
android:variablePadding=["true"|"false"]>
<item
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true"|"false"]
android:state_focused=["true"|"false"]
android:state_hovered=["true"|"false"]
android:state_selected=["true"|"false"]
android:state_checkable=["true"|"false"]
android:state_enabled=["true"|"false"]
android:state_activated=["true"|"false"]
android:state_window_focused=["true"|"false"]/>
</selector>
constantSize:是否隨着狀態改變固有大小,默認是false(隨狀態改變而改變)
dither:是否開啓抖動效果
variablePadding:是否隨狀態改變而改變,true改變,false表示StateListDrawable的paddiing是內部所有Drawable的padding的最大值。默認false,不建議開啓
5、LevelListDrawable
對應於<level-list>標籤,表示一個Drawable集合,集合中每個Drawable都有一個等級概念,根據等級不同切換不同Drawable。等級範圍0-10000
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/status_off"
android:maxLevel="0"/>
<item
android:drawable="@drawable/status_on"
android:maxLevel="1"/>
</selector>
6、TransitionDrawable
對應於<ltransition>標籤,用於實現兩個Drawable之間的淡入淡出
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@[package:]@drawable/status_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension"/>
</transition>
7、InsetDrawable
對應於<inset>標籤,可以把其他Drawable內嵌到自己當中,並可以在四周留出一定間距
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="15dp"
android:insetLeft="15dp"
android:insetRight="15dp"
android:insetTop="15dp">
<shape android:shape="rectangle">
<solid android:color="#ff0000">
</shape>
</transition>
8、ScaleDrawable
對應於<scale>標籤,可以根據自己的等級將指定的Drawable縮放到一定比例。
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:idrawable="drawable/drawable_resource"
android:scaleGravity=["top"|"bottom"|"left"|"right"|"center_vertical"|"fill_vertical"|"venter_horizontal"|"fill_horizontal"|"center"|"fill","clip_vertical","clip_horizontal"]
android:scaleHeight="percentage"
android:scaleWidth="percentage">
<shape android:shape="rectangle">
<solid android:color="#ff0000">
</shape>
</transition>
9、ClipDrawable
對應於<clip>標籤,根據自己當前的等級來裁剪另一個Drawable,裁剪方向通過android:clipOrientation和android:gravity控制
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:idrawable="drawable/drawable_resource"
android:clipOrientation=["horizontal"|"vertical"]
android:gravity=["top"|"bottom"|"left"|"right"|"center_vertical"|"fill_vertical"|"venter_horizontal"|"fill_horizontal"|"center"|"fill","clip_vertical","clip_horizontal"]
android:scaleHeight="percentage"
android:scaleWidth="percentage">
<shape android:shape="rectangle">
<solid android:color="#ff0000">
</shape>
</clip>