可绘制对象资源

可绘制资源是图形的一般概念,是指可在屏幕上绘制的图形,以及可使用 getDrawable(int) 等 API 检索,或应用到具有 android:drawableandroid: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" 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"] />
元素:
<bitmap>
必需。定义位图来源及其属性。

属性:

xmlns:android
字符串。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"。仅当 <bitmap> 为根元素时才需要此属性,而当 <bitmap> 嵌套在 <item> 内时无需此属性。
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 水平和竖直重复着色器的图像,交替镜像图像以使相邻图像始终相接。
示例:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon"
    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" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:dither=["true" | "false"] />
元素:
<nine-patch>
必需。定义 9-patch 来源及其属性。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
android:src
可绘制资源。必需。引用 9-patch 文件。
android:dither
布尔值。当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。
示例:
<?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> 元素内的 <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>
元素:
<layer-list>
必需。该元素必须是根元素。包含一个或多个 <item> 元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
<item>
定义放于图层可绘制对象中的可绘制对象,位置由其属性定义。必须为 <layer-list> 元素的子项。接受子级 <bitmap> 元素。

属性:

android:drawable
可绘制资源。必需。引用可绘制资源。
android:id
资源 ID。此可绘制对象的唯一资源 ID。如要为此项创建新的资源 ID,请使用以下形式:"@+id/name"。加号表示其是作为新 ID 创建的。您可以使用此 ID 检索和修改拥有 View.findViewById()Activity.findViewById() 的可绘制对象。
android:top
尺寸。顶部偏移量,采用尺寸值或尺寸资源的形式。
android:right
尺寸。右侧偏移量,采用尺寸值或尺寸资源的形式。
android:bottom
尺寸。底部偏移量,采用尺寸值或尺寸资源的形式。
android:left
尺寸。左侧偏移量,采用尺寸值或尺寸资源的形式。

默认情况下,所有可绘制项都会缩放以适应所包含视图的大小。因此,将图像放在图层列表中的不同位置可能会增大视图的大小,并且有些图像会相应地缩放。

为避免缩放列表中的项,请在 <item> 元素内使用 <bitmap> 元素指定可绘制对象,并且针对某些不缩放的项(例如 "center")定义重心。例如,以下 <item> 定义了缩放以适应其容器视图的项:

<item android:drawable="@drawable/image" />

为避免缩放,以下示例使用重心居中的 <bitmap> 元素:

<item>
  <bitmap android:src="@drawable/image"
          android:gravity="center" />
</item>
示例:
保存在 res/drawable/layers.xml 的 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 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>
元素:
<selector>
必需。该元素必须是根元素。包含一个或多个 <item> 元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
android:constantSize
布尔值。如果可绘制对象报告的内部大小在状态变更时保持不变,则值为 true(大小是所有状态的最大值);如果大小根据当前状态而变化,则值为 false。默认值为 false。
android:dither
布尔值。值为 true 时,将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动;值为 false 时则停用抖动。默认值为 true。
android:variablePadding
布尔值。如果可绘制对象的内边距根据当前所选状态而变化,则为 true;如果该内边距必须保持不变(基于所有状态的最大内边距),则为 false。如要启用此功能,您需要在状态变更时处理执行布局,而这通常不受支持。默认值为 false。
<item>
定义在某些状态下使用的可绘制对象,状态通过其属性来描述。必须为 <selector> 元素的子项。

属性:

android:drawable
可绘制资源。必需。引用可绘制资源。
android:state_pressed
布尔值。如果是在点按对象时(例如轻触按钮时)使用此项,则为 true;如果是在默认的非点按状态下使用此项,则为 false。
android:state_focused
布尔值。如果是在对象具有输入焦点时(例如当用户选择文本输入时)使用此项,则为 true;如果是在默认的非聚焦状态下使用此项,则为 false。
android:state_hovered
布尔值。如果是在光标悬停在对象上时使用此项,则为 true;如果是在默认的非悬停状态下使用此项,则为 false。通常情况下,这个可绘制对象可以是用于“聚焦”状态的同一可绘制对象。

此项为 API 级别 14 中的新增配置。

android:state_selected
布尔值。如果是在使用定向控件进行导航(例如使用方向键浏览列表)时对象为用户当前选择时使用此项,则为 true;如果是在未选择对象时使用此项,则为 false。

android:state_focused 不充分(例如,列表视图具有焦点,且使用方向键选中其中某项)时,使用所选状态。

android:state_checkable
布尔值。如果是在对象可供选择时使用此项,则为 true;如果是在对象不可选择时使用此项,则为 false。仅适用于对象可在可选择和不可选择的 widget 之间转换的情况。
android:state_checked
布尔值。如果是在对象被选择时使用此项,则为 true;如果是在对象未被选择时使用此项,则为 false。
android:state_enabled
布尔值。如果是在启用对象(即能够接收轻触或点击事件)时使用此项,则为 true;如果是在停用对象时使用此项,则为 false。
android:state_activated
布尔值。如果是在对象处于永久选择启用状态(例如,在常驻导航视图中“突出显示”之前选择的列表项)时使用此项,则为 true;如果是在对象处于未启用状态时使用此项,则为 false。

此项为 API 级别 11 中的新增配置。

android:state_window_focused
布尔值。如果是在应用窗口具有焦点(即应用位于前台)时使用此项,则为 true;如果是在应用窗口没有焦点(例如通知栏下拉或出现一个对话框)时使用此项,则为 false。

注意:Android 将应用状态列表中第一个与对象当前状态匹配的项。因此,如果列表中的第一项不包含上述任何状态属性,则每次都会应用该项。因此,请将默认值始终放在最后,如以下示例所示。

示例:
保存在 res/drawable/button.xml 的 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>
元素:
<level-list>
必需。该元素必须是根元素。包含一个或多个 <item> 元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
<item>
定义要在某特定级别使用的可绘制对象。

属性:

android:drawable
可绘制资源。必需。引用要插入的可绘制资源。
android:maxLevel
整数。此项允许的最高级别。
android:minLevel
整数。此项允许的最低级别。
示例:
<?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>
元素:
<transition>
必需。该元素必须是根元素。包含一个或多个 <item> 元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
<item>
定义要用作可绘制对象转换一部分的可绘制对象。必须为 <transition> 元素的子项。接受子级 <bitmap> 元素。

属性:

android:drawable
可绘制资源。必需。引用可绘制资源。
android:id
资源 ID。此可绘制对象的唯一资源 ID。如要为此项创建新的资源 ID,请使用以下形式:"@+id/name"。加号表示其是作为新 ID 创建的。您可以使用此 ID 检索和修改拥有 View.findViewById()Activity.findViewById() 的可绘制对象。
android:top
整数。顶部偏移量(以像素为单位)。
android:right
整数。右侧偏移量(以像素为单位)。
android:bottom
整数。底部偏移量(以像素为单位)。
android:left
整数。左侧偏移量(以像素为单位)。
示例:
保存在 res/drawable/transition.xml 的 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 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"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
元素:
<inset>
必需。定义插入可绘制对象。该元素必须是根元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
android:drawable
可绘制资源。必需。引用要插入的可绘制资源。
android:insetTop
尺寸。顶部插入,采用尺寸值或尺寸资源的形式。
android:insetRight
尺寸。右侧插入,采用尺寸值或尺寸资源的形式。
android:insetBottom
尺寸。底部插入,采用尺寸值或尺寸资源的形式。
android:insetLeft
尺寸。左侧插入,采用尺寸值或尺寸资源的形式。
示例:
<?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"] />
元素:
<clip>
必需。定义裁剪可绘制对象。该元素必须是根元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
android:drawable
可绘制资源。必需。引用要裁剪的可绘制资源。
android:clipOrientation
关键字。裁剪方向。

必须是以下常量值之一:

说明
horizontal 水平裁剪可绘制对象。
vertical 竖直裁剪可绘制对象。
android:gravity
关键字。指定可绘制对象中要裁剪的位置。

必须是以下一个或多个常量值,以 | 分隔:

说明
top 将对象放在其容器顶部,不改变其大小。当 clipOrientation"vertical" 时,在可绘制对象的底部裁剪。
bottom 将对象放在其容器底部,不改变其大小。当 clipOrientation"vertical" 时,在可绘制对象的顶部裁剪。
left 将对象放在其容器左侧边缘,不改变其大小。这是默认值。当 clipOrientation"horizontal" 时,在可绘制对象的右侧裁剪。
right 将对象放在其容器右侧边缘,不改变其大小。当 clipOrientation"horizontal" 时,在可绘制对象的左侧裁剪。
center_vertical 将对象放在其容器的纵轴中心,不改变其大小。裁剪行为与重心为 "center" 时相同。
fill_vertical 根据需要在纵轴扩展对象的大小,使其完全适应容器的大小。当 clipOrientation"vertical" 时,不会进行裁剪,因为可绘制对象会填充垂直空间(除非可绘制对象级别为 0,此时它不可见)。
center_horizontal 将对象放在其容器的横轴中心,不改变其大小。裁剪行为与重心为 "center" 时相同。
fill_horizontal 根据需要在横轴扩展对象的大小,使其完全适应容器的大小。当 clipOrientation"horizontal" 时,不会进行裁剪,因为可绘制对象会填充水平空间(除非可绘制对象级别为 0,此时它不可见)。
center 将对象放在其容器的纵轴和横轴中心,不改变其大小。当 clipOrientation"horizontal" 时,在左侧和右侧裁剪。当 clipOrientation"vertical" 时,在顶部和底部裁剪。
fill 根据需要在横轴和纵轴扩展对象的大小,使其完全适应容器的大小。不会进行裁剪,因为可绘制对象会填充水平和竖直空间(除非可绘制对象级别为 0,此时它不可见)。
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: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);
}

通过提高级别,即可减少裁剪量并慢慢显示图像。以下图像的级别为 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" |
                          "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:scaleHeight="percentage"
    android:scaleWidth="percentage" />
元素:
<scale>
必需。定义缩放可绘制对象。该元素必须是根元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
android:drawable
可绘制资源。必需。引用可绘制资源。
android:scaleGravity
关键字。指定缩放后的重心位置。

必须是以下一个或多个常量值,以 | 分隔:

说明
top 将对象放在其容器顶部,不改变其大小。
bottom 将对象放在其容器底部,不改变其大小。
left 将对象放在其容器左侧边缘,不改变其大小。这是默认值。
right 将对象放在其容器右侧边缘,不改变其大小。
center_vertical 将对象放在其容器的纵轴中心,不改变其大小。
fill_vertical 根据需要在纵轴扩展对象的大小,使其完全适应容器的大小。
center_horizontal 将对象放在其容器的横轴中心,不改变其大小。
fill_horizontal 根据需要在横轴扩展对象的大小,使其完全适应容器的大小。
center 将对象放在其容器的纵轴和横轴中心,不改变其大小。
fill 根据需要在横轴和纵轴扩展对象的大小,使其完全适应容器的大小。
clip_vertical 可设置为将子元素的顶部边缘和/或底部边缘裁剪为其容器边界的附加选项。裁剪基于纵轴重心:顶部重心裁剪底部边缘,底部重心裁剪顶部边缘,且任一重心均不会同时裁剪两个边缘。
clip_horizontal 可设置为将子元素的左侧边缘和/或右侧边缘裁剪为其容器边界的附加选项。裁剪基于纵轴重心:左侧重心裁剪右侧边缘,右侧重心裁剪左侧边缘,且任一重心均不会同时裁剪两个边缘。
android:scaleHeight
百分比。缩放高度,表示为可绘制对象边界的百分比。值的格式为 XX%,例如 100% 或 12.5%。
android:scaleWidth
百分比。缩放宽度,表示为可绘制对象边界的百分比。值的格式为 XX%,例如 100% 或 12.5%。
示例:
<?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>
元素:
<shape>
必需。形状可绘制对象。该元素必须是根元素。

属性:

xmlns:android
字符串。必需。定义 XML 命名空间,该命名空间必须为 "http://schemas.android.com/apk/res/android"
android:shape
关键字。定义形状的类型。有效值包括:
说明
"rectangle" 用于填充所包含视图的矩形。这是默认形状。
"oval" 适应所包含视图尺寸的椭圆形状。
"line" 跨越所包含视图宽度的水平线。此形状需要 <stroke> 元素定义线宽。
"ring" 环形。

仅当 android:shape="ring" 时才使用以下属性:

android:innerRadius
尺寸。环形内部(中间的孔)的半径,采用尺寸值或尺寸资源的形式。
android:innerRadiusRatio
浮点数。环形内部的半径,以环形宽度的比率表示。例如,如果 android:innerRadiusRatio="5",则内半径等于环形宽度除以 5。此值会被 android:innerRadius 替换。默认值为 9。
android:thickness
尺寸。环形的厚度,采用尺寸值或尺寸资源的形式。
android:thicknessRatio
浮点数。环形的厚度,以环形宽度的比率表示。例如,如果 android:thicknessRatio="2",则厚度等于环形宽度除以 2。此值会被 android:innerRadius 替换。默认值为 3。
android:useLevel
布尔值。如果此属性用作 LevelListDrawable,该值为 true。通常情况下,此值为 false,否则形状可能无法显示。
<corners>
为形状创建圆角。仅当形状为矩形时适用。

属性:

android:radius
尺寸。所有角的半径,采用尺寸值或尺寸资源的形式。每个角的此属性都会被以下属性替换。
android:topLeftRadius
尺寸。左上角的半径,采用尺寸值或尺寸资源的形式。
android:topRightRadius
尺寸。右上角的半径,采用尺寸值或尺寸资源的形式。
android:bottomLeftRadius
尺寸。左下角的半径,采用尺寸值或尺寸资源的形式。
android:bottomRightRadius
尺寸。右下角的半径,采用尺寸值或尺寸资源的形式。

注意:刚开始时,必须为每个角提供值大于 1 的角半径,否则无法产生圆角。如果希望特定角不要成为圆角,解决方法是使用 android:radius 将默认角半径值设置为大于 1,然后使用实际所需的值替换每个角,从而为不希望成为圆角的角提供 0 值(“0 dp”)。

<gradient>
指定形状的渐变颜色。

属性:

android:angle
整数。渐变的角度(以度为单位)。0 为从左到右,90 为从下到上。该属性值必须是 45 的倍数。默认值为 0。
android:centerX
浮点数。渐变中心的相对 X 轴位置 (0 - 1.0)。
android:centerY
浮点数。渐变中心的相对 Y 轴位置 (0 - 1.0)。
android:centerColor
颜色。起始颜色与结束颜色之间的可选颜色,采用十六进制值或颜色资源的形式。
android:endColor
颜色。结束颜色,采用十六进制值或颜色资源的形式。
android:gradientRadius
浮点数。渐变的半径。仅当 android:type="radial" 时适用。
android:startColor
颜色。起始颜色,采用十六进制值或颜色资源的形式。
android:type
关键字。要应用的渐变图案的类型。有效值包括:
说明
"linear" 线性渐变。这是默认值。
"radial" 径向渐变。起始颜色为中心颜色。
"sweep" 扇形渐变。
android:useLevel
布尔值。如果此属性用作 LevelListDrawable,该值为 true。
<padding>
要应用到所包含视图元素的内边距。这会填充视图内容的位置,而非形状。

属性:

android:left
尺寸。左侧内边距,采用尺寸值或尺寸资源的形式。
android:top
尺寸。顶部内边距,采用尺寸值或尺寸资源的形式。
android:right
尺寸。右侧内边距,采用尺寸值或尺寸资源的形式。
android:bottom
尺寸。底部内边距,采用尺寸值或尺寸资源的形式。
<size>
形状的大小。

属性:

android:height
尺寸。形状的高度,采用尺寸值或尺寸资源的形式。
android:width
尺寸。形状的宽度,采用尺寸值或尺寸资源的形式。

注意:默认情况下,形状根据此处定义的尺寸,按比例缩放至容器视图的大小。在 ImageView 中使用形状时,您可以通过将 android:scaleType 设置为 "center" 来限制缩放。

<solid>
用于填充形状的纯色。

属性:

android:color
颜色。应用于形状的颜色,采用十六进制值或颜色资源的形式。
<stroke>
形状的描边线。

属性:

android:width
尺寸。线的宽度,采用尺寸值或尺寸资源的形式。
android:color
颜色。线的颜色,采用十六进制值或颜色资源的形式。
android:dashGap
尺寸。短划线的间距,采用尺寸值或尺寸资源的形式。仅在已设置 android:dashWidth 的情况下有效。
android:dashWidth
尺寸。每个短划线的长度,采用尺寸值或尺寸资源的形式。仅在已设置 android:dashGap 的情况下有效。
示例:
保存在 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"
        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 = shape

Java

Resources res = getResources();
Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box, getTheme());

TextView tv = (TextView)findViewById(R.id.textview);
tv.setBackground(shape);
另请参阅: