drawable在android中主要的作用是作為背景或者直接用于imageView。使用好drawable對開發項目很有幫助。
下面介紹下android中的drawable及其用法:
1、BitmapDrawable
它表示一張圖片。在實際開發中,我們可以直接引用原始的圖片資源即可,但是也可以通過XML的方法來描述它,通過XML來描述的BitmapDrawable可以設置更多的效果,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/ic_launcher"
android:antialias="true|false"
android:dither="true|false"
android:filter="true|false"
android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal|fill_horizontal|center|fill|clip_vertical|clip_horizontal"
android:mipMap="true|false"
android:tileMode="disabled|clamp|repeat|mirror"/>
它各個屬性的含義如下:
android:src
圖片的資源id
android:antialias
是否開啟圖片的抗鋸齒功能。會一定程序的降低圖片的清晰度,但是這個降低的幅度較低以至于可以忽略。
android:dither
是否開啟抖動效果。當圖片的像素配置和手機屏幕的像素配置不一致時,開啟這個選項可以讓高質量的圖片在低質量的屏幕上還能保持較好的顯示效果,比如圖片的色彩模式為ARG8888,但是設備屏幕所支持的色彩模式為RGB555,這個時候開啟抖動選項可以讓圖片顯示不會過于失真。在Android中創建的Bitmap一般會選用ARG8888這個模式,即ARGB四個通道各占8位,在這種色彩模式下,一個像素所占的大小為4個字節,一個像素的位數總和越高,圖像也就越逼真。
android:filter
是否開啟過濾效果。當圖片尺寸被拉伸或者壓縮時,開啟過濾效果可以保持較好的顯示效果。
android:gravity
沒什么好說的
android:mipMap
這是一種圖象相關的處理技術,也叫紋理映射。知道有這么個東西就好了。。。
android:tileMode
平鋪模式。這個選項有幾個值:disabled、clamp、repeat、mirror。
這里要注意開啟平鋪模式gravity屬性會被忽略。其中disabled是關閉,clamp是擴展,mirror是鏡像,repeat是重復。
2、ShapeDrawable
ShapeDrawable是一種很常見的Drawable,可以理解為通過顏色來構造的圖形,它既可以是純色的圖形,也可以是漸變效果的圖形。ShapeDrawable的語法稍顯復雜,如下所示。
<?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:bottomLeftRadius="integer"
android:bottomRightRadius="integer"
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer" />
<gradient
android:angle="integer"
android:centerColor="integer"
android:centerX="integer"
android:centerY="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type="linear|radial|sweep"
android:useLevel="true|false" />
<padding
android:bottom="integer"
android:left="integer"
android:right="integer"
android:top="integer" />
<size
android:width="integer"
android:height="integer" />
<solid android:color="color" />
<stroke
android:width="integer"
android:color="color"
android:dashGap="integer"
android:dashWidth="integer" />
</shape>
android:shape
表示圖形形狀:rectangle(矩形)、oval(橢圓)、line(橫線)、ring(圓環),默認矩形,
line和ring必須有< stroke>標簽來指定寬度和顏色,否則達不到預期效果。
< gradient>
漸變效果,與< solid>標簽互斥
< solid>
純色填充 通過android:color即可指定shape的顏色
< padding>
這個表示空白,但是它表示的不是shape的空白,而是包含它的view的空白,有四個屬性:left、top、right、bottom。
3、LayerDrawable
表示的是一種層次化的Drawable集合,通過將不同的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="#0ac39e" />
</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>
一個layer-list可以包含多個item,每個item代表一個drawable,item的結構也比較簡單,常用屬性有left、right、to、bottom分別表示drawable相對于View的上下左右的偏移量,單位為像素。默認情況下,layer-list中的所有的drawable都會被縮放到View的大小,對于bitmap來說,需要使用gravity屬性才能控制圖片的顯示效果。layer-list有層次的概念,下面的item會覆蓋上面的item,通過合理的分層,可以實現特殊的疊加效果。
4、StateListDrawable
StateListDrawable對應于<selector>標簽,它也表示drawble集合,每個drawable對應著View的一種狀態,這樣系統就會根據View的狀態來選擇合適的drawble。
android:constantSize
StateListDrawable的固有大小是否不隨著其狀態的改變而改變的,因為狀態的改變會導致StateListDrawable切換到具體的Drawable,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不變,這時它的固有大小是內部所有Drawable的固大小的最大值,false則會隨著狀態的改變而改變。此選項默認值為false。
android:dither
是否開啟抖動效果,這個在BitmapDrawable中也有提到,開啟此選項可以讓圖片在低質量的屏幕上仍然獲得較好的顯示效果。此選項默認值為true。
android:variablePadding
StateListDrawable的padding表示是否隨著其狀態的改變而改變,true表示會隨著狀態的改變而改變,false表示StateListDrawable的padding是內部所有Drawable的padding的最大值。此選項默認值為false,并且不建議開啟此選項。
5、LevelListDrawable
LevelListDrawable對應于<level-list>標簽,它同樣表示一個drawable集合,集合中的每個drawable都有一個等級(level)的概念。根據不同的等級,LevelListDrawable會切換為對應的drawable,它的語法如下所示。
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shapedrawable"
android:maxLevel="0"/>
<item android:drawable="@drawable/bitmapdrawable"
android:maxLevel="1"/>
</level-list>
6、TransitionDrawable
對應于<transition>標簽,它用于實現兩個drawable之間的淡入淡出效果。