可绘制资源是屏幕上可绘制图形的一般概念,您可以使用诸如 getDrawable(int)
之类的 API 检索它,或使用诸如 android:drawable
和 android:icon
之类的属性将其应用于其他 XML 资源。有几种类型的可绘制资源
- 位图文件
- 位图图形文件 (PNG、WEBP、JPG 或 GIF)。创建
BitmapDrawable
。 - 九宫格文件
- 一个具有可伸缩区域的 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" 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" />
- 另请参阅
九宫格
九宫格是 PNG 图像,您可以在其中定义可伸缩区域,当视图中的内容超过正常图像边界时,Android 会缩放这些区域。您通常将此类型的图像分配给至少有一个维度设置为 "wrap_content"
的视图的背景。
当视图增长以适应内容时,九宫格图像也会缩放以匹配视图的大小。九宫格图像的一个示例用法是 Android 标准 Button
窗口小部件使用的背景,该窗口小部件必须能够伸展以适应按钮内的文本(或图像)。
与普通位图一样,您可以直接或从 XML 定义的资源中引用九宫格文件。
有关如何使用可伸缩区域创建九宫格文件的完整讨论,请参阅 创建可调整大小的位图(9 宫格文件)。
九宫格文件
- 文件位置
res/drawable/filename.9.png
文件名是资源 ID- 编译后的资源数据类型
- 指向
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- 编译后的资源数据类型
- 指向
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" />
图层列表
图层可绘制对象是一个可绘制对象,它管理其他可绘制对象的数组。列表中的每个可绘制对象都按列表顺序绘制。列表中的最后一个可绘制对象绘制在最上面。
每个可绘制对象都由单个 <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.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>
元素为每个项目定义可绘制资源,并使用"center"
重力。这确保了由于偏移图像引起的调整大小,没有任何图像被缩放以适应容器的大小。此布局 XML 将可绘制对象应用于视图
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/layers" />
结果是一堆偏移量逐渐增大的图像
- 另请参阅
状态列表
一个StateListDrawable
是在 XML 中定义的可绘制对象,它使用多个图像来表示相同的图形,具体取决于对象的状体。例如,Button
小部件的状体可以是被点击、获得焦点或两者都不是;使用状体列表可绘制对象,您可以为每种状体提供不同的背景图像。
您可以在 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>
- 元素
- 示例
- 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 将状体列表可绘制对象应用于按钮
<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.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()
更改级别。 - 另请参阅
过渡可绘制资源
一个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.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" />
以下代码执行从第一个项目到第二个项目的 500 毫秒过渡
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" 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 中定义的可绘制对象,它根据此可绘制对象的当前级别裁剪另一个可绘制对象。您可以根据级别控制子可绘制对象在宽度和高度上被裁剪的程度,以及控制其在整体容器中放置位置的重力。最常用于实现进度条等功能。
- 文件位置
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"] />
- 元素
- 示例
- 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: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); }
增加级别会减少裁剪量并缓慢显示图像。这里它处于 7000 级。
注意:默认级别为 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" | "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- 编译后的资源数据类型
- 指向
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" />
此应用程序代码获取形状可绘制对象并将其应用于视图。
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); - 另请参阅