一个LayerDrawable是一个管理着多个drawable对象集合的drawable。集合中的每个drawable按照后进入的在最顶端的规则被绘制
在< layer-list >节点下,每个drawable由一个< item >来表示
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: LayerDrawable
资源引用:
示例:现有一张图片位于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 > 子节点
属性:
< 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>
<?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" />
最终结果是得到一些偏移的图像:
一个StateListDrawable表示了一个根据对象的不同状态展示不同图形的drawable对象。比如,一个按钮可以存在一个或多个状态(按下、焦点或者其他),通过使用State List,你可以为每一个状态都指定一个背景图。
你可以在一个XML文件中定义State List。每个图像由定义在< selector >节点下的 < item >节点来表示。每个< item >使用各种属性来来描述此时该使用何种图像来表示状态。在状态改变时,State List会从头到尾的变量每一个元素,首个符合状态定义的元素将会被使用,这种选择方式并非是“最优选”,仅仅是找到一个符合最低标准的首项。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: StateListDrawable
资源引用:
语法:
<?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" />
也可以参考:
一个管理多个交替显示元素集合的Drawable。每个元素分配了一个最大的数字数值。通过setLevel() 方法对drawable来设定level数值,就会得到android:maxLevel值大于或等于level值的对应Drawable资源。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: LevelListDrawable
资源引用:
语法:
<?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 > 子节点
属性:
< 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()来改变。
也可以参考:
TransitionDrawable是可以实现两个drawable资源间淡入淡出效果的drawable对象。
每个drawable可由一个< item >元素在唯一的< transition >节点中表示。但是不可以多余两个item。想要开始切换,调用starttransition()方法。想要回复切换前状态,调用reversetransition()方法。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: TransitionDrawable
资源引用:
语法:
<?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 > 子节点
属性:
< 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);
也可以参考:
定义了一个Drawable根据一定距离插入到另外一个Drawable中的XMl文件,当需要对一个View指定一个小于它自身大小的背景图时,可以使用它。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: InsetDrawable
资源引用:
语法:
<?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" />
也可以参考: