可绘制对象资源是一般概念,是指可在屏幕上绘制的图形,以及可以使用 getDrawable(int)
等 API 检索或者应用到具有 android:drawable
和 android:icon
等属性的其他 XML 资源的图形。共有多种不同类型的可绘制对象:
-
位图文件
-
位图图形文件(
.png
、.jpg
或.gif
)。创建BitmapDrawable
。
九宫格文件
-
具有可拉伸区域的 PNG 文件,允许根据内容调整图像大小 (
.9.png
)。创建NinePatchDrawable
。
图层列表
-
管理其他可绘制对象阵列的可绘制对象。它们按阵列顺序绘制,因此索引最大的元素绘制在顶部。创建
LayerDrawable
。
状态列表
-
此 XML 文件为不同状态引用不同位图图形(例如,按下按钮时使用不同的图像)。创建
StateListDrawable
。
级别列表
-
此 XML 文件用于定义管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。创建
LevelListDrawable
。
转换可绘制对象
-
此 XML 文件用于定义可在两种可绘制对象资源之间交错淡出的可绘制对象。创建
TransitionDrawable
。
插入可绘制对象
- 此 XML 文件用于定义以指定距离插入其他可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景可绘制对象时,此类可绘制对象很有用。 裁剪可绘制对象
-
此 XML 文件用于定义对其他可绘制对象进行裁剪(根据其当前级别值)的可绘制对象。创建
ClipDrawable
。
缩放可绘制对象
-
此 XML 文件用于定义更改其他可绘制对象大小(根据其当前级别值)的可绘制对象。创建
ScaleDrawable
形状可绘制对象
-
此 XML 文件用于定义几何形状(包括颜色和渐变)。创建
ShapeDrawable
。
另请参阅动画资源文档,了解如何创建 AnimationDrawable
。
注:颜色资源也可用作 XML 中的可绘制对象。例如,在创建状态列表可绘制对象时,可以引用 android:drawable
属性的颜色资源 (android:drawable="@color/green"
)。
位图
位图图像。Android 支持以下三种格式的位图文件:.png
(首选)、.jpg
(可接受)、.gif
(不建议)。
您可以使用文件名作为资源 ID 直接引用位图文件,也可以在 XML 中创建别名资源 ID。
注:在构建过程中,可通过 aapt
工具自动优化位图文件,对图像进行无损压缩。例如,不需要超过 256 色的真彩色 PNG 可通过调色板转换为 8 位 PNG。这样产生的图像质量相同,但所需内存更少。因此请注意,此目录中的图像二进制文件在构建时可能会发生变化。如果您计划将图像解读为比特流以将其转换为位图,请改为将图像放在 res/raw/
文件夹中,在那里它们不会进行优化。
位图文件
位图文件是 .png
、.jpg
或 .gif
文件。当您将这些文件保存到 res/drawable/
目录中时,Android 将为它们创建 Drawable
资源。
-
文件位置:
-
res/drawable/filename.png
(.png
、.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" />以下应用代码将图像作为
Resources res =Drawable
检索:getResources()
;
Drawable drawable = res .getDrawable
( R . drawable . myimage );
另请参阅:
XML 位图
XML 位图是在 XML 中定义的资源,指向位图文件。实际上是原始位图文件的别名。XML 可以指定位图的其他属性,例如抖动和层叠。
注:您可以将 <bitmap>
元素用作 <item>
元素的子项。例如,在创建状态列表或图层列表时,可以将 android:drawable
属性从 <item>
元素中排除,并在其中嵌套用于定义可绘制项的 <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" />
另请参阅:
九宫格
NinePatch
是一种 PNG 图像,在其中可定义当视图中的内容超出正常图像边界时 Android 缩放的可拉伸区域。此类图像通常指定为至少有一个尺寸设置为 "wrap_content"
的视图的背景,而且当视图扩展以适应内容时,九宫格图像也会扩展以匹配视图的大小。Android 的标准 Button
小部件使用的背景就是典型的九宫格图像,其必须拉伸以适应按钮内的文本(或图像)。
与普通位图一样,您可以直接引用九宫格文件,也可以从 XML 定义的资源引用。
如需有关如何创建包含可拉伸区域的九宫格文件的完整论述,请参阅 2D 图形文件。
九宫格文件
-
文件位置:
-
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" />
图层列表
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>
元素:
- 示例:
-
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>
元素为每个具有“中心”重力的项目定义可绘制对象资源。这可确保没有图像会为了适应容器的大小而缩放,因为偏移图像会造成大小调整。此布局 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" />以下代码从第一个项目到第二个项目执行 500ms 的转换:
ImageButton button = ( ImageButton ) findViewById ( R . id . button );
TransitionDrawable drawable = ( TransitionDrawable ) button . getDrawable ();
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:background = "@drawable/clip"
android:layout_height = "wrap_content"
android:layout_width = "wrap_content" />以下代码用于获取可绘制对象,并增加裁剪量以便逐渐显示图像:
ImageView imageview = ( ImageView ) findViewById ( R . id . image );
ClipDrawable drawable = ( ClipDrawable ) imageview . getDrawable ();
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" />此应用代码将获取形状可绘制对象,并将其应用到视图:
Resources res =getResources()
;
Drawable shape = res .getDrawable
( R . drawable . gradient_box );
TextView tv = ( TextView ) findViewByID ( R . id . textview );
tv . setBackground ( shape );
另请参阅: