转自http://www.cnblogs.com/xirihanlin/archive/2010/06/14/1758145.html
Drawable 资源是对图像的一个抽象,你可以通过 getDrawable(int) 得到并绘制到屏幕上。这里有几种不同类型的 Drawable :
Bitmap File
一个 Bitmap 图像文件( .png 、 .jpg 或 .gif )。 BitmapDrawable 。
Nine-Patch File
一个带有伸缩区域的 PNG 文件,可以基于 content 伸缩图片( .9.png )。 NinePatchDrawable 。
State List
一个 XML 文件,为不同的状态引用不同的 Bitmap 图像(例如,当按钮按下时使用不同的图片)。 StateListDrawable 。
Color
定义在 XML 中的资源,指定一个矩形(圆角可以有)的颜色。 PaintDrawable 。
Shape
一个 XML 文件,定义了一个几何形状,包括颜色和渐变。 ShapeDrawable 。
AnimationDrawable 资源的说明在【 Animation 资源】文章中。
Bitmap File
基本的 Bitmap 图像。 Android 支持几种不同格式的 Bitmap 文件: .png (最佳)、 .jpg (可接受)、 .gif (不要)。
注意: Bitmap 文件可能会被 aapt 工具进行无损图像压缩优化。例如,一个真彩色的 PNG (不超过 256 色)可能会被转换成一个带有颜色板的 8 位 PNG 。这样做能保证图片质量一样,但减少内存占用。因此,需要了解的是放在这个文件夹下的二进制图像在编译时可能会发生变更。如果你打算以位流方式读取图像来转化成 Bitmap 的话,可以把它们放到 res/raw 文件中,在这里,它们不会被优化。
File Location :
res/drawable/filename.png (.png, .jpg, 或 .gif)
文件名会被当作资源 ID 使用。
Complied Resource Datatype :
指向 BitmapDrawable 的资源指针。
Resource Reference :
R.drawable.filename ( Java )
@[package:]drawable/filename ( XML )
Example :
在 res/drawable/myimage.png 位置保存了一张图片,在 Layout XML 中可以应用这个图片到一个 View 上:
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/myimage" />
下面的代码可以以 Drawable 方式得到图片:
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
Nine-Patch File
NinePatch 是一种 PNG 图像,可以定义拉伸区域,当 View 的 content 超出图像边界的话, Android 会拉伸它。典型用法是把这个图像设置为 View 的背景,而这个 View 至少有一个尺寸设置为“ wrap_content ”,当这个 View 变大来容纳 content 时, Nine-Patch 图像也会拉伸来匹配 View 的大小。
File Location :
res/drawable/filename.9.png
文件名将被当作资源 ID 使用。
Complied Resource Datatype :
指向 NinePatchDrawable 的资源指针。
Resource Reference :
R.drawable.filename ( Java )
@[package:]drawable/filename ( XML )
Example :
在 res/drawable/myninepatch.9.png 位置保存了一张图片,在 Layout XML 中可以应用这个图片到一个 View 上:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/myninepatch" />
State List
StateListDrawable 是定义在 XML 中的 Drawable 对象,能根据状态来呈现不同的图像。例如, Button 存在多种不同的状态( pressed 、 focused 或 other ),使用 StateListDrawable ,你可以为 Button 的每个状态提供不同的按钮图像。
你可以在 XML 文件中描述状态列表。在 <selector> 元素里的每个 <item> 代表每个图像。每个 <item> 使用不同的特性来描述使用的时机。
当每次状态改变时, StateList 都会从上到下遍历一次,第一个匹配当前状态的 item 将被使用——选择的过程不是基于“最佳匹配”,只是符合 state 的最低标准的第一个 item 。
File Location
Res/drawable/filename.xml
文件名将被当作资源 ID 使用。
Complied Resource Datatype :
指向 StateListDrawable 的资源指针。
Resource Reference :
R.drawable.filename ( Java )
@[package:]drawable/filename ( XML )
Syntax :
<? 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_selected = ["true" | "false" ]
android:state_active = ["true" | "false" ]
android:state_checkable = ["true" | "false" ]
android:state_checked = ["true" | "false" ]
android:state_enabled = ["true" | "false" ]
android:state_window_focused = ["true" | "false" ] />
</selector>
Elements :
<selector>
必须。必须是根元素。可以包含一个或多个 <item> 元素。
Attributes :
xmlns:android
String 。必须。定义 XML 的命名空间,必须是
“ http://schemas.android.com/apk/res/android ”。
android:constantSize
Boolean 。“ true ”表示随着状态变化, Drawable 的大小保持不变(所有状态中最大的 size );“ false ”表示大小会变化。默认是 false 。
android:dither
Boolean 。“ true ”表示当 Bitmap 和屏幕的不是相同的像素设定时支持 Bitmap 抖动(例如, ARGB 8888 的 Bitmap 和 RGB 565 的屏幕);“ false ”表示不支持。默认是“ true ”。
android:variablePadding
Boolean 。“ true ”表示 Drawable 的 Padding 可以变化;“ false ”表示 Padding 保持相同(所有状态的最大 Padding )。使能这一特征需要在状态变化时处理 Layout ,一般都不支持。默认值是 false 。
<item>
定义特定状态的 Drawable ,通过它的特性指定。必须是 <selector> 的子元素。
Attributes :
android:drawable
Drawable 资源。必须。指向一个 Drawable 资源。
android:state_pressed
Boolean 。“ true ”表示按下状态使用(例如按钮按下);“ false ”表示非按下状态使用。
android:state_focused
Boolean 。“ true ”表示聚焦状态使用(例如使用滚动球 /D-pad 聚焦 Button );“ false ”表示非聚焦状态使用。
android:state_selected
Boolean 。“ true ”表示选中状态使用(例如 Tab 打开);“ false ”表示非选中状态使用。
android:state_checkable
Boolean 。“ true ”表示可勾选状态时使用;“ false ”表示非可勾选状态使用。(只对能切换可勾选—非可勾选的构件有用。)
android:state_checked
Boolean 。“ true ”表示勾选状态使用;“ false ”表示非勾选状态使用。
android:state_enabled
Boolean 。“ true ”表示可用状态使用(能接收触摸 / 点击事件);“ false ”表示不可用状态使用。
android:window_focused
Boolean 。“ true ”表示应用程序窗口有焦点时使用(应用程序在前台);“ false ”表示无焦点时使用(例如 Notification 栏拉下或对话框显示)。
注意: 记住一点, StateList 中第一个匹配当前状态的 item 会被使用。因此,如果第一个 item 没有任何状态特性的话,那么它将每次都被使用,这也是为什么默认的值必须总是在最后(如下面的例子所示)。
Example :
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:drawable = "@drawable/button_normal" /> <!-- default -->
</selector>
Layout XML 将这个 Drawable 应用到一个 View 上:
<ImageView
android:layout_height = "wrap_content"
android:layout_width = "wrap_content"
android:src = "@drawable/button" />
Color
定义在 XML 中的 color ,可以当作 Drawable 使用,来填充矩形区域(圆角可以有)。这种 Drawable 的行为很像是颜色填充。
注意: Color Drawable 是一种简单的资源,可以使用 name 特性来引用其值(不再是 XML 文件的名)。因此,你可以在一个 XML 文件中的 <resources> 元素下添加多个 Color Drawable 。
File Location :
res/drawable/filename.xml
文件名随意。元素的 name 将会当作资源 ID 使用。
Complied Resource Datatype :
指向 PaintDrawable 资源的指针。
Resource Reference :
R.drawable.color_name ( Java )
@[package:]drawable/color_name ( XML )
Syntax :
<? xml version = "1.0" encoding = "utf-8" ?>
< resources >
< drawable name = "color_name "
> color </drawable>
</resources>
Elements :
<resources>
必须。必须是根节点。
没有特性。
<drawable>
一个 color Drawable 。其值可以是任何有效的十六进制颜色值或者 Color 资源。 Color 值总是以“ # ”开头,后面紧跟 Alpha-Red-Green-Blue 信息,格式是: #RGB 、 #ARGB 或者 #AARRGGBB 。
Attributes :
name
String 。必须。 Color 的名字。这个名字将被当作资源 ID 使用。
Example :
XML 文件保存在 res/drawable/color.xml 。
<? xml version = "1.0" encoding = "utf-8" ?>
<resources>
<drawable name = "solid_red" > #f00 </drawable>
<drawable name = "solid_blue" > #0000ff </drawable>
</resources>
Layout XML 将会把这个 Color Drawable 应用到一个 View 上:
<TextView
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:background = "@drawable/solid_blue" />
代码中获取 Color Drawable 并应用到 View 上:
Resources res = getResources () ;
Drawable redDrawable = res . getDrawable ( R . drawable . solid_red );
TextView tv = ( TextView ) findViewByID ( R . id . text );
tv . setBackground ( redDrawable );
Shape
定义在 XML 中的几何形状。
File Location :
res/drawable/filename.xml
文件名将被当作资源 ID 使用。
Complied Resource Datatype :
指向 ShapeDrawable 的资源指针。
Resource Reference :
R.drawable.filename ( Java )
@[package:]drawable/filename ( XML )
Syntax :
<? xml version = "1.0" encoding = "utf-8" ?>
< shape xmlns:android = "http://schemas.android.com/apk/res/android"
android:shape = ["rectangle" | "oval" | "line" | "ring" ] >
< gradient
android:angle = "integer "
android:centerX = "integer "
android:centerY = "integer "
android:centerColor = "integer "
android:endColor = "color "
android:gradientRadius = "integer "
android:startColor = "color "
android:type = ["linear" | "radial" | "sweep" ]
android:usesLevel = ["true" | "false" ] />
< solid
android:color = "color " />
< stroke
android:width = "integer "
android:color = "color "
android:dashWidth = "integer "
android:dashGap = "integer " />
< padding
android:left = "integer "
android:top = "integer "
android:right = "integer "
android:bottom = "integer " />
< corners
android:radius = "integer "
android:topLeftRadius = "integer "
android:topRightRadius = "integer "
android:bottomLeftRadius = "integer "
android:bottomRightRadius = "integer " />
</shape>
Elements :
<shape>
必须。必须是根元素。
Attributes :
android:shape
Keyword 。定义 Shape 的类型。有效的值包括:
Value | Desciption |
| 矩形。默认形状。 |
| 椭圆。 |
| 水平直线。需要 <stroke> 元素定义线的宽度。 |
| 环形。 |
接下来的特性只能在 android:shape=”ring” 时使用:
android:innerRadius
Dimension 。内环的半径。
android:innerRadiusRatio
Float 。以环的宽度比率来表示内环的半径。例如,如果 android:innerRadiusRatio=”5” ,内环半径等于环的宽度除以 5 。这个值可以被 android:innerRadius 覆盖。默认值是 9 。
android:thickness
Dimension 。环的厚度。
android:thicknessRatio
Float 。以环的宽度比率来表示环的厚度。例如,如果 android:thicknessRatio=”2” ,厚度就等于环的宽度除以 2 。这个值可以被 android:thickness 覆盖。默认值是 3 。
android:useLevel
Boolean 。“ true ”表示可以当作 LevelListDrawable 使用。一般都为“ false ”。
<gradient>
为 Shape 指定渐变色。
Attributes :
android:angle
Integer 。渐变色的角度值。 0 表示从左到右, 90 表示从下到上。必须是 45 的倍数,默认是 0 。
android:centerX
Float 。渐变色中心的 X 相对位置( 0-1.0 )。当 android:type=”linear” 时无效。
android:centerY
Float 。渐变色中心的 Y 相对位置( 0-1.0 )。当 android:type=”linear” 时无效。
android:centerColor
Color 。可选的颜色,出现在 start 和 end 颜色之间。
android:endColor
Color 。 end 颜色。
android:gradientRadius
Float 。渐变色的半径。当 android:type=”radial” 时有效。
android:startColor
Color 。 start 颜色。
android:type
Keyword 。渐变色的样式。有效值为:
Value | Description |
| 线性渐变,默认值。 |
| 环形渐变。 start 颜色是处于中间的颜色。 |
| sweep 渐变 |
android:useLevel
Boolean 。“ true ”表示可以当作 LevelListDrawable 使用。
<solid>
填充 shape 的单一色。
Attributes :
android:color
Color 。这个颜色会应用到 shape 上。
<stroke>
shape 的线形。
Attributes :
android:width
Dimension 。线的厚度。
android:color
Color 。线的颜色。
android:dashGap
Dimension 。间断线间的距离。仅在 android:dashWidth 设定时有效。
android:dashWidth
Dimension 。间断线的大小。仅在 android:dashGap 设定时有效。
<padding>
内部 View 元素的边距。
Attributes :
android:left
Dimension 。左内边距。
android:top
Dimension 。上内边距。
android:right
Dimension 。右内边距。
android:bottom
Dimension 。下内边距。
<corners>
为 shape 创建圆角。当 shape 是一个矩形时有效。
Attributes :
android:radius
Dimension 。圆角的半径。会被下面的特性覆盖。
android:topLeftRadius
Dimension 。左上圆角半径。
android:topRightRadius
Dimension 。右上圆角半径。
android:bottomLeftRadius
Dimension 。左下圆角半径。
android:bottomRightRadius
Dimension 。右下圆角半径。
Examples :
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>
Layout XML 将被当作 ShapeDrawable 应用到一个 View 上:
<TextView
android:background = "@drawable/gradient_box"
android:layout_height = "wrap_content"
android:layout_width = "wrap_content" />
代码中也可以获得 ShapeDrawable ,然后应用到 View 上:
Resources res = getResources () ;
Drawable shape = res . getDrawable ( R . drawable . gradient_box );
TextView tv = ( TextView ) findViewByID ( R . id . textview );
tv . setBackground ( shape );