Drawable Resources Part II(Drawable 资源 第二部分)

Layer List

一个LayerDrawable是一个管理着多个drawable对象集合的drawable。集合中的每个drawable按照后进入的在最顶端的规则被绘制

在< layer-list >节点下,每个drawable由一个< item >来表示

  • 文件路径:res/drawable/filename.xml 文件名就是对应的资源ID

  • 编译过的资源类型: LayerDrawable

  • 资源引用:

    • JAVA中: R.drawable.filename
    • XML中: @[package:]drawable/filename
  • 示例:现有一张图片位于res/drawable/myimage.png,下面代码展示了如何应与于一个View上

  • 语法

<?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
      String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。
  • < item > 通过它的属性定义定义了在drawable层中的一个drawable。必须是< selector >的子元素,也可以是 < bitmap > 的子元素
    属性:

    • android:drawable
      Drawable资源,必须,指向一个drawable。

    • android:id
      资源ID,为当前drawable指定一个唯一的ID。如果想要为当前项创建一个新的ID,可使用如下方法:”@+id/name”。加号表示这里应该创建一个新的ID。你可以通过 View.findViewById()或者Activity.findViewById()来得到或者修改这个drawable。

    • android:top
      Integer类型。距离上方的偏移像素值。

    • android:right
      Integer类型。距离右方的偏移像素值。

    • android:bottom
      Integer类型。距离下方的偏移像素值。

    • android:left
      Integer类型。距离左方的偏移像素值。

默认情况下,所有的Drawable都会通过拉伸来适应容器的大小。因此,把Drawable放置在层中的不同位置可能会导致View容器的大小变大以及部分Drawable会适当的拉伸。为了避免层中的成员被拉伸,可以使用 < bitmap >替代 < item > 来指定drawable并为那些不会缩放的成员指定gravity属性,比如“center”。下面的例子中,< item >定义了一个拉伸同View容器相适应的成员:

<item android:drawable="@drawable/image" />

为了避免拉伸,下面的例子使用了 < bitmap >并指定gravity属性为center:

<item>
  <bitmap android:src="@drawable/image" android:gravity="center" />
</item>
  • 示例:
    该文件保存在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>

我们注意到在这个例子中嵌套使用了< bitmap >来定义drawable资源并指定了gravity属性为“center”。这保证了图像不会被缩放来适应容器的大小,由于调整图像的大小而产生偏移。

下面展示如何把定义的drawable用于一个View

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

最终结果是得到一些偏移的图像:

State List

一个StateListDrawable表示了一个根据对象的不同状态展示不同图形的drawable对象。比如,一个按钮可以存在一个或多个状态(按下、焦点或者其他),通过使用State List,你可以为每一个状态都指定一个背景图。

你可以在一个XML文件中定义State List。每个图像由定义在< selector >节点下的 < item >节点来表示。每个< item >使用各种属性来来描述此时该使用何种图像来表示状态。在状态改变时,State List会从头到尾的变量每一个元素,首个符合状态定义的元素将会被使用,这种选择方式并非是“最优选”,仅仅是找到一个符合最低标准的首项。

  • 文件路径: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
      String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。

    • android:constantSize
      布尔类型,”true”表示当状态改变时,drawable的大小不变(所有状态下均为最大值)。“false”表示大小变化基于当前状态,默认值为flase。

    • android:dither
      布尔类型,“true”表示开启抗抖动,当位图和屏幕不具有相同的像素配置(例如:一个RGB 565屏幕和ARGB 8888位图)时生效。“false”停用抗抖动,默认为true。

    • android:variablePadding
      布尔类型,“true”表示drawable的padding值会根据选择后状态发生变化;“false”表示padding值会保持不变(基于所有状态下的最大值)。启用此功能后当状态变化时需要你来处理布局,这往往是不建议的。默认为false。

  • < item > 通过它的属性定义了对应状态的一个drawable。必须是< selector >的子元素。

    属性:

    • android:drawable
      Drawable资源,必须,指向一个drawable。

    • android:state_pressed
      布尔类型。”true” 表示该资源应用于按下状态 (比如一个按钮的touch/clicked事件);”false” 应用于正常的非点击状态下。

    • android:state_focused
      布尔类型。 “true” 表示该资源用于获得输入焦点状态(比如用户选择了一个输入框控件时);”false” 应用于正常的非焦点状态下。

    • android:state_hovered
      布尔类型。 “true” 表示该资源用于光标悬停状态; “false” 应用于正常的非光标悬停状态。通常来讲, 这个图像资源同 “focused” 状态下的图像资源是同一个。
      在API level 14中有介绍。

    • android:state_selected
      布尔类型。”true” 表示该资源用于用户选择一个导航栏中的某一项(比如使用方向键选择了导航栏中的某项);”false” 应用于非选择状态。
      该状态用于焦点状态并不足以表达状态的情况下(比如一个列表获得了焦点随后其内部的item被方向键选中)

    • android:state_checkable
      布尔类型。 “true” 表示该资源用于可选中状态 “false” 应用于正常的不可选中状态。(只对可以在checkable和non-checkable间切换的控件有效)

    • android:state_checked
      布尔类型。 “true” 表示该资源用于被选中状态; “false” 应用于正常的非选中状态。

    • android:state_enabled
      布尔类型。 “true” 表示该资源用于启用状态(能够接收触摸/单击事件); “false” 应用于正常的禁用状态。

    • android:state_activated
      布尔类型。”true”表示该资源用于持久的激活状态(比如在导航栏中的高亮选中项); “false” 应用于非激活状态.
      在API level 11中有介绍。

    • android:state_window_focused
      布尔类型。”true”表示该资源用于应用窗口获得焦点(即应用在前台运行), “false”应用于应用窗口没有得到焦点的状态 (比如,通知栏下拉或者是有个dialog弹出时 )。

  • 示例
    该文件保存在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>

下面的布局XML中的按钮使用了上面定义的list drawable

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

也可以参考:

  • StateListDrawable

Level List

一个管理多个交替显示元素集合的Drawable。每个元素分配了一个最大的数字数值。通过setLevel() 方法对drawable来设定level数值,就会得到android:maxLevel值大于或等于level值的对应Drawable资源。

  • 文件路径: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
      String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。
  • < item > 定义了对应某些level的drawable

    属性:

    • android:drawable
      Drawable资源,必须,指向一个drawable。

    • android:maxLevel
      Integer类型。 当前itme的level上限。

    • android:minLevel
      Integer. 当前itme的level下限。

  • 示例:

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

一旦这被应用到一个View,level值可以通过setLevel() 或者 setImageLevel()来改变。

也可以参考:

  • LevelListDrawable

Transition Drawable

TransitionDrawable是可以实现两个drawable资源间淡入淡出效果的drawable对象。

每个drawable可由一个< item >元素在唯一的< 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>

元素:

  • < transitiont >必须,作为根节点存在,在其内部,有一个或者多个 < item > 子节点

    属性:

    • xmlns:android
      String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。
  • < item > 定义了整个过程中的一个drawable,必须是< transition >的子节点,也可以是< bitmap >来作为子节点

    属性:

    • android:drawable
      Drawable资源,必须,指向一个drawable。

    • android:id
      资源ID,为当前drawable指定一个唯一的ID。如果想要为当前项创建一个新的ID,可使用如下方法:”@+id/name”。加号表示这里应该创建一个新的ID。你可以通过 View.findViewById()或者Activity.findViewById()来得到或者修改这个drawable。

    • android:top
      Integer类型。距离上方的偏移像素值。

    • android:right
      Integer类型。距离右方的偏移像素值。

    • android:bottom
      Integer类型。距离下方的偏移像素值。

    • android:left
      Integer类型。距离左方的偏移像素值。

  • 示例
    该文件保存在 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使用了上面定义的Transition Drawable

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

也可以参考:

  • TransitionDrawable

Inset Drawable

定义了一个Drawable根据一定距离插入到另外一个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 drawable,作为根节点存在

    属性:

    • xmlns:android
      String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。

    • android:drawable
      Drawable资源,必须,指向一个drawable。

    • android:insetTop
      Dimension(DP单位)。距离上方的DP尺寸,可以为指定的DP数值或者DP资源

    • android:insetRight
      Dimension(DP单位)。距离右方的DP尺寸,可以为指定的DP数值或者DP资源

    • android:insetBottom
      Dimension(DP单位)。距离下方的DP尺寸,可以为指定的DP数值或者DP资源

    • android:insetLeft
      Dimension(DP单位)。距离左方的DP尺寸,可以为指定的DP数值或者DP资源

  • 示例

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

也可以参考:

  • InsetDrawable

你可能感兴趣的:(resources,layer-list,State-List,drawable对象)