可绘制资源是图形的一般概念,是指可在屏幕上绘制的图形,以及可使用 getDrawable(int) 等 API 检索,或应用到具有 android:drawable 和 android:icon 等属性的其他 XML 资源的图形。可绘制对象包含以下多种类型:
- 位图文件
- 位图图形文件(PNG、WEBP、JPG 或 GIF)。
可创建
BitmapDrawable。 - 9-patch 文件
- 具有可伸缩区域的 PNG 文件,支持根据内容调整图像大小 (
.9.png)。可创建NinePatchDrawable。 - 图层列表
- 管理其他可绘制对象数组的可绘制对象。这些可绘制对象按数组顺序绘制,因此索引最大的元素绘制于顶部。可创建
LayerDrawable。 - 状态列表
- 此 XML 文件用于为不同状态引用不同位图图形,例如,点按按钮时使用不同图像。可创建
StateListDrawable。 - 级别列表
- 此 XML 文件用于定义管理大量备选可绘制对象的可绘制对象,每个可绘制对象都配有最大备选数量。可创建
LevelListDrawable。 - 转换可绘制对象
- 此 XML 文件用于定义可在两种可绘制资源之间交错淡出的可绘制对象。可创建
TransitionDrawable。 - 插入可绘制对象
- 此 XML 文件用于定义以指定距离插入其他可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景可绘制对象时,此类可绘制对象非常有用。
- 裁剪可绘制对象
- 此 XML 文件用于定义对其他可绘制对象进行裁剪(根据其当前级别值)的可绘制对象。可创建
ClipDrawable。 - 缩放可绘制对象
- 此 XML 文件用于定义更改其他可绘制对象大小(根据其当前级别值)的可绘制对象。可创建
ScaleDrawable。 - 形状可绘制对象
- 此 XML 文件用于定义几何图形形状(包括颜色和渐变)。可创建
GradientDrawable。
如需了解如何创建 AnimationDrawable,请参阅动画资源文档。
注意:颜色资源也可用作 XML 中的可绘制对象。例如,在创建状态列表可绘制对象时,可以引用 android:drawable 属性的颜色资源 (android:drawable="@color/green")。
位图
位图图像。Android 支持以下格式的位图文件:PNG(首选)、WEBP(首选,需要 API 级别 17 或更高级别)、JPG(可接受)、GIF(不建议)。
您可以通过将文件名作为资源 ID 来直接引用位图文件,也可以在 XML 中创建别名资源 ID。
注意:在构建过程中,aapt 工具可能会自动使用无损图像压缩来优化位图文件。例如,一个不需要超过 256 种颜色的真彩色 PNG 可能会根据调色板被转换为 8 位 PNG。这样可以得到同等质量但需要更少内存的图像。
因此请注意,此目录中的图像二进制文件在构建时可能会发生变化。如果您打算以比特流的形式读取图像,进而将其转换为位图,请改为将图像放在 res/raw/ 文件夹中,避免系统对其进行优化。
位图文件
位图文件可以是 PNG、WEBP、JPG 或 GIF 文件。当您将任一位图文件保存到 res/drawable/ 目录中时,Android 会为其创建 Drawable 资源。
- 文件位置:
res/drawable/filename.png(.png、.webp、.jpg或.gif)
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
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进行检索:Kotlin
val drawable: Drawable? = ResourcesCompat.
getDrawable(resources, R.drawable.myimage, null)Java
Resources res =
getResources(); Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null); - 另请参阅:
XML 位图
XML 位图是在 XML 文件中定义的资源,指向位图文件。实际上是原始位图文件的别名。XML 可以指定位图的其他属性,例如抖动和平铺。
注意:您可以将 <bitmap> 元素用作 <item> 元素的子项。例如,在创建状态列表或图层列表时,您可以从 <item> 元素中排除 android:drawable 属性,并在其中嵌套用于定义可绘制项的 <bitmap>。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
BitmapDrawable的资源指针 - 资源引用:
-
在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 语法:
-
<?xml version="1.0" encodin>g<="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" encodin>g<="utf-8"? bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic>on" android:tileMode="repeat" /
- 另请参阅:
9-patch
NinePatch 是一种 PNG 图像,您可在其中定义可伸缩区域,以便 Android 在视图中的内容超出正常图像边界时进行缩放。此类图像通常被指定为至少具有一个尺寸设置为 "wrap_content" 的视图背景。
当视图增大以适应内容时,9-patch 图像也会按照视图的大小进行缩放。例如,Android 的标准 Button widget 所使用的背景便是 9-patch 图像,它必须通过伸缩来适应按钮内的文本(或图像)。
与普通位图一样,您可直接引用 9-patch 文件,也可以从通过 XML 定义的资源引用。
如需完整了解如何创建包含可伸缩区域的 9-patch 文件,请参阅创建可调整大小的位图(9-patch 文件)。
9-patch 文件
- 文件位置:
res/drawable/filename.9.png
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
NinePatchDrawable的资源指针 - 资源引用:
-
在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 示例:
- 当图像保存为
res/drawable/myninepatch.9.png后,此布局 XML 会将 9-patch 应用到视图:<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/myninepatch" />
- 另请参阅:
XML 9-patch
XML 9-patch 是在 XML 中定义的资源,指向 9-patch 文件。XML 可以为图像指定抖动。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
NinePatchDrawable的资源指针 - 资源引用:
-
在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 语法:
-
<?xml version="1.0" encodin>g<="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" encodin>g<="utf-8"? nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/mynine>patch" android:dither="false" /
图层列表
LayerDrawable 是管理其他可绘制对象数组的可绘制对象。列表中的每个可绘制对象均按照列表顺序绘制。列表中的最后一个可绘制对象绘于顶部。
每个可绘制对象均由单个 <layer-list> 元素内的 <item> 元素表示。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
LayerDrawable的资源指针 - 资源引用:
-
在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 语法:
-
<?xml version="1.0" encoding=<"utf-8"?> layer-list xmlns:android="http://schemas.a>ndroi<d.com/apk/res/android" item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" pan>android:top="dimension" android:right="dimension&qu>o<t; android:bottom="dimension" android:left="dimension" / /layer-list>
- 元素:
- 示例:
- 保存在
res/drawable/layers.xml的 XML 文件:<?xml version="1.0" encodin>g<="utf-8"? layer-list xmlns:android="http://schemas.and>roid.<com/>apk/res</android" item bitmap android:src="@drawable/android_red&>quot;< > a<ndroid:gravity="center" / /it>em <item android:top="10dp" android:left="10dp" bitmap an>droid<:src=>"<;@drawable/android_green" andr>oid:gra<vity="center" / /item item android:top="20dp" andr>oid:l<eft=&>q<uot;20dp&qu>ot; bitmap android:src="@drawable/android_blue" android:gravity="center" / /item /layer-list
此示例使用嵌套的
<bitmap>元素为每个具有"center"重心的项定义可绘制资源。这可确保不会有图像为适应容器的大小而缩放,因为偏移图像会造成大小调整。此布局 XML 会将可绘制对象应用到视图:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src=>"@drawable/layers" /
结果是一堆不断偏移的图像:
- 另请参阅:
状态列表
StateListDrawable 是在 XML 文件中定义的可绘制对象,它会根据对象状态,使用多个图像来表示同一个图形。例如,Button widget 的状态可以是按下、聚焦或既不按下也不聚焦;而使用状态列表可绘制对象,您可以为每种状态提供不同的背景图像。
您可以在 XML 文件中描述状态列表。每个图形均由单个 <selector> 元素内的 <item> 元素表示。每个 <item> 使用各种属性来描述其用作可绘制对象图形的状态。
在每次状态更改期间,系统将从上到下遍历状态列表,并且将使用与当前状态匹配的第一项。系统的选择并非基于“最佳匹配”,而是基于符合状态的最低标准的第一项。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
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>
- 元素:
- 示例:
- 保存在
res/drawable/button.xml的 XML 文件:<?xml version="1.0" encoding=<"utf-8"?> selector xmlns:android="http://schemas.androi<d.com/apk/res/android"> item android:state_pressed="true" a<ndroid:drawabl>e=&qu<ot;@drawable/button_pressed" /> !-- pressed -- item android:state_focused="<;true" > < android:drawable="@drawable/button_focused" /> !-- focused -- item andr<oid:state_hove>red=&<quot;true" android:drawable="@d<rawable/button>_<focused" /> !-- hovered -- item android:drawable="@drawable/button_normal" /> !-- default -- /selector>
此布局 XML 将状态列表可绘制对象应用到按钮:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/button" />
- 另请参阅:
级别列表
管理大量备选可绘制对象的可绘制对象,每个可绘制对象都配有最大备选数量。若使用 setLevel() 设置可绘制对象的级别值,则系统会加载级别列表中 android:maxLevel 值大于或等于传递至方法的值的可绘制资源。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
LevelListDrawable的资源指针 - 资源引用:
-
在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 语法:
-
<?xml version="1.0" encoding=<"utf-8"?> level-list xmlns:android="http://schemas.a>ndroi<d.com/apk/res/android" item android:drawable="@drawable/drawable_resource" android:maxLevel=&qu>o<t;integer&q>uot; android:minLevel="integer" / /level-list
- 元素:
- 示例:
-
<?xml version="1.0" encoding=<"utf-8"?> level-list xmlns:android="http://schemas.a>ndroi<d.com/apk/res/android" item android:drawable="@drawable/stat>us_of<f" android:maxLevel="0" / item android:drawable>=<"@draw>able/status_on" android:maxLevel="1" / /level-list
将此项应用到
View后,您便可通过setLevel()或setImageLevel()更改级别。 - 另请参阅:
转换可绘制对象
TransitionDrawable 是可以在两种其他可绘制资源之间交错淡出的可绘制对象。
每个可绘制对象均由单个 <transition> 元素内的 <item> 元素表示。不支持超过两个项。如要向前转换,请调用 startTransition()。如要向后转换,请调用 reverseTransition()。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
TransitionDrawable的资源指针 - 资源引用:
-
在 Java 中:
R.drawable.filename
在 XML 中:@[package:]drawable/filename - 语法:
-
<?xml version="1.0" encoding=<"utf-8"?> transition xmlns:android="http://schemas.a>ndroi<d.com/apk/res/android" item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" pan>android:top="dimension" android:right="dimension&qu>o<t; android:bottom="dimension" android:left="dimension" / /transition>
- 元素:
- 示例:
- 保存在
res/drawable/transition.xml的 XML 文件:<?xml version="1.0" encodin>g<="utf-8"? transition xmlns:android="http://schemas.and>roid.<com/apk/res/android" item and>roid:<drawable="@drawable/on" / > <item androi>d:drawable="@drawable/off" / /transition
此布局 XML 会将可绘制对象应用到视图:
<ImageButton android:id="@+id/button" android:layout_height="wrap_content" android:layout_width="wrap_content" androi>d:src="@drawable/transition" /
以下代码会执行从第一项到第二项的 500 ms 转换:
Kotlin
val button: ImageButton = findViewById(R.id.button) val drawable: Drawable = button.drawable if (drawable is TransitionDrawable) { drawable.startTransition(500) }
Java
ImageButton button = (ImageButton) findViewById(R.id.button); Drawable drawable = button.getDrawable(); if (drawable instanceof TransitionDrawable) { ((TransitionDrawable) drawable).startTransition(500); }
- 另请参阅:
插入可绘制对象
在 XML 文件中定义的可绘制对象,用于以指定距离插入其他可绘制对象。当视图需要小于视图实际边界的背景时,此类可绘制对象很有用。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
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" andr>oid: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:ins>etTop="10dp" android:insetLeft="10dp" /
- 另请参阅:
裁剪可绘制对象
在 XML 文件中定义的可绘制对象,用于对其他可绘制对象进行裁剪(根据其当前级别)。您可以根据级别以及用于控制其在整个容器中位置的重心,来控制子级可绘制对象的裁剪宽度和高度。通常用于实现进度条之类的内容。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
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"] /
- 元素:
- 示例:
- 保存在
res/drawable/clip.xml的 XML 文件:<?xml version="1.0" encoding=<"utf-8"?> clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/android" android:clipOrientatio>n="horizontal" android:gravity="left" /
以下布局 XML 会将裁剪可绘制对象应用到视图:
<ImageView android:id="@+id/image" android:src="@drawable/clip" android:layout_height="wrap_content" android:layout_width="wrap_content" />
以下代码用于获取可绘制对象,并增加裁剪量,以便逐渐显示图像:
Kotlin
val imageview: ImageView = findViewById(R.id.image) val drawable: Drawable = imageview.background if (drawable is ClipDrawable) { drawable.level = drawable.level + 1000 }
Java
ImageView imageview = (ImageView) findViewById(R.id.image); Drawable drawable = imageview.getBackground(); if (drawable instanceof ClipDrawable) { ((ClipDrawable)drawable).setLevel(drawable.getLevel() + 1000); }
通过提高级别,即可减少裁剪量并慢慢显示图像。以下图像的级别为 7,000:
注意:默认级别为 0,即完全裁剪,使图像不可见。当级别为 10,000 时,图像不会被裁剪,而是完全可见。
- 另请参阅:
缩放可绘制对象
在 XML 文件中定义的可绘制对象,用于更改其他可绘制对象的大小(根据其当前级别)。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
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" | n>"ce>nter" | "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" and>roid:scaleHeight="80%" android:scaleWidth="80%" /
- 另请参阅:
形状可绘制对象
这是一种在 XML 文件中定义的通用形状。
- 文件位置:
res/drawable/filename.xml
文件名即为资源 ID- 编译后的资源数据类型:
- 指向
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=["rectang<le" | "oval" | "line" | "ring"] > corners android:radius="integer" android:topLeftRadius="integer" android:topRightRadius=&q>uot;i<nteger" 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" |> &quo<t;radial" | "sweep"] android:useLevel=["tru>e&quo<t; | "false"] / an>padding> < android:left="integer" android:top="integer" android:right="integer" android:botto>m<="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>
- 元素:
- 示例:
- 保存在
res/drawable/gradient_box.xml的 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" androi<d:endColor="#80FF00FF" android:angle="45"/> padding android:left="7dp" < android:top="7dp&quo<t; 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" />
此应用代码会获取形状可绘制对象,并将其应用到视图:
Kotlin
val shape: Drawable? =
getDrawable(resources, R.drawable.gradient_box,getTheme()) val tv: TextView = findViewById(R.id.textview) tv.background = shapeJava
Resources res =
getResources(); Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box,getTheme()); TextView tv = (TextView)findViewById(R.id.textview); tv.setBackground(shape); - 另请参阅: