Drawable Resources(可绘制的资源)

时间:2023-01-29 20:32:39


原文链接: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. 这两个属性.

有如下多种图形概态.

Bitmap File

一个位图文件(.png,.jpg,或.gif), 生成一个BitmapDrawable对象.

Nine-Patch File

就是一张可以基于自动适应内容大小而伸缩区域的png图片(.9.png), 生成一个NinePatchDrawable对象

Layer List

这个Drawable用来管理一个其它多个drawable的数组.既然是一个数组,所以就不难理解索引值最大的元素将画在最高部. 生成一个 LayerDrawable对象.

State List

这是一个xml文件用于不同的状态来引用不同的位图图形(比如,当一个Button控件按下状态要显示不同的图像).生成一个StateListDrawable对象.

Level List

一个xml文件,定义了一个drawable可用于管理几个可以替换的drawable.每一个都会分配一个最大的数值.生成一个LevelListDrawable.

Transition Drawable

一个xml文件,定义了一个drawable可用于两张图片形成一个渐变的过渡效果生成一个TransitionDrawable对象

Inset Drawable

一个xml文件,定义了一个drawable,跟据指定的距离插入到另一个drawable.当一个View<视图>对象需要一张比其实际边框要小的背景图时,就可以用到这个了.

Clip Drawable

一个xml文件,定义了一个drawable, 根据当前对准值作相应的拉伸处理,生成 ClipDrawable对象.

Scale Drawable

一个xml文件,定义了一个drawable, 根据当前对准值作相应的平铺处理,生成 ScaleDrawable对象.

Shape Drawable

就是通过一个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”。
android:src
可绘制资源,必要的,指向一个Nine-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" />

 

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 Resources(可绘制的资源)

另参考图层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:dither
布尔型,"true",当位图的像素配置与屏幕的不一致时,允许位图抖动(例如,一个ARGB 8888 的位图和一个RGB 565 的屏幕);"false",不允许抖动,默认设置为"false"。
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_checkable
布尔型,为"true"时,对象是是可核对的;为"false"时,对象不可核对的。(只当对象可以在可核对与不可核对控件间变换时使用)
android:state_enabled
布尔型,为 "true"时,对象许可(能够接受到触摸或单击事件);为"false"时,对象不许可。
android:state_activated
布尔型,为"true"时,由于持久的选择使对象处于激活状态,(诸如在一种持久的导航视图中高亮标示列表选项);为"false"时,对象没有处于激活状态。
详细介绍在API11
android:state_window_focused
布尔型,为"true"时,焦点在应用的窗口(此应用处于前台),此应用的窗口没有获得焦点(例如当有通知栏拉下或对话出现).

注意:记住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: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>
 

一旦把此应用到一个视图上,此等级值可以通过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"。
<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
整型,像素的左边偏移量。

举例:

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
尺寸,左边插入,作为一个尺寸值或尺寸资源。

举例:

 
<?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:

Drawable Resources(可绘制的资源)

注意:默认级别为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:thickness
尺寸,环的厚度,作为一个尺寸值或尺寸资源。
android:thicknessRatio
浮点型,环的厚度比上环的宽度,例如,如果android:thicknessRatio="2",厚度等于环的宽度的1/2,此值被android:innerRadius重写,默认为3.
android:useLevel
布尔型,为"true"时,用于LevelListDrawable,正常情况设为"false",或者形状不出现。

<corners>

为形状创建圆角,只有当形状为矩形时才应用。
属性:
android:radius
尺寸数,所有的角的半径,作为一个尺寸值或尺寸资源,对于每个角会重写如下的属性:
android:topLeftRadius
尺寸数,左上角的半径,作为一个尺寸度值或尺寸资源。
android:topRightRadius
尺寸数,右上角的半径,作为一个尺寸度值或尺寸资源。
android:bottomLeftRadius
尺寸数,左下角的半径,作为一个尺寸值或尺寸度资源。
android:bottomRightRadius
尺寸数,右下角的半径,作为一个尺寸值或尺寸度资源。

注意:每个角的角半径必须大于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