Drawable Resources是一个泛指的概念,指那些可以使用API(比如getDrawable(int) 方法)或者是XML格式的属性(比如android:drawable和android:icon)来访问的那些被展示在屏幕上的那些图形。有以下几种类型:
Bitmap File
一张png、jpg,或者gif格式的图片Nine-Patch File
一张基于图像边缘内容可拉伸的png格式图片Layer List
包含多个Drawable对象的集合。有序集合,序列最大的位于顶层State List
一个针对View的不同状态(比如正常状态和按下时)引用不同图片的XML文件Level List
包含多个Drawable对象的集合,每个drawable存在一个对应的Level值,XML格式Transition Drawable
一个定义了两个Drawable之间淡入淡出效果的XML文件Inset Drawable
定义了一个Drawable根据一定距离插入到另外一个Drawable中的XMl文件,当需要对一个View指定一个小于它自身大小的背景图时,可以使用它Clip Drawable
定义了一个根据一个Drawable的当前level值裁剪后得到新Drawable的XML文件Scale Drawable
定义了一个根据一个Drawable的当前level值拉伸后得到新Drawable的XML文件Shape Drawable
定义的几何形,色彩和梯度的XML文件
除此之外还有 AnimationDrawable,参考
备注:颜色资源也可以看作一种XML Drawable,比如当你使用 State List Drawable时,你可以通过android:drawable来指定颜色作为属性(android:drawable=”@color/green”)
Bitmap
即位图,安卓中支持下面三种格式的文件: .png (推荐), .jpg (可选), .gif (不推荐)
你可以通过直接使用图片名作为资源ID来调用该文件,也可以创建一个XML文件为某张图片起一个别名。
备注:位图文件在编译过程中可能会被aapt tool自动优化为无损位图。比如,一张不需要多于256种颜色的 true-color PNG可能会被转化为一个带调色板的 8-bit PNG。这样就会得到一个同样图像质量,但是占用较少内存位图。所以要注意,放置在这些文件夹里的图片二进制在编译过程中会发生变化。如果你计划在读取一个图片作为一个位流以便将其转换为位图时,把你的图片放在res/raw/下来避免它们被优化而发生改变。
Bitmap File
一个.png、 .jpg, 或者 .gif格式的文件。当你把这些文件放置在res/drawable/ 目录下,安卓系统会创建对应的Drawable资源
文件路径:res/drawable/filename.png (.png, .jpg, or .gif) 文件名就是对应的资源ID
编译过的资源类型:BitmapDrawable
资源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
示例:现有一张图片位于res/drawable/myimage.png,下面代码展示了如何应与于一个View上
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/myimage" />
下面的代码展示了如何通过代码得到它
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
XML Bitmap
XML bitmap 是指向一个位图文件的XML文件。这样会为位图文件产生一个别名,改文件可以为图片指定诸如抖动和平铺的额外属性。
备注:你可以使用< bitmap > 元素来作为< item > 的一个子元素。例如,当创建一个 state list 或者 layer list,你可以不使用 android:drawable 属性,在< item > 中指定一个定义了一个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
String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。当指定在< bitmap >内部时,此属性并不需要书写,只有当< bitmap> 作为根节点时,此属性才是必须的。android:src
Drawable资源,必须。指向一个Drawable资源。android:antialias
Boolean类型。开启或者关闭抗锯齿。android:dither
Boolean类型。开启或关闭抖动,当位图和屏幕不具有相同的像素配置(例如:一个RGB 565屏幕和ARGB 8888位图)时。android:filter
Boolean类型。开启或关闭位图过滤。用于当图片拉伸或者收缩时得到光滑的图片。android:gravity
关键,用于定义位图重力。当位图小于容器大时,指定位图在容器中的位置。
必须为下方的一个或者多个(用|来分割)常量:
值 | 说明 |
---|---|
top | 位于容器顶部,并不改变自身大小 |
bottom | 位于容器底部,并不改变自身大小 |
left | 位于容器左侧,并不改变自身大小 |
right | 位于容器右侧,并不改变自身大小 |
center_vertical | 在容器中垂直居中,并不改变自身大小 |
fill_vertical | 增加对象的垂直大小让它完全充满其容器 |
center_horizontal | 在容器中横向居中,并不改变自身大小 |
fill_horizontal | 增加对象的横向大小让它完全充满其容器 |
center | 在容器中居中,并不改变自身大小 |
fill | 完全充满其容器增加对象的水平和垂直尺寸,默认值 |
clip_vertical | 附加选项,用于按照容器的边来剪切对象的顶部和/或底部的内容。剪切基于其纵向对齐设置:顶部对齐时,剪切底部;底部对齐时剪切顶部;除此之外剪切顶部和底部。垂直方向裁剪 |
center_vertical | 附加选项,用于按照容器的边来剪切对象的左侧和/或右侧的内容。剪切基于其横向对齐设置:左侧对齐时,剪切右侧;右侧对齐时剪切左侧;除此之外剪切左侧和右侧。水平方向裁剪 |
android:mipMap
Boolean类型。开启或关闭mipMap提示。更多信息参考setHasMipMap(),默认值为关。android:tileMode
关键。定义了展示形式。当此属性启用时,bitmap会被重复显示, gravity会被忽略掉。
值 | 说明 |
---|---|
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" />
Nine-Patch
一个NinePatch是一个定义了拉伸区域的PNG图片,当View尺寸大于图片时可被安卓系统拉伸。通常将这中类型指定为View的背景,该View的至少一个尺寸值为“wrap_content”,当View的尺寸被拉伸时,Nine-Patch位图也会拉伸自身来同View相适应,一个例子是安卓系统的标准按钮的背景图,它必须通过拉伸来适应按钮内的文本(或图像)。
同样作为一个正常的位图,你可以直接从XML资源文件中引用一个Nine-Patch文件
Nine-Patch File
文件路径:res/drawable/filename.9.png 文件名就是对应的资源ID
编译过的资源类型:NinePatchDrawable
资源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
示例:下面的例子展示了如何在XML中对一个View指定一个名为res/drawable/myninepatch.9.png作为背景图
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/myninepatch" />
XML Nine-Patch
一个XML Nine-Patch 是一个在XML格式中指定了一个Nine-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> 定义了Nine-Patch的根节点和它的属性
xmlns:android
String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。android:src
Drawable资源,必须。指向一个 Nine-Patch文件。android:dither
Boolean类型。开启或关闭抖动,当位图和屏幕不具有相同的像素配置(例如:一个RGB 565屏幕和ARGB 8888位图)时。示例
<?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" />