可绘制资源是图形的一般概念,是指可在屏幕上绘制的图形,以及可使用 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 会将该图像应用到视图:
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);
另请参阅:
可绘制对象概览
BitmapDrawable
XML 位图
XML 位图是在 XML 文件中定义的资源,指向位图文件。实际上是原始位图文件的别名。XML 可以指定位图的其他属性,例如抖动和平铺。
注意:您可以将 元素用作 - 元素的子项。例如,在创建状态列表或图层列表时,您可以从
- 元素中排除 android:drawable 属性,并在其中嵌套用于定义可绘制项的 。
文件位置:
res/drawable/filename.xml
文件名即为资源 ID
编译后的资源数据类型:
指向 BitmapDrawable 的资源指针
资源引用:
在 Java 中:R.drawable.filename
在 XML 中:@[package:]drawable/filename
语法:
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"] />
元素:
必需。定义位图来源及其属性。
属性:
xmlns:android
字符串。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"。仅当 为根元素时才需要此属性,而当 嵌套在 - 内时无需此属性。
android:src
可绘制资源。必需。引用可绘制资源。
android:antialias
布尔值。启用或停用抗锯齿。
android:dither
布尔值。当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。
android:filter
布尔值。启用或停用位图过滤。当位图缩小或拉伸以使其外观平滑时使用过滤功能。
android:gravity
关键字。定义位图的重心。重心指示当位图小于容器时,可绘制对象在其容器中放置的位置。必须是以下一个或多个常量值,以 | 分隔:
值说明
top
将对象放在其容器顶部,不改变其大小。
bottom
将对象放在其容器底部,不改变其大小。
left
将对象放在其容器左侧边缘,不改变其大小。
right
将对象放在其容器右侧边缘,不改变其大小。
center_vertical
将对象放在其容器的纵轴中心,不改变其大小。
fill_vertical
根据需要在纵轴扩展对象的大小,使其完全适应容器的大小。
center_horizontal
将对象放在其容器的横轴中心,不改变其大小。
fill_horizontal
根据需要在横轴扩展对象的大小,使其完全适应容器的大小。
center
将对象放在其容器的纵轴和横轴中心,不改变其大小。
fill
根据需要在横轴和纵轴扩展对象的大小,使其完全适应容器的大小。这是默认值。
clip_vertical
可设置为将子元素的顶部边缘和/或底部边缘裁剪为其容器边界的附加选项。裁剪基于纵轴重心:顶部重心裁剪底部边缘,底部重心裁剪顶部边缘,且任一重心均不会同时裁剪两个边缘。
clip_horizontal
可设置为将子元素的左侧边缘和/或右侧边缘裁剪为其容器边界的附加选项。裁剪基于纵轴重心:左侧重心裁剪右侧边缘,右侧重心裁剪左侧边缘,且任一重心均不会同时裁剪两个边缘。
android:mipMap
布尔值。启用或停用 mipmap 提示。如需了解详情,请参阅 setHasMipMap()。默认值为 false。
android:tileMode
关键字。定义平铺模式。当平铺模式启用时,位图会重复。在平铺模式处于启用状态时,重心会被忽略。
必须是以下常量值之一:
值说明
disabled
不平铺位图。这是默认值。
clamp
在着色器绘制范围超出其原始边界时复制边缘颜色
repeat
水平和竖直重复着色器的图像。
mirror
水平和竖直重复着色器的图像,交替镜像图像以使相邻图像始终相接。
示例:
android:src="@drawable/icon"
android:tileMode="repeat" />
另请参阅:
BitmapDrawable
创建别名资源
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 应用到视图: