Android应用中的绘制资源(Drawable Resources)

可绘制资源是指能够被绘制到屏幕上的图形的一般化的概念,并且能够诸如getDrawable(int)等API方法来获取这些资源,或者使用诸如android:drawable和android:icon属性把它们应用到另一个XML资源中。

以下是几种不同的可绘制资源类型:

  • 位图文件(Bitmap File)

    位图图形文件(.png、.jpg或.gif)。每个位图资源会创建一个BitmapDrawable对象。

  • Nine-patch文件(Nine-Patch File)

    Nine-Patch文件是一个带有可拉伸区域的PNG文件,它允许图片基于内容进行尺寸的调整(.9.png)。每个Nine-Patch资源会创建一个NinePatchDrawable对象。

  • 层列表(Layer List)

    层列表管理一个绘制资源数组。它们会按照数组的顺序进行描画,因此索引最大的元素被画在最上面,一个层列表会创建一个LayerDrawable对象。

  • 状态列表(State List)

    状态列表是一个XML文件,文件中针对不同的状态定义了要引用的不同位图图形(例如,按钮被按下时,要使用的不同的图片)。一个状态列表会创建一个StateListDrawable对象。

  • 级别列表(Level List)

    级别列表是一个定义可替代绘制资源的XML文件,每个资源都会给分配一个最大的数字值,一个状态列表会创建一个LevelListDrawable对象。

  • 过渡绘制资源(Transition Drawable)

    它是一个定义绘制资源的XML文件,文件中的绘制资源能够在两个绘制资源之间渐入渐出。一个XML文件会创建一个TransitionDrawable对象。

  • 插图绘制资源(Inset Drawable)

    它是一个定义绘制资源的XML文件,文件中的绘制资源能够按照指定的距离插入到另一个绘制资源中。当View对象需要绘制的背景比View的实际边框要小时,这个资源是有用的。

  • 剪辑绘制资源(Clip Drawable)

    它是一个定义绘制资源的XML文件,使用文件中的定义,基于绘制资源的当前级别值对另一个绘制资源进行剪辑。它会创建一个ClipDrawable对象。

  • 缩放绘制资源(Scale Drawable)

    它是一个定义绘制资源的XML文件,使用这个文件中的定义会基于当前的级别值来改变另一个绘制资源尺寸。它会创建一个ScaleDrawable对象。

  • 形状绘制资源(Shape Drawable)

    它是一个定义几何图形的XML文件,包括颜色和几何形状。它会创建一个ShapeDrawable对象。

注意,在XML中,颜色资源也能够用于绘制资源。例如,在创建状态列表绘制资源时,adnroid:drawable属性就可以引用一个颜色资源(如,android:drawable="@color/green")

位图

Android支持三种格式的位图文件:.png(首选)、.jpg(次选)、.gif(不推荐使用)。

可以使用资源ID(文件名)直接引用位图文件,也可以在XML中创建一个别名资源。

注意:在编译期间,位图文件可以被aapt工具用无损图像压缩技术来自动的优化。例如,一个真彩色的PNG图片,不需要超过256色就可以用调试板给转换成8为的PNG图片。这样就会生成同等质量的图片,但却需要很少的内存。因此而要注意,放在这个目录镇南关的二进制图片能够在编译期间发生改变。如果计划用字节流来读取图片,以便把它转换成一个位图,就要把图片放到res/raw/文件夹镇南关,这样它们就不会被优化。

位图文件

这里的位图文件是指.png、.jpg、.gif格式文件。当把这些格式的文件保存在res/drawable/目录时,Android会给这些文件创建一个绘制资源。

文件位置

res/drawable/filename.png(.png、.jpg或.gif)。
文件名用于资源ID。

编译资源的数据类型

资源指向一个BitmapDrawable对象。

资源引用

  • 在Java代码中:
    R.drawable.filename;
  • 在XML中:
    @[package:]drawable/filename

例子

把一个图片保存在res/drawable/muimage.png中,布局XML把这个图片应用于一个View对象:

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/myimage"/>

应用程序在代码中用getDrawable()方法来获取Drawable对象:

Resources res=getResources();
Drawable drawable= res.getDrawable(R.drawable.myimage);

XML位图

XML位图是一个定义在XML中的资源,它指向一个位图文件。它是原始位图文件的一个别名。XML能够给位图指定额外的属性,如仿色和平铺。

注意:能够把<bitmap>元素作为<item>元素的子元素来使用。例如,在创建状态列表或层列表时,能够从<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:tileMode=["disabled" |"clamp" |"repeat" | "mirror"]/>

元素

<bitmap>元素

用来定义位图资源和资源属性。

<bitmap>元素的属性

xmlns:android —— 字符串值,定义XML的命名空间,必须是“http://schemas.android.com/apk/res/android”。如果是根元素,那么这个属性就是必须的。当被嵌套在内时,就不需要了。

android:src —— 绘制资源。必须的。它指向一个要绘制的资源。

android:antialias —— 布尔值。启用或禁用抗锯齿效果。

android:dither —— 布尔值。如果位图没有与屏幕相同的像素配置,这个属性会指示启用或禁用位图的仿色处理。

android:filter —— 布尔值,启用或禁用位图的过滤处理。在位图收缩或拉伸时,使用过滤处理让外观更平滑。

android:gravity —— 关键属性。定义位图的重心。如果位图比容器小,重心会指示绘制资源在容器中位置。必须是下列常量值的组合(组合设定时使用”|”符号分离):

说明
top把对象放到它的容器的顶部,不改变对象的尺寸。
bottom把对象放到它的容器的底部,不改变对象的尺寸。
left把对象放到它的容器的左边缘,不改变对象的尺寸。
right把对象放到它的容器的右边缘,不改变对象的尺寸。
center_vertical把对象放到它的容器的垂直中心,不改变对象的尺寸。
fill_vertical如果需要,对象的垂直尺寸会增长,以便垂直方向完全填充它的容器。
center_horizontal把对象放到它的容器的水平中心,不改变对象的尺寸。
fill_horizontal如果需要,对象的水平尺寸会增长,以便水平方向完全填充它的容器。
center把对象放到容器的中心位置,不改变尺寸。
fill如果需要,对象的水平和垂直尺寸都会增长,以便能够完全填充它的容器。
clip_vertical附加选项,能够设置把子对象的上边缘或下边缘裁剪到容器边框位置。裁剪要基于垂直中心的设置,top时要裁剪下边缘,bottom时要裁剪上边缘,而不是上下都要裁剪。
clip_horizontal附加选项,能够设置把子对象的左边缘或右边缘裁剪到容器边框位置。裁剪要基于水平中心的设置,left时要裁剪右边缘,right时要裁剪左边缘,而不是两边都要裁剪。

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"/>

Nine-Patch

Nine-Patch资源是一个PNG图片,在这个图片能够定义拉伸区域,当在View对象的内容超过了普通图片的边框时,Android会缩放这个拉伸区域。通常,把这种类型的图片作为View对象的北京,这个View对象至少有一个尺寸被设置为“wrap_content”,这样当View对象根据容纳的内容增长时,Nine-Patch图片也会根据View对象的大小被缩放。例如,使用Nine-Patch图片作为Android标准的Button控件的背景,它会根据Button内部容纳的文本来拉伸。

跟普通的位图一样,可以直接引用Nine-Patch文件,也可以从XML中定义的资源中来引用。

Nine-Patch文件

Nine-Patch文件位置

res/drawable/filename.9.png
文件名被用于资源ID。

编译资源的数据类型

资源指向一个NinePatchDrawable对象。

资源引用

  • 在Java代码中:
    R.drawable.filename
  • 在XML中:
    @[package:]drawable/filename

例子

以下布局XML中使用了res/drawable/myninepatch.9.png图片,作为一个View对象的背景:

<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能够给图片指定补色。

XML Nine-Patch文件位置

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资源和它的属性。

<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-patchxmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/myninepatch"
    android:dither="false"/>

层列表(Layer List)

LayerDrawable是一个绘制资源对象,它管理着一个其他绘制资源的数组。列表中的每个可绘制资源会按照列表中的顺序来绘制---列表中最后的资源会被绘制在最最上面。

每个绘制资源都用一个<item>元素来代表,这些<item>元素都被放在一个单独的<layer-list>元素内部。

文件位置

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>

元素

<layer-list>元素

必须的,它必须是根元素,包含了一个或多个元素。

<layer-list>元素的属性

xmlns:android —— 字符串值,必须的,它定义了XML的命名空间,必须是:http://schemas.android.com/apk/res/android。

<item>元素

定义一个层中的可绘制资源,其中的一个属性定义了资源的位置。这个可绘制资源必须是<selector>元素的一个子元素。<item>元素接受<bitmap>子元素。

<item>元素的属性

android:drawable —— 可以绘制资源,必须的,它指向一个可绘制资源。

android:id —— 资源ID,针对这个绘制资源的唯一的资源ID。要使用“@+id/name”格式给这个项目创建一个新的资源ID。“+”号指示这个资源应用创建一个新的ID。能够使用这个标识符,通过调用View.fineViewById()或Activity.findViewById()方法来获取和编辑可绘制资源。

android:top —— 整数值,顶部的偏移像素。

android:right —— 整数值,右边的偏移像素。

android:bottom —— 整数值,底部的偏移像素。

android:left —— 整数值,左边的偏移像素。

默认情况下,所有的可绘制项都会被缩放,以便适应容器View对象的尺寸。因此,把层列表中的图片放到不同的位置,可能会造成View对象的尺寸的增长,并且某些图片也做相应的缩放。要避免列表中的项目被缩放,就要在<item>元素内部使用<bitmap>元素来指定绘制资源,并且资源不缩放的重心,如“center”。如,下面的<item>元素定义了一个能够适应容器View缩放的绘制项目:

<itemandroid:drawable="@drawable/image"/>

要避免缩放,使用下面的方法来重新定义:

<item>
  <bitmapandroid:src="@drawable/image"
          android:gravity="center"/>
</item>

例子

XML文件被保存res/drawable/layers.xml中

<?xml version="1.0" encoding="utf-8"?>
<layer-listxmlns:android="http://schemas.android.com/apk/res/android">
    <item>
      <bitmapandroid:src="@drawable/android_red"
        android:gravity="center"/>
    </item>
    <itemandroid:top="10dp"android:left="10dp">
      <bitmapandroid:src="@drawable/android_green"
        android:gravity="center"/>
    </item>
    <itemandroid:top="20dp"android:left="20dp">
      <bitmapandroid:src="@drawable/android_blue"
        android:gravity="center"/>
    </item>
</layer-list>

要注意是,这个例子使用了嵌套的带有“center”重心的<bitmap>元素来给每个项目定义绘制资源。这样就确保了图片在绘制期间,不会为了适应容器的尺寸而被缩放。

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers"/>

下图是绘制结果:

状态列表(State List)

StateListDrawable一个被定义在XML中的可绘制对象,它依赖对象的状态,使用不同的图片来代表同一个图形。如,一个Button能够存在几种不同状态中的一种(如按下、聚焦或者都不是),通过使用状态列表,能够给每种状态提供不同的背景图片。

能够在一个XML文件中描述状态列表,每个图形都用一个<item>元素来代表,它们被放在<selector>元素内。每个<item>使用各种属性来描述图形被绘制时要使用那个状态。

在状态改变期间,状态列表会从上到下被遍历,并且会使用到第一个匹配的项目,然后遍历终止,选择不是基于最优匹配规则。

文件位置

res/drawable/filename.xml
filename被用于资源ID。

被编译资源的数据类型

资源指向一个StateListDrawable对象。

资源引用

  • 在Java代码中:
    R.drawable.filename
  • 在XML中:
    @[package:]drawable/filename

语法

<?xml version="1.0" encoding="utf-8"?>
<selectorxmlns: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>元素

必须的,它必须是根元素。要包含一个或多个元素。

<selector>的属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是http://schemas.android.com/apk/res/android

android:constantSize——一个布尔值,如果设置为true,那么绘制资源要报告内部尺寸,并把这个尺寸作为状态改变的常量(这个尺寸是所有状态中最大的那个);否则会基于当前状态来进行尺寸的变化,默认是false。

android:dither——一个布尔值,如果设置为true,那么会启用位图仿色处理,否则会禁用仿色处理,默认是true。

android:variablePadding——一个布尔值,如果设置为true,绘制资源的边距应该基于当前被选择的状态来改变,否则边距应该保持相同(基于所有状态中最大边距的那个)。启用这个功能需要自己处理状态变化时的布局,因此经常不支持这么设置。默认设置时false。

<item>元素

定义用于某个确定状态的绘制资源,这个资源是通过它的属性来描述的。它必须是<selector>元素的一个子元素。

<item>的属性
android:drawable——绘制资源,必须的。它指向要引用的可绘制资源。

android:state_pressed——一个布尔值,如果设置为true,那么这个项目应该在对象被按下时使用(如,当按钮被触摸或点击时)。否则这个项目会用于默认的非按下状态。

android:state_foucused——一个布尔值,如果设置为true,那么这个项目应该在对象有输入焦点时被使用(如用户选择了一个文本输入域);否则,这个项目应用被用于默认的非焦点状态。

android:state_houvered——一个布尔值,如果设置为true,那么这个项目应该在光标悬停在对象之上时被使用,否则应该使用默认的非悬停状态。通常,这个绘制资源会使用与“聚焦”状态相同的资源。
这个状态在API级别14中被引入。

android:state_selected——一个布尔值,如果设置为true,那么这个项目应该在用户选择了一个导航控件时使用(如,用方向板在一个列表中导航);如果设置为false,那么在对象没有被选择时这个项目就不应该使用这个状态。
当聚焦状态(android:state_focused)不满足需要时,要使用选择状态(如当列表视图有焦点,并且用导向板选择列表中的项目时)。

android:state_checkable——一个布尔值,如果设置为true,那么当对象是可被复选的时候,应该使用这个项目,否则这个对象不能被复现。(它仅在对象在可选和不可选之间变换时才有用)。

android:state_checked——一个布尔值,如果设置为true,那么这个项目应用在对象被复选时使用;否则应该使用于非复选状态。

android:state_enabled——一个布尔值,如果设置为true,那么这个项目应用于对象启用状态(接收触摸或点击事件的能力),否则应该用于禁用状态。

android:state_activated——一个布尔值,如果设置为ture,那么这个项目应该在对象被持久选择时使用(如对象的高亮状态),否则应该在对象没有被激活时使用这个状态。

android:state_window_focused——一个布尔值,如果设置true,那么这个项目应该在应用程序窗口有焦点时被使用(应用程序是在前台)。否则应该用于应用程序窗口没有焦点时的状态(如,通知栏被来下或对话框显示的时候)。

注意:要记住,Android会使用状态列表中第一个与当前状态匹配的项目,因此,如果列表中第一个项目没有包含以上介绍的任何一个属性,那么在任何时候都会使用这个项目,这就是为什么要它放到列表的最后的原因。

例子

XML文件被保存在res/drawable/button.xml中:

<?xml version="1.0" encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
    <itemandroid:state_pressed="true"
          android:drawable="@drawable/button_pressed"/><!-- pressed -->
    <itemandroid:state_focused="true"
          android:drawable="@drawable/button_focused"/><!-- focused -->
    <itemandroid:state_hovered="true"
          android:drawable="@drawable/button_focused"/><!-- hovered -->
    <itemandroid:drawable="@drawable/button_normal"/><!-- default -->
</selector>

下面的这个布局XML在一个Button控件上使用这个状态列表:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button"/>

级别列表(Level List)

级别列表管理着一组可选择的绘制资源,被管理的每个资源都会给分配一个最大的数字值。调用setLevel()方法给装载在级别列表中的有Android:maxLevel属性的绘制资源设置级别值。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>元素

它必须是根元素。包含一个或多个元素。

<level-list>的属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是:http://schemas.android.com/apk/res/android

<item>元素

定义了某个级别中使用的一个可绘制资源。

<item>的属性

android:drawable——绘制资源,必须的,它指向了一个要插入的可绘制资源。

android:maxLevel——整数值,指定这个项目所允许的最大级别。

android:minLevel——整数值,指定这个项目所允许的最小级别。

例子

<?xml version="1.0" encoding="utf-8"?>
<level-listxmlns: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()方法来改变级别。

过渡期绘制资源(Transition Drawable)

TransitionDrawable是一个绘制资源对象,它能够在两个绘制资源之间渐入渐出。

每个可绘制资源都用一个<item>元素来代表,它被放在一个单一的<transition>元素内部。在<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>

元素

<transition>元素

必须的,它必须是根元素,它要包含一个或多个元素。

<transition>的属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是:http://schemas.android.com/apk/res/android

<item>元素

它定义了一个绘制过渡效果的绘制资源,必须是元素的子元素,它还可以接收子元素。

<item>的属性

android:drawable——绘制资源,必须的。它应用一个可绘制资源。

android:id——资源ID,针对这个绘制资源的唯一的资源ID。要使用“@+id/name”格式,给这个项目创建一个新的资源ID,“+”指示应该给这个资源创建一个新的ID。通过这个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"?>
<transitionxmlns:android="http://schemas.android.com/apk/res/android">
    <itemandroid:drawable="@drawable/on"/>
    <itemandroid:drawable="@drawable/off"/>
</transition>

布局XML把这个绘制资源应用给一个View对象:

<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition"/>

下面的代码在第一项到第二项之间要执行500毫秒的过渡:

ImageButton button =(ImageButton) findViewById(R.id.button);
TransitionDrawable drawable =(TransitionDrawable) button.getDrawable();
drawable.startTransition(500);

嵌入可绘制资源(Inset Drawable)

定义在XML中的一个可绘制资源,它能够用指定的距离嵌入到另一个可绘制资源中。这种资源可在View对象需要的背景比它的实际边界小的时候使用。

文件位置

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>元素

定义嵌入的可绘制资源。它必须是根元素。

<inset>的属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是:http://schemas.android.com/apk/res/android

android:drawable——要绘制的资源,必须的,它指向一个要嵌入的可绘制资源。

android:insetTop——尺寸值。用尺寸值或Dimension资源定义顶部的嵌入位置。

android:insetRight——尺寸值。用尺寸值或Dimension资源定义右边的嵌入位置。

android:insetBottom——尺寸值。用尺寸值或Dimension资源定义底部的嵌入位置。

android:insetLeft——尺寸值。用尺寸值或Dimension资源定义左边的嵌入位置。

例子

<?xml version="1.0" encoding="utf-8"?>
<insetxmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/background"
    android:insetTop="10dp"
    android:insetLeft="10dp"/>

裁剪可绘制资源(Clip Drawable)

定义在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"] />

元素

<clip>元素定义要裁剪的绘制资源。它必须是根元素。

<clip>的属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是http://schemas.android.com/apk/res/android

android:drawable——可绘制的资源,必须的。它指向要裁剪的一个可绘制资源。

android:clipOrientation——关键值,它定义了裁剪的方向。必须是下列值之一。

说明
horizontal水平方向裁剪可绘制的资源
vertical垂直方向裁剪可绘制的资源

android:gravity——关键值,它指定了可绘制资源的裁剪位置。它必须是下表中的一个或多个值的组合(组合时用“|”来分隔)。

说明
top把对象放到容器的顶部,不改变它的尺寸。当clipOrientation被设置为vertical时,会在可绘制资源的底部进行裁剪。
bottom把对象放到容器的底部,不改变它的尺寸。当clipOrientation被设置为vertical时,会在可绘制资源的顶部进行裁剪。
left把对象放到容器的左边,不改变它的尺寸。这是默认的设置。当clipOrientation被设置为horizontal时,会在可绘制资源的右边进行裁剪。
right把对象放到容器的右边,不改变它的尺寸。当clipOrientation被设置为horizontal时,会在可绘制资源的左边进行裁剪。
center_vertical把对象放在容器的垂直中心位置,不改变它的尺寸。裁剪行为与重力被设为center时相同。
fill_vertical如果需要,对象的垂直尺寸会增长,以便在垂直方向能够完全填充它的容器。当clipOrientation被设置为vertical时,因为绘制资源要填充垂直空间,所以不会有裁剪发生(除非可绘制资源的级别是0,导致它不可见)。
center_horizontal把对象放在容器的水平中心,不改变它的尺寸。裁剪行为与重力是center是相同。
fill_horizontal如果需要,对象会增长它的水平尺寸,以便在水平方向能够完全填充它的容器。当clipOrientation被设置为horizontal时,因为可绘制资源要填充水平空间,所以不会有裁剪发生(除非可绘制资源被设置为0,导致它不可见)。
center把对象放到它的容器的中心位置,不改变它的尺寸。当clipOrientation被设置为horizontal时,在左右两边会发生裁剪;当clipOrientation被设置为vertical时,在上下两边会发生裁剪。
fill如果需要,对象水平和垂直尺寸都会增长,以便能够完全填充它的容器。因为可绘制资源要完全填充它的容器的水平和垂直空间,所以不会裁剪发生(除非可绘制资源的级别被设置为0,导致它不可见)。
clip_vertical额外的选项,它能够把它的容器的上下边界,设置为子对象的上下边缘的裁剪边界。裁剪要基于对象垂直重力设置:如果重力设置为top,则裁剪下边,如果设置为bottom,则裁剪上边,否则则上下两边都要裁剪。
clip_horizontal额外的选项,它能够把它的容器的左右边界,设置为子对象的左右边缘的裁剪边界。裁剪要基于对象垂直重力设置:如果重力设置为right,则裁剪左边,如果设置为left,则裁剪右边,否则则左右两边都要裁剪。

例子

XML文件被放在res/drawable/clip.xml中:

<?xml version="1.0" encoding="utf-8"?>
<clipxmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/android"
    android:clipOrientation="horizontal"
    android:gravity="left"/>

下面的布局XML给一个View对象应用了这个裁剪可绘制资源。

<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);

资源显示效果如下图:

缩放可绘制资源(Scale Drawable)

定义在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"/>

元素

<scale>元素

定义缩放可绘制资源。它必须是根元素。

<scale>属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是http://schemas.android.com/apk/res/android

android:drawable——可绘制资源,必须的,它指向一个要引用的可绘制资源。

android:scaleGravity——关键设置,它指定了缩放之后的重力位置。它必须是下列常量的一个或多个组合(多个的场合用“|”符合来连接)。

说明
top把对象放到容器的顶部,不改变它的尺寸。
bottom把对象放到容器的底部,不改变它的尺寸。
left把对象放到容器的左边,不改变它的尺寸。这是默认的设置。
right把对象放到容器的右边,不改变它的尺寸。
center_vertical把对象放在容器的垂直中心位置,不改变它的尺寸。
fill_vertical如果需要,对象的垂直尺寸会增长,以便在垂直方向能够完全填充它的容器。
center_horizontal把对象放在容器的水平中心,不改变它的尺寸。
fill_horizontal如果需要,对象会增长它的水平尺寸,以便在水平方向能够完全填充它的容器。
center把对象放到它的容器的中心位置,不改变它的尺寸。
fill如果需要,对象水平和垂直尺寸都会增长,以便能够完全填充它的容器。
clip_vertical额外的选项,它能够把它的容器的上下边界,设置为子对象的上下边缘的裁剪边界。裁剪要基于对象垂直重力设置:如果重力设置为top,则裁剪下边,如果设置为bottom,则裁剪上边,否则则上下两边都要裁剪。
clip_horizontal额外的选项,它能够把它的容器的左右边界,设置为子对象的左右边缘的裁剪边界。裁剪要基于对象垂直重力设置:如果重力设置为right,则裁剪左边,如果设置为left,则裁剪右边,否则则左右两边都要裁剪。

android:scaleHeight——百分比。它指定了缩放的高度。用可绘制资源的上下边界之间高度的百分比来表示。格式是xx%,例如:100%,12.5%,等。

android:scaleWidth——百分比。它指定了缩放的宽度。用可绘制资源的左右边界之间宽度的百分比来表示。格式是xx%,例如:100%,12.5%等。

例子

<?xml version="1.0" encoding="utf-8"?>
<scalexmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/logo"
    android:scaleGravity="center_vertical|center_horizontal"
    android:scaleHeight="80%"
    android:scaleWidth="80%"/>

形状可绘制资源(GradientDrawable)

它是定义在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="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>元素

定义一个几何形状资源,它必须是根元素。

<shape>属性

xmlns:android——字符串值,必须的。它定义了XML的命名空间,必须是:http://schemas.android.com/apk/res/android

android:shape——关键属性,它定义了形状的类型,有效值如下:

说明
rectangle在View对象中填充一个矩形。这是默认的形状。
oval适合View对象大小的椭圆形。
line贯穿View对象宽度的一个条水平线。这个形状需要用< stroke>元素来定义线的宽度。
ring一个圆环

下列属性只在android:shape=”ring”时使用:

android:innerRadiux——尺寸值,它用尺寸值或尺寸资源指定圆环内部的半径(指中间的圆孔的半径)。

android:innerRadiusRatio——浮点值,它用圆环宽度的比率来表示内部圆环的半径。例如,如果android:innerRadiusRatio=”5”,那么内部半径就等于圆环的宽度除以5。这个值会被android:innerRadius的值覆盖。默认是9。

android:thickness——尺寸值,它用一个尺寸值或尺寸资源来定义圆环的厚度。

android:thicknessRatio——浮点值。它用圆环宽度的比率来表示圆环的厚度。例如,如果android:thicknessRatio=”2”,那么厚度就等于圆环的宽度除以2。这个值会被android:innerRadius覆盖。默认值是3。

android:useLevel——布尔值,如果这个形状要用于LevelListDrawable对象,那么就设置为true。通常应该设置为false或者让形状不可见。

<corners>元素

给几何形状创建一个圆角,它只应用与矩形。

<corners>元素属性

android:radius——尺寸值,用尺寸值或尺寸资源(dimension resource)定义所有圆角的半径,它会被下列属性定义的每个角的值所覆盖。

android:topLeftRadius——尺寸值,它用尺寸值或尺寸资源定义左上角的圆角半径。

android:topRightRadius——尺寸值,它用尺寸值或尺寸资源定义右上角的圆角半径。

android:bottomLeftRadius——尺寸值,它用尺寸值或尺寸资源定义左下角的圆角半径。

android:bottomRightRadius——尺寸值,它用尺寸值或尺寸资源定义右下角的圆角半径。

注意:最初必须给每个角提供一个比1大的圆角半径,否则角不会被圆化。如果要想让角没有圆弧,一种工作方式是使用android:radius属性来设置默认的大于1的圆角半径,然后对于不想要圆弧的角,设置对应的属性为0dp,这样这个角就不会有圆弧了。

<gradient>元素

为几何形状指定渐变色。

<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——布尔值,如果要使用LevelListDrawable对象,就要设置为true。

<padding>元素

它定义了与包含形状的View元素相适应的边距(这个边距是View对象内容的位置,而不是形状的位置)。

<padding>元素属性

android:left——尺寸值,它用尺寸值或尺寸资源定义了左边距。

android:top——尺寸值,它用尺寸值或尺寸资源定义了上边距。

android:right——尺寸值,它用尺寸值或尺寸资源定义了右边距。

android:bottom——尺寸值,它用尺寸值或尺寸资源定义了下边距。

<size>元素

它定义了几何形状的大小。

<size>元素属性

android:height——尺寸值,它用尺寸值或尺寸资源定义了几何形状的高度。

android:width——尺寸值,它用尺寸值或尺寸资源定义了几何形状的宽度。

注意:默认情况下,几何形状定义的尺寸会被缩放到与它的容器相适应的尺寸。在ImageView对象中使用几何形状时,能够通过把android:scaleType属性设置为center来限制缩放。

<solid>元素

定义填充几何形状的实体颜色。

<solid>元素属性

android:color——颜色值。它指定应用与几何形状的颜色值。用十六进制的颜色值或颜色资源来表示。

<stroke>元素

给形状定义一个虚线。

<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"?>
<shapexmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45"/>
    <paddingandroid:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp"/>
    <cornersandroid:radius="8dp"/>
</shape>

以下是布局XML把这个形状资源应用于一个View元素的方法:

<TextView
    android:background="@drawable/gradient_box"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"/>

以下是代码获取形状资源,并把其应用于View对象的方法:

Resources res =getResources();
Drawable shape = res.getDrawable(R.drawable.gradient_box);
TextView tv =(TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1