Android復習(二)應用資源——>可繪制對象資源
可繪制對象資源是圖形的一般概念,是指可在屏幕上繪制的圖形,以及可使用 getDrawable(int) 等 API 檢索,或應用到擁有 android:drawable 和 android:icon 等屬性的其他 XML 資源的圖形??衫L制對象包含以下多種類型:
- 位圖文件
- 位圖圖形文件(
.png、.jpg或.gif)。創(chuàng)建BitmapDrawable。 - 九宮格文件
- 具有可伸縮區(qū)域的 PNG 文件,支持根據(jù)內(nèi)容調(diào)整圖像大小 (
.9.png)。創(chuàng)建NinePatchDrawable。 - 圖層列表
- 管理其他可繪制對象陣列的可繪制對象。這些可繪制對象按陣列順序繪制,因此索引最大的元素繪制于頂部。創(chuàng)建
LayerDrawable。 - 狀態(tài)列表
- 此 XML 文件用于為不同狀態(tài)引用不同位圖圖形(例如,按下按鈕時使用不同圖像)。創(chuàng)建
StateListDrawable。 - 級別列表
- 此 XML 文件用于定義管理大量備選可繪制對象的可繪制對象,每個可繪制對象都配有最大備選數(shù)量。創(chuàng)建
LevelListDrawable。 - 轉(zhuǎn)換可繪制對象
- 此 XML 文件用于定義可在兩種可繪制對象資源之間交錯淡出的可繪制對象。創(chuàng)建
TransitionDrawable。 - 插入可繪制對象
- 此 XML 文件用于定義以指定距離插入其他可繪制對象的可繪制對象。當視圖需要小于視圖實際邊界的背景可繪制對象時,此類可繪制對象非常有用。
- 裁剪可繪制對象
- 此 XML 文件用于定義對其他可繪制對象進行裁剪(根據(jù)其當前級別值)的可繪制對象。創(chuàng)建
ClipDrawable。 - 縮放可繪制對象
- 此 XML 文件用于定義更改其他可繪制對象大?。ǜ鶕?jù)其當前級別值)的可繪制對象。創(chuàng)建
ScaleDrawable - 形狀可繪制對象
- 此 XML 文件用于定義幾何形狀(包括顏色和漸變)。創(chuàng)建
GradientDrawable。
另請參閱動畫資源文檔,了解如何創(chuàng)建 AnimationDrawable。
請注意:顏色資源也可用作 XML 中的可繪制對象。例如,在創(chuàng)建狀態(tài)列表可繪制對象時,可以引用 android:drawable 屬性的顏色資源 (android:drawable="@color/green")。
位圖
位圖圖像。Android 支持以下三種格式的位圖文件:.png(首選)、.jpg(可接受)、.gif(不建議)。
您可以使用文件名作為資源 ID 直接引用位圖文件,也可以在 XML 中創(chuàng)建別名資源 ID。
注:在構建過程中,可通過 aapt 工具自動優(yōu)化位圖文件,對圖像進行無損壓縮。例如,不需要超過 256 色的真彩色 PNG 可通過調(diào)色板轉(zhuǎn)換為 8 位 PNG。這樣產(chǎn)生的圖像質(zhì)量相同,但所需內(nèi)存更少。因此請注意,此目錄中的圖像二進制文件在構建時可能會發(fā)生變化。如果您打算以比特流的形式讀取圖像,進而將其轉(zhuǎn)換為位圖,請改為將圖像放在 res/raw/ 文件夾中,避免系統(tǒng)對其進行優(yōu)化。
位圖文件
位圖文件是 .png、.jpg 或 .gif 文件。當您將任一位圖文件保存到 res/drawable/ 目錄中時,Android 會為其創(chuàng)建 Drawable 資源。
- 文件位置:
res/drawable/filename.png(.png、.jpg或.gif)
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
BitmapDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 示例:
- 當圖像保存為
res/drawable/myimage.png后,此布局 XML 會將該圖像應用至視圖:<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />以下應用代碼將圖像作為
Drawable進行檢索:java代碼: Resources res = getResources(); Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null); kotlin代碼: val drawable: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.myimage, null)
- 另請參閱:
XML 位圖
XML 位圖是在 XML 文件中定義的資源,指向位圖文件。實際上是原始位圖文件的別名。XML 可以指定位圖的其他屬性,例如抖動和層疊。
注:您可以將 <bitmap> 元素用作 <item> 元素的子項。例如,在創(chuàng)建狀態(tài)列表或圖層列表時,可以將 android:drawable 屬性從 <item> 元素中排除,并在其中嵌套用于定義可繪制項的 <bitmap>。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
BitmapDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?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:mipMap=["true" | "false"] android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] /> - 元素:
- 示例:
-
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon" android:tileMode="repeat" /> - 另請參閱:
九宮格
NinePatch 是一種 PNG 圖像,您可在其中定義可伸縮區(qū)域,以便 Android 在視圖中的內(nèi)容超出正常圖像邊界時進行縮放。此類圖像通常指定為至少有一個尺寸設置為 "wrap_content" 的視圖背景,而且當視圖通過擴展來適應內(nèi)容時,九宮格圖像也會通過擴展來匹配視圖的大小。舉例而言,Android 的標準 Button 微件所使用的背景便是典型的九宮格圖像,其必須通過伸縮來適應按鈕內(nèi)的文本(或圖像)。
與普通位圖一樣,您可直接引用九宮格文件,也可通過 XML 定義資源對其進行引用。
如需完整了解如何創(chuàng)建包含可伸縮區(qū)域的九宮格文件,請參閱 2D 圖形文件。
九宮格文件
- 文件位置:
res/drawable/filename.9.png
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
NinePatchDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 示例:
- 當圖像保存為
res/drawable/myninepatch.9.png后,此布局 XML 會將九宮格應用到視圖:<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/myninepatch" /> - 另請參閱:
XML 九宮格
XML 九宮格是在 XML 中定義的資源,指向九宮格文件。XML 可以為圖像指定抖動。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
NinePatchDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:dither=["true" | "false"] /> - 元素:
- 示例:
-
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/myninepatch" android:dither="false" />
圖層列表
LayerDrawable 是管理其他可繪制對象陣列的可繪制對象。列表中的每個可繪制對象均按照列表順序繪制,列表中的最后一個可繪制對象繪于頂部。
每個可繪制對象由單一 <layer-list> 元素內(nèi)的 <item> 元素表示。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
LayerDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </layer-list> - 元素:
- 示例:
- XML 文件保存在
res/drawable/layers.xml中:<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:src="@drawable/android_red" android:gravity="center" /> </item> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android_green" android:gravity="center" /> </item> <item android:top="20dp" android:left="20dp"> <bitmap android:src="@drawable/android_blue" android:gravity="center" /> </item> </layer-list>請注意,此示例使用嵌套的
<bitmap>元素為每個具有“中心”重力的項目定義可繪制對象資源。這可確保沒有圖像會為了適應容器的大小而縮放,因為偏移圖像會造成大小調(diào)整。此布局 XML 會將可繪制對象應用到視圖:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/layers" />結果是一堆不斷偏移的圖像:
![]()
- 另請參閱:
狀態(tài)列表
StateListDrawable 是在 XML 文件中定義的可繪制對象,它會根據(jù)對象狀態(tài),使用多個不同的圖像來表示同一個圖形。例如,Button 微件可以是多種不同狀態(tài)(按下、聚焦或這兩種狀態(tài)都不是)中的其中一種,并且您可利用狀態(tài)列表可繪制對象,為每種狀態(tài)提供不同的背景圖片。
您可以在 XML 文件中描述狀態(tài)列表。每個圖形由單一 <selector> 元素內(nèi)的 <item> 元素表示。每個 <item> 均使用各種屬性來描述應用作可繪制對象的圖形的狀態(tài)。
在每個狀態(tài)變更期間,將從上到下遍歷狀態(tài)列表,并使用第一個與當前狀態(tài)匹配的項目 —此選擇并非基于“最佳匹配”,而是選擇符合狀態(tài)最低條件的第一個項目。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
StateListDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize=["true" | "false"] android:dither=["true" | "false"] 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_checked=["true" | "false"] android:state_enabled=["true" | "false"] android:state_activated=["true" | "false"] android:state_window_focused=["true" | "false"] /> </selector> - 元素:
- 示例:
- XML 文件保存在
res/drawable/button.xml中:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_pressed" /> <!-- pressed --> <item android:state_focused="true" android:drawable="@drawable/button_focused" /> <!-- focused --> <item android:state_hovered="true" android:drawable="@drawable/button_focused" /> <!-- hovered --> <item android:drawable="@drawable/button_normal" /> <!-- default --> </selector>此布局 XML 將狀態(tài)列表可繪制對象應用到按鈕:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/button" /> - 另請參閱:
級別列表
管理大量備選可繪制對象的可繪制對象,每個可繪制對象都配有最大備選數(shù)量。若使用 setLevel() 設置可繪制對象的級別值,則會加載級別列表中 android:maxLevel 值大于或等于傳遞至方法的值的可繪制對象資源。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
LevelListDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/drawable_resource" android:maxLevel="integer" android:minLevel="integer" /> </level-list> - 元素:
- 示例:
-
<?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" /> </level-list>在將此項目應用到
View后,您便可通過setLevel()或setImageLevel()更改級別。 - 另請參閱:
轉(zhuǎn)換可繪制對象
TransitionDrawable 是可在兩種可繪制對象資源之間交錯淡出的可繪制對象。
每個可繪制對象由單個 <transition> 元素內(nèi)的 <item> 元素表示。不支持超過兩個項目。如要向前轉(zhuǎn)換,請調(diào)用 startTransition()。如要向后轉(zhuǎn)換,則調(diào)用 reverseTransition()。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
TransitionDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </transition> - 元素:
- 示例:
- XML 文件保存在
res/drawable/transition.xml中:<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/on" /> <item android:drawable="@drawable/off" /> </transition>此布局 XML 會將可繪制對象應用到視圖:
<ImageButton android:id="@+id/button" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/transition" />以下代碼會執(zhí)行從第一個項目到第二個項目的 500ms 轉(zhuǎn)換:
java代碼: ImageButton button = (ImageButton) findViewById(R.id.button); Drawable drawable = button.getDrawable(); if (drawable instanceof TransitionDrawable) { ((TransitionDrawable) drawable).startTransition(500); } kotlin代碼: val button: ImageButton = findViewById(R.id.button) val drawable: Drawable = button.drawable if (drawable is TransitionDrawable) { drawable.startTransition(500) } - 另請參閱:
插入可繪制對象
在 XML 文件中定義,以指定距離插入其他可繪制對象的可繪制對象。當視圖需要小于視圖實際邊界的背景時,此類可繪制對象很有用。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
InsetDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:insetTop="dimension" android:insetRight="dimension" android:insetBottom="dimension" android:insetLeft="dimension" /> - 元素:
- 示例:
-
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/background" android:insetTop="10dp" android:insetLeft="10dp" /> - 另請參閱:
裁剪可繪制對象
在 XML 文件中定義,對其他可繪制對象進行裁剪(根據(jù)其當前級別)的可繪制對象。您可以根據(jù)級別以及用于控制其在整個容器中位置的重力,來控制子可繪制對象的裁剪寬度和高度。通常用于實現(xiàn)進度欄之類的項目。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
ClipDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:clipOrientation=["horizontal" | "vertical"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] /> - 元素:
- 示例:
- XML 文件保存在
res/drawable/clip.xml中:<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/android" android:clipOrientation="horizontal" android:gravity="left" />以下布局 XML 會將裁剪可繪制對象應用到視圖:
<ImageView android:id="@+id/image" android:background="@drawable/clip" android:layout_height="wrap_content" android:layout_width="wrap_content" />以下代碼用于獲取可繪制對象,并增加裁剪量,以便逐漸顯示圖像:
java代碼: ImageView imageview = (ImageView) findViewById(R.id.image); Drawable drawable = imageview.getBackground(); if (drawable instanceof CLipDrawable) { ((ClipDrawable)drawable).setLevel(drawable.getLevel() + 1000); } kotlin代碼: val imageview: ImageView = findViewById(R.id.image) val drawable: Drawable = imageview.background if (drawable is ClipDrawable) { drawable.level = drawable.level + 1000 }通過提高級別,即可減少裁剪量并慢慢顯示圖像。以下圖像的級別為 7000:
請注意:默認級別為 0,即完全裁剪,使圖像不可見。當級別為 10,000 時,圖像不會裁剪,而是完全可見。
- 另請參閱:
縮放可繪制對象
在 XML 文件中定義的更改其他可繪制對象大?。ǜ鶕?jù)其當前級別)的可繪制對象。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
ScaleDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] android:scaleHeight="percentage" android:scaleWidth="percentage" /> - 元素:
- 示例:
-
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/logo" android:scaleGravity="center_vertical|center_horizontal" android:scaleHeight="80%" android:scaleWidth="80%" /> - 另請參閱:
形狀可繪制對象
這是一種在 XML 文件中定義的通用形狀。
- 文件位置:
res/drawable/filename.xml
文件名用作資源 ID。- 編譯資源的數(shù)據(jù)類型:
- 指向
GradientDrawable的資源指針。 - 資源引用:
- 在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 語法:
-
<?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="float" android:centerY="float" android:centerColor="integer" 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> - 元素:
- 示例:
- XML 文件保存在
res/drawable/gradient_box.xml中:<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="45"/> <padding android:left="7dp" android:top="7dp" android:right="7dp" android:bottom="7dp" /> <corners android:radius="8dp" /> </shape>此布局 XML 會將形狀可繪制對象應用到視圖:
<TextView android:background="@drawable/gradient_box" android:layout_height="wrap_content" android:layout_width="wrap_content" />此應用代碼會獲取形狀可繪制對象,并將其應用至視圖:
java代碼: Resources res = getResources(); Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box, getTheme()); TextView tv = (TextView)findViewById(R.id.textview); tv.setBackground(shape); kotlin代碼: val shape: Drawable? = getDrawable(resources, R.drawable.gradient_box, getTheme()) val tv: TextView = findViewById(R.id.textview) tv.background = shape


浙公網(wǎng)安備 33010602011771號