可繪制資源是指能夠被繪制到屏幕上的圖形的一般化概念,並且能夠用諸如getDrawable(int)等API方法來獲取這些資源,或者使用諸如android:drawable和android:icon屬性把它們應用到另一個XML資源中。以下是幾種不同的可繪制資源類型:
位圖文件:
位圖圖形文件(.png、.jpg或.gif)。每個位圖資源會創建一個BitmapDrawable對象。
Nine-Patch文件:
Nine-Patch文件是一個帶有可拉伸區域的PNG文件,它允許圖片基於內容進行尺寸的調整(.9.png)。每個Nine-Patch資源會創建一個NinePatchDrawable對象。
層列表:
層列表管理一個繪制資源數組。它們會按照數組的順序進行描畫,因此索引最大的元素被畫在最上面,一個層列表會創建一個LayerDrawable對象。
狀態列表:
狀態列表是一個XML文件,文件中針對不同的狀態定義瞭要引用的不同位圖圖形(例如,按鈕被按下時,要使用的不同的圖片)。一個狀態列表會創建一個StateListDrawable對象。
級別列表:
級別列表是一個定義可替代繪制資源的XML文件,每個資源都會給分配一個最大的數字值,一個狀態列表會創建一個LevelListDrawable對象。
過渡繪制資源:
它是一個定義繪制資源的XML文件,文件中的繪制資源能夠在兩個繪制資源之間漸入漸出。一個XML文件會創建一個TransitionDrawable對象。
插圖繪制資源:
它是一個定義繪制資源的XML文件,文件中的繪制資源能夠按照指定的距離插入到另一個繪制資源中。當View對象需要繪制的背景比View的實際邊框要小時,這個資源是有用的。
剪輯繪制資源:
它是一個定義繪制資源的XML文件,使用文件中的定義,基於繪制資源的當前級別值對另一個繪制資源進行剪輯。它會創建一個ClipDrawable對象。
縮放繪制資源:
它是一個定義繪制資源的XML文件,使用這個文件中的定義會基於當前的級別值來改變另一個繪制資源尺寸。它會創建一個ScaleDrawable對象。
形狀繪制資源:
它是一個定義幾何圖形的XML文件,包括顏色和幾何形狀。它會創建一個ShapeDrawable對象。
註意:在XML中,顏色資源也能夠用於繪制資源。例如,在創建狀態列表繪制資源時,android:drawable屬性就可以引用一個顏色資源(如:android:drawable=”@color/green”)。
位圖
Android支持三種格式的位圖文件:.png(首選)、.jpg(次選)、.gif(不推薦使用)。
可以使用資源ID(文件名)直接引用位圖文件,也可以在XML中創建一個別名資源。
註意:在編譯期間,位圖文件可以被aapt工具用無損圖像壓縮技術來自動的優化。例如,一個真彩色的PNG圖片,不需要超過256色就可以用調試板給轉換成8為的PNG圖片。這樣就會生成同等質量的圖片,但卻需要很少的內存。因此而要註意,放在這個目錄鎮南關的二進制圖片能夠在編譯期間發生改變。如果計劃用字節流來讀取圖片,以便把它轉換成一個位圖,就要把圖片放到res/raw/文件夾鎮南關,這樣它們就不會被優化。
位圖文件
這裡的位圖文件是指.png、.jpg、.gif格式文件。當把這些格式的文件保存在res/drawable/目錄時,Android會給這些文件創建一個繪制資源。
文件位置(FILE LOCATION):
res/drawable/filename.png(.png、.jpg或.gif)。
文件名用於資源ID。
編譯資源的數據類型(COMPILED RESOURCE DATATYPE):
資源指向一個BitmapDrawable對象。
資源引用(RESOURCE REFERENCE):
在Java代碼中:R.drawable.filename;
在XML中:@[package:]drawable/filename
列子(EXAMPLE):
把一個圖片保存在res/drawable/muimage.png中,佈局XML把這個圖片應用於一個View對象:
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/myimage"/>
應用程序在代碼中用getDrawable()方法來獲取Drawable對象:
Resources res=getResources();
Drawable drawable= res.getDrawable(R.drawable.myimage);
XML位圖
XML位圖是一個定義在XML中的資源,它指向一個位圖文件。它是原始位圖文件的一個別名。XML能夠給位圖指定額外的屬性,如仿色和平鋪。
註意:能夠把<bitmap>元素作為<item>元素的子元素來使用。例如,在創建狀態列表或層列表時,能夠從<item>元素中排除android:drawable屬性,並且在<item>元素內部嵌入一個<bitmap>元素來定義繪制項目。
文件位置(FILE LOCATION):
res/drawable/filename.xml
文件名被用作資源ID。
編譯資源的數據類型(COMPILED RESOURCE DATATYPE):
資源指向一個BitmapDrawable對象。
資源引用(RESOURCE REFERENCE):
在Java代碼中:R.drawable.filename
在XML中:@[package:]drawable/filename
語法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
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:tileMode=["disabled" |"clamp" |"repeat" | "mirror"]/>
元素(ELEMENTS):
<bitmap>
用來定義位圖資源和資源屬性。
屬性(ATTRIBUTES):
xmlns:android
字符串值,定義XML的命名空間,必須是“http://schemas.android.com/apk/res/android”。如果<bitmap>是根元素,那麼這個屬性就是必須的。當<bitmap>被嵌套在<item>內時,就不需要瞭。
android:src
繪制資源。必須的。它指向一個要繪制的資源。
android:antialias
佈爾值。啟用或禁用抗鋸齒效果。
android:dither
佈爾值。如果位圖沒有與屏幕相同的像素配置,這個屬性會指示啟用或禁用位圖的仿色處理。
android:filter
佈爾值,啟用或禁用位圖的過濾處理。在位圖收縮或拉伸時,使用過濾處理讓外觀更平滑。
android:gravity
關鍵屬性。定義位圖的重心。如果位圖比容器小,重心會指示繪制資源在容器中位置。
必須是下列常量值的組合(組合設定時使用”|”符號分離):
值 | 說明 |
top | 把對象放到它的容器的頂部,不改變對象的尺寸。 |
bottom | 把對象放到它的容器的底部,不改變對象的尺寸。 |
left | 把對象放到它的容器的左邊緣,不改變對象的尺寸。 |
right | 把對象放到它的容器的右邊緣,不改變對象的尺寸。 |
center_vertical | 把對象放到它的容器的垂直中心,不改變對象的尺寸。 |
fill_vertical | 如果需要,對象的垂直尺寸會增長,以便垂直方向完全填充它的容器。 |
center_horizontal | 把對象放到它的容器的水平中心,不改變對象的尺寸。 |
fill_horizontal | 如果需要,對象的水平尺寸會增長,以便水平方向完全填充它的容器。 |
center | 把對象放到容器的中心位置,不改變尺寸。 |
fill | 如果需要,對象的水平和垂直尺寸都會增長,以便能夠完全填充它的容器。 |
clip_vertical | 附加選項,能夠設置把子對象的上邊緣或下邊緣裁剪到容器邊框位置。裁剪要基於垂直中心的設置,top時要裁剪下邊緣,bottom時要裁剪上邊緣,而不是上下都要裁剪。 |
clip_horizontal | 附加選項,能夠設置把子對象的左邊緣或右邊緣裁剪到容器邊框位置。裁剪要基於水平中心的設置,left時要裁剪右邊緣,right時要裁剪左邊緣,而不是兩邊都要裁剪。 |
android:tileMode
關鍵屬性,指定采用平鋪模式繪制資源,當這個模式被啟用時,位圖會被重復繪制,以便能夠完全填充繪制區域。在平鋪模式啟用時,重心會被忽略。
這個模式必須設置下列常量值之一:
值 | 說明 |
disabled | 不平鋪位圖,這是默認值。 |
clamp | 如果要在原始邊框的外部繪制陰影,則復制邊緣的顏色。 |
repeat | 在水平和垂直方向重復繪制帶陰影的圖片。 |
mirror | 在水平和垂直方向重復繪制帶陰影的圖片,交替復制,以便相鄰的圖片之間始終有縫隙。 |
例子(EXAMPLE):
<?xml version="1.0" encoding="utf-8"?>
<bitmapxmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon"
android:tileMode="repeat"/>
摘自 FireOfStar的專欄