原文链接:http://developer.android.com/intl/zh-CN/guide/topics/resources/drawable-resource.html
目录[隐藏] |
Drawable Resources(可绘制的资源)
一个drawable资源,就是能被画到屏幕的一个一般的图形概态<简单说一下, drawable就是对图片向上抽取之后的一个抽象名称,图片有多种表现形式,接着看下文.文中一些地方还是直译为drawable>.它可以用getDrawable(int)这个方法api或者将其应用到xml文件资源中,使用android:drawable and android:icon. 这两个属性.
有如下多种图形概态.
- 一个位图文件(.png,.jpg,或.gif), 生成一个BitmapDrawable对象.
- 就是一张可以基于自动适应内容大小而伸缩区域的png图片(.9.png), 生成一个NinePatchDrawable对象
- 这个Drawable用来管理一个其它多个drawable的数组.既然是一个数组,所以就不难理解索引值最大的元素将画在最高部. 生成一个 LayerDrawable对象.
- 这是一个xml文件用于不同的状态来引用不同的位图图形(比如,当一个Button控件按下状态要显示不同的图像).生成一个StateListDrawable对象.
- 一个xml文件,定义了一个drawable可用于管理几个可以替换的drawable.每一个都会分配一个最大的数值.生成一个LevelListDrawable.
- 一个xml文件,定义了一个drawable可用于两张图片形成一个渐变的过渡效果生成一个TransitionDrawable对象
- 一个xml文件,定义了一个drawable,跟据指定的距离插入到另一个drawable.当一个View<视图>对象需要一张比其实际边框要小的背景图时,就可以用到这个了.
- 一个xml文件,定义了一个drawable, 根据当前对准值作相应的拉伸处理,生成 ClipDrawable对象.
- 一个xml文件,定义了一个drawable, 根据当前对准值作相应的平铺处理,生成 ScaleDrawable对象.
- 就是通过一个xml文件来定义一个包含颜色和渐变的几何图形, 生成一个 ShapeDrawable对象
- 另见Animation Resource <动画资源>文档,学习如何创建一个AnimationDrawable对像.
注:在xml中一个color resource<颜色资源>也可以作为一个drawable. 例如,创建一个state list drawable时,你可以为android:drawable属性引用一个颜色资源(android:drawable="@color/green").
Bitmap
Android 支持三种格式的位图文件.png(推荐 ), .jpg(可以接受), .gif(不建议使用). 可以直接用文件名来引用一个位图文件,或在xml中为其创建一个资源id的别名.
注意:在编译过程中Bitmap文件可能使用aapt工具优化为无损压缩图像,例如,一个不需要256色的真彩PNG图片可能转化为附有调色板的8-bitPNG图片。这会产生同等质量的图片,但只需要较少的内存。所以需要明白在此路径下的图片在编译中会改变。如果打算按bit流读取图片以转换成位图,把图片放在res/raw/文件夹,这不会被优化。
Bitmap File(位图文件)
一个位图文件就是一个.png, .jpg, 或 .gif文件. 当你把这些文件放在res/drawable/ 中,Android就会为其创建一个 Drawable (可绘制的)资源.
- 文件位置:
-
- res/drawable/filename.png (.png, .jpg, or .gif)
- 文件名被用作资源id.
- 编译后的资源数据类型:
-
- 资源将生成一个BitmapDrawable对象.
- 资源引用:
-
- 用java: R.drawable.filename
- 用xml: @[package:]drawable/filename
- 例如:
-
- 当一个图片保存在res/drawable/myimage.png ,下面就是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);
另见:
-
- 2D Graphics
- BitmapDrawable
XML Bitmap(XML位图)
XML Bitmap是定义在xml文件中,指向一个位图的资源文件.这种作用对于原始的位图文件尤其有效。此XML可以设定抖动,拼接等位图的附加属性。
注意:可以使用<bitmap>成员作为<item>成员的子成员,例如:当创建一个statelist(状态列表)或者layerlist(图层列表),可以从<item>元素中去除android:drawable属性,而在<item>中构建一个<bitmap>来定义此绘制项(drawable item).
- 文件位置:
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:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
- 元素:
- <bitmap>
定义位图资源和特性。 属性: xmlns:android: String. 定义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
关键字。定义位图的gravity,如果位图小于其容器,使用gravity指明在何处绘制。
取值必须是如下常量值中的一个或多个(以分隔‘|’):
取值 | 描述 |
---|---|
top |
把对象放在容器的上方,不改变其大小。 |
bottom |
把对象放在容器的底部,不改变其大小。 |
left |
把对象放在容器的左边,不改变其大小。 |
right |
把对象放在容器的右边,不改变其大小。 |
center_vertical |
把对象放在容器的垂直居中位置,不改变其大小。 |
fill_vertical |
对象垂直填充容器。 |
center |
把对象放在容器的水平和垂直的居中位置,不改变其大小。 |
fill |
同时水平和垂直拉伸对象以填充容器,此为默认项。 |
clip_vertical |
额外选项,可以设置使得子对象的顶和/或底上剪切至容器的边界,这个切割基于垂直gravity:顶上gravity剪切底边,底上gravity切割上面, 不同时剪切两边。 |
clip_horizontal |
额外选项,可以设置使得子对象的左边和/或右边剪切至容器的边界,这个切割基于水平gravity:左边gravity剪切右边,右边gravity切割左边, 不同时剪切两边。 |
- android:tileMode(平铺模式)
关键字。定义平铺模式,当允许平铺模式时,重复位图,忽略gravity设置。 取值必须是如下常量值中的一个:
取值 | 描述 |
---|---|
desable |
不给位图添加标题,默认值。 |
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" />
另参见:
- BitmapDrawable
- Creating alias resources
Nine-Patch(可拉伸图片)
一个可拉伸图片是一个PNG图片,当View中的图片内容超过了其正常的图片边界时,可以在其中定义供Android缩放的拉伸区域。此类图片常被用于至少有一个维度设置为“wrap_content”的View的背景,View需要扩展自己来适应其内容,而Nine-Patch也会缩放以匹配View的大小。Nine-Patch的一个使用示例就是Android标准Button控件的背景,必须伸缩以适应Button的文字或图片。 同正常的位图一样,你可以直接引用一个Nine-Patch文件也可以通过XML定义资源引用。 对于关于如何创建一个可伸缩的地区Nine-Patch文件的一个完整讨论,请参见2D图形文档。
Nine-Patch File
文件位置:
- res/drawable/filename.9.png
- 使用文件名来标示资源。
编译过的资源数据类型:
- 资源指针指向一个NinePatchDrawable文件。
资源引用:
- Java: R.drawable.filename
- XML: @[package:]drawable/filename
举例: 有一个图片保存在res/drawable/myninepatch.9.png, 此布局XML应用到一个View:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/myninepatch" />
另附参考:
- 2D Graphics
- NinePatchDrawable
XML Nine-Patch
一个XML Nine-Patch 是一个定义在XML中,指向一个Nine-Patch文件的资源,此XML能够设置图片的抖动。
文件位置:
- res/drawable/filename.xml
- 使用文件名来标示资源。
编译过的资源数据类型:
- 资源指针指向一个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
- 字符型,必要的. 定义XML的命名空间,必须是“ http://schemas.android.com/apk/res/android”。
-
xmlns:android
-
-
android:src
- 可绘制资源,必要的,指向一个Nine-Patch文件。
-
android:src
-
-
android:dither
- 布尔型,如果位图与屏幕的像素配置不同时,是否允许抖动.(例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565)。
-
android:dither
举例:
<?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>元素单独地呈现在<layer-list>元素内。
文件位置:
- res/drawable/filename.xml
- 使用文件名来标示资源。
编译过的资源数据类型:
- 资源指针指向一个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>
-
- 定义一个绘图放在图层里,位置由其属性确定。必须是<selector>的子元素。可接受<bitmap>最为子元素。
-
- 属性:
-
- android:drawable
-
-
- 可绘制资源,必须的,引用一个可绘制资源。
-
-
- android:id
-
-
- 资源ID,此绘图资源唯一的资源ID。为新项创建一个新的资源ID:"@+id/name"。"+"表示新增一个ID。可以使用ID号通过View.findViewById()或者Activity.findViewById()来检索和修改此绘图资源。
-
-
- android:top
-
-
- 整型,顶上像素偏移。
-
-
- android:right
-
-
- 整型,右方像素偏移。
-
-
- android:bottom
-
-
- 整型,底部像素偏移。
-
-
- android:left
-
-
- 整型,左方像素偏移。
-
- 默认情况下所有绘制项目缩放,以适应包含视图的大小。因此,放置图像在图层列表的不同位置,可能会增加View的大小和一些图像需要扩展到合适的大小。为了避免列表中的扩展项,在<item>元素内使用<bitmap>元素,指定可绘制性和定义gravity为不会扩展的属性,诸如“居中”。例如,下面的<item>定义了一个项,扩展到适应其容器View的大小:
<item android:drawable="@drawable/image" />
为避免扩展,如下的例子使用一个<bitmap> 元素,gravity属性为居中:
<item>
<bitmap android:src="@drawable/image"
android:gravity="center" />
</item>
例如:
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>
注意这个例子使用gravity属性居中的内嵌<bitmap>元素,来定义每个列表项的绘图资源。由于,图片偏移量引起的尺寸调整,这确保了没有图片需要缩放来适应容器的大小。 把这个XML布局应用到一个View:
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/layers" />
结果是偏移量不断增加的一系列图片的堆叠:
另参考图层Drawable
State List
状态列表Drawable是一个定义在XML中的可绘制对象,使用几个不同的图像,根据对象的状态来呈现同一个图形。例如,一个Button控件,可以处于几种状态中的一种(按下,聚焦,或都不是)使用状态列表可绘制,可以为每个状态提供不同的背景图像。
可以在XML文件中描述列表,每个图形由一个<item>元素内部有一个单一<selector>元素呈现。每个<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:constantSize
-
-
android:dither
- 布尔型,"true",当位图的像素配置与屏幕的不一致时,允许位图抖动(例如,一个ARGB 8888 的位图和一个RGB 565 的屏幕);"false",不允许抖动,默认设置为"false"。
-
android:dither
-
-
android:variablePadding
- 布尔型,为"true"时,根据所选择的当前状态,可绘制对象的填充需要改变;为"false"时,填充保持不变(所有状态的填充最大值)。使用此特性要求当状态改变时处理好布局,它会常常不支持。默认设置为"false"。
-
android:variablePadding
-
<item>
- 定义一个可应用在一定状态的绘制对象,属性由其描述所定,必须是<selector>的子元素。
-
- 属性:
-
-
android:drawable
- 可绘制资源,必要的,引用一个可绘制资源。
-
android:drawable
-
-
android:state_pressed
- 布尔型,为"true"时,当对象被按下(诸如触摸/单机一个按钮)使用此选项;为"false"时,默认设置应当使用此选项,处于没有按下状态。
-
android:state_pressed
-
-
android:state_focused
- 布尔型,为"true"时,当对象拥有输入焦点时应使用此选项(诸如当用户选择一个文本输入);为"false"时,默认设置使用此选项,处于没有焦点状态。
-
android:state_focused
-
-
android:state_hovered
- 布尔型,为"true"时,当对象处于游标徘徊在附近时,使用此选项;"false"时,默认使用此选项,处于没有游标徘徊状态。通常,这种绘制对象与聚焦状态的绘制对象相同。
-
android:state_hovered
-
-
- API 14 中有介绍。
-
-
-
android:state_selected
- 布尔型,为'true"时,当对象是当前用户通过方向控制键导航选择选项(诸如通过一个十字键列表导航),使用此选项;为"false"时,当对象没有被选中时,使用此选项。
-
android:state_selected
-
-
- 当聚焦不够用时使用此选择状态(诸如当列表视图拥有聚焦而使用十字键选择一个选项时)。
-
-
-
android:state_checkable
- 布尔型,为"true"时,对象是是可核对的;为"false"时,对象不可核对的。(只当对象可以在可核对与不可核对控件间变换时使用)
-
android:state_checkable
-
-
android:state_enabled
- 布尔型,为 "true"时,对象许可(能够接受到触摸或单击事件);为"false"时,对象不许可。
-
android:state_enabled
-
-
android:state_activated
- 布尔型,为"true"时,由于持久的选择使对象处于激活状态,(诸如在一种持久的导航视图中高亮标示列表选项);为"false"时,对象没有处于激活状态。
-
android:state_activated
-
-
- 详细介绍在API11
-
-
-
android:state_window_focused
- 布尔型,为"true"时,焦点在应用的窗口(此应用处于前台),此应用的窗口没有获得焦点(例如当有通知栏拉下或对话出现).
-
android:state_window_focused
注意:记住Adroid在状态列表中使用第一个选项以匹配对象的当前状态。所以,如果列表中第一个选项不包含任一个的状态属性,此时它就会每次都使用第一个选项,这也是为什么要把默认属性放在最后面的原因。(如下面的示例所示)
例子: 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>
把此布局应用到一个按钮的可绘制状态列中:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/button" />
另参见: 状态列Drawable
Level List
一个可绘制对象管理许多可相互替换的可绘制对象,每个都标示了最大数值。使用setLevel()设置可绘制资源的级别,在级别列表中装载可绘制资源,此列表有个android:maxLevel 值,此值大于或等于方法传递给setLevel()方法的值。
文件位置:
- 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:drawable
-
-
android:maxLevel
- 整型,允许的级别最大值
-
android:maxLevel
-
-
android:minLevel
- 整型,允许的级别最小值
-
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>
一旦把此应用到一个视图上,此等级值可以通过setLevel() 或 setImageLevel()修改 另参见: LevelListDrawable
Transition Drawable
一个变换Drawable是一个可绘制对象,在两个可绘制资源间能够同时淡入淡出。 每个可绘制对象由在单独的<transition>元素中的<item>元素表示。至多支持两个选项。前向过渡使用startTransition(),后向使用 reverseTransition()。
文件位置:
- res/drawable/filename.xml
- 文件名作为资源ID。
编译后的资源数据类型:
- 指向一个变换Drawable的资源。
资源引用:
- 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"。
-
xmlns:android
- <item>
-
- 定义一个可绘制对象作为此可绘制过度,必须是<transition>元素的子元素。接受<bitmap>子元素。
- 属性:
-
- android:drawable
-
-
- 可绘制资源,必要的,引用一个可绘制资源。
-
-
- android:id
-
-
- 必要的ID,此可绘制对象的唯一资源ID。若为此项创建一个新的资源ID,使用 "@+id/name"。加号表示应当创建一个新的ID。可以使用此符号通过View.findViewById()或者Activity.findViewById()来显示和修改此绘制对象。
-
-
-
android:top
- 整型,像素的上方偏移量。
-
android:right
- 整型,像素的右边偏移量。
-
android:bottom
- 整型,像素的下方偏移量。
-
android:left
- 整型,像素的左边偏移量。
-
android:top
举例:
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);
另参见: 变换Drawable
Inset Drawable
一个定义在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>
- 定义一个插入drawable。必须是根元素。
- 属性:
- xmlns:android
- 字符型,必要的,定义XML的命名空间,必须是" http://schemas.android.com/apk/res/android".
-
-
android:drawable
- 可绘制资源,必要的,引用一个可绘制资源以插入。
-
android:insetTop
- 尺寸,上端插入,作为一个尺寸值或尺寸资源。
-
android:insetRight
- 尺寸,右端插入,作为一个尺寸值或尺寸资源。
-
android:insetBottom
- 尺寸,底端插入,作为一个尺寸度值或尺寸资源。
-
android:insetLeft
- 尺寸,左边插入,作为一个尺寸值或尺寸资源。
-
android:drawable
举例:
<?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" />
另参见: 插入Drawable
Clip Drawable
根据可绘制对象的当前级别,定义在XML中可绘制对象,可以剪贴另一个可绘制对象。
可以根据当前级别决定以什么样的宽高比裁剪子对象,还有gravity来控制在容器内部的摆放位置。
常用来实现例如进度条的东西。
文件位置:
- res/drawable/filename.xml
- 文件名作为资源ID。
编译后资源数据类型。
资源引用:
- 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",从对象的底部开始分割。 |
clip_vertical |
额外选项,可以设置使得子对象的顶和/或底上剪切至容器的边界,这个切割基于垂直gravity:顶上gravity剪切底边,底上gravity切割上面, 不同时剪切两边。 |
clip_horizontal |
额外选项,可以设置使得子对象的左边和/或右边剪切至容器的边界,这个切割基于水平gravity:左边gravity剪切右边,右边gravity切割左边, 不同时剪切两边。 |
fill |
同时水平和垂直拉伸对象以填充容器,此为默认项。 |
fill_vertical |
对象垂直填充容器。 |
center |
把对象放在容器的垂直与水平的居中位置,不改变其大小。 |
center_vertical |
把对象放在容器的垂直居中位置,不改变其大小。 |
right |
把对象放在容器的右边,不改变其大小。 |
left |
把对象放在容器的左边,不改变其大小。 |
bottom |
把对象放在容器的底部,不改变其大小。 |
举例: 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,全部剪贴,图像不可见,当级别是10000,图片没有剪贴,全部可见。
另参见: 剪贴Drawable
Scale Drawable
一个定义在XML中的可绘制对象,能够依据当前级别改变另一个可绘制对象的大小。
文件位置:
- res/drawable/filename.xml
- 文件名作为资源ID。
编译后数据类型:
- 指向尺寸Drawable的资源指针。
资源引用:
- 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>
- 定义尺寸drawable.,必须是根元素。
属性:
-
xmlns:android
- 字符型,必要的,定义XML的命名空间,必须是" http://schemas.android.com/apk/res/android".
-
android:drawable
- 可绘制资源,必要的,引用一个可绘制资源。
-
android:scaleGravity
- 关键字,指定缩放后的gravity位置
-
- 取值必须是如下常量中一个或多个(以“|”分隔):
取值 | 描述 |
---|---|
top |
把对象放在容器的上方,不改变其大小,当clipOrientation是"vertical",从对象的底部开始分割。 |
bottom |
把对象放在容器的底部,不改变其大小。 |
left |
把对象放在容器的左边,不改变其大小。 |
right |
把对象放在容器的右边,不改变其大小。 |
center_vertical |
把对象放在容器的垂直居中位置,不改变其大小。 |
fill_vertical |
对象垂直填充容器。 |
center |
把对象放在容器的垂直与水平的居中位置,不改变其大小。 |
fill |
同时水平和垂直拉伸对象以填充容器,此为默认项。 |
clip_vertical |
额外选项,可以设置使得子对象的顶和/或底上剪切至容器的边界,这个切割基于垂直gravity:顶上gravity剪切底边,底上gravity切割上面, 不同时剪切两边。 |
clip_horizontal |
额外选项,可以设置使得子对象的左边和/或右边剪切至容器的边界,这个切割基于水平gravity:左边gravity剪切右边,右边gravity切割左边, 不同时剪切两边。 |
-
android:scaleHeight
- 百分比,高度尺寸,表示可绘制对象的边界百分比,取值以百分比形式,例如:100%,12.5%,等。
-
android:scaleWidth
- 百分比,高度尺寸,表示可绘制对象的边界百分比,取值以百分比形式,例如: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%" />
另参见: 尺寸Drawable
Shape Drawable
这是一个定义在XML中的通用形状。
文件位置:
- res/drawable/filename.xml
- 文件名作为资源ID。
编译后的资源数据类型:
- 指向一个渐变Drawable的资源指针。
资源引用:
- 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="integer"
android:centerY="integer"
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>
- 形状drawable,必须是根元素。
属性:
-
xmlns:android
- 字符型,必要的,定义XML的命名空间,必须是" http://schemas.android.com/apk/res/android"。
-
android:shape
- 关键字,定义形状的类型,取值是:
取值 | 描述 |
---|---|
"rectangle" |
填充包含的视图的矩形,是默认形状。 |
"oval" |
椭圆形,适合包含的视图的尺寸。 |
"line" |
划分包含的视图的水平线,这个形状要求<stroke>元素来定义线的宽度。 |
"ring" |
环形。 |
- 如下属性只有当android:shape="ring"时才使用。
-
-
android:innerRadius
- 尺寸,内环半径(中间的孔),作为一个尺寸值或尺寸资源。
-
android:innerRadius
-
-
android:thickness
- 尺寸,环的厚度,作为一个尺寸值或尺寸资源。
-
android:thickness
-
-
android:thicknessRatio
- 浮点型,环的厚度比上环的宽度,例如,如果android:thicknessRatio="2",厚度等于环的宽度的1/2,此值被android:innerRadius重写,默认为3.
-
android:thicknessRatio
-
-
android:useLevel
- 布尔型,为"true"时,用于LevelListDrawable,正常情况设为"false",或者形状不出现。
-
android:useLevel
<corners>
-
- 为形状创建圆角,只有当形状为矩形时才应用。
-
- 属性:
-
-
android:radius
- 尺寸数,所有的角的半径,作为一个尺寸值或尺寸资源,对于每个角会重写如下的属性:
-
android:topLeftRadius
- 尺寸数,左上角的半径,作为一个尺寸度值或尺寸资源。
-
android:topRightRadius
- 尺寸数,右上角的半径,作为一个尺寸度值或尺寸资源。
-
android:bottomLeftRadius
- 尺寸数,左下角的半径,作为一个尺寸值或尺寸度资源。
-
android:bottomRightRadius
- 尺寸数,右下角的半径,作为一个尺寸值或尺寸度资源。
-
android:radius
注意:每个角的角半径必须大于1,不然没有圆角。如果想指定所有的角都不是圆角,使用android:radius 来设定默认的角半径大于1,然后重写每个角,并指定每个角的半径值为所需要的值,如果不需要圆角,值为0(0dp)。
<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
- 布尔型,为"true"时,作为一个 LevelListDrawable。
<padding>
- 填充以适用于视图元素(填充视图内容的位置而不是形状。
- 属性:
-
android:left
- 尺寸,左边填充,作为一个尺寸值或者尺寸资源。
-
android:top
- 尺寸,顶上填充,作为一个尺寸值或者尺寸资源。
-
android:right
- 尺寸,右边填充,作为一个尺寸值或者尺寸资源。
-
android:bottom
- 尺寸,底边填充,作为一个尺寸值或者尺寸资源。
<size>
- 形状的大小。
- 属性:
-
android:height
- 尺寸,形状的高,作为一个尺寸值或者尺寸资源。
-
android:width
- 尺寸,形状的宽,作为一个尺寸值或者尺寸资源。
注意:形状缩放大小以适应视图,与定义的尺寸相称,默认,当在一个图像视图使用形状时,可以限制缩放,通过设置 android:scaleType to "center"。
<solid>
- 固定颜色填充形状。
- 属性:
-
android:color
- 颜色,用到形状上的颜色,作为一个十六进制值或颜色资源。
<stroke>
- 形状的笔触。
- 属性:
-
android:width
- 尺寸,线的宽度,作为一个尺寸值或尺寸资源。
-
android:color
- 颜色,线的颜色,作为一个十六进制值或者颜色资源。
-
android:dashGap
- 尺寸,虚线间隔,作为一个尺寸值或尺寸资源,只有当设置android:dashWidth才有效。
-
android:dashWidth
- 尺寸,每个虚线的大小,作为一个尺寸值或尺寸资源,只有当设置android:dashGap才有效。
例子:
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布局应用到一个视图的形状drawable:
<TextView
android:background="@drawable/gradient_box"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
应用程序代码获得形状drawable,应用到视图:
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
另参见:
形状Drawable