Android Drawable Resource学习(五)、StateListDrawable
2015-07-25 07:23
507 查看
一个StateListDrawable就是一个在xml文件中定义,根据该对象不同的状态,用几张不同的图片来代表相同的图形。比如,一个按钮,有多种状态,获取焦点,失去焦点,点击等等,使用StateListDrawable可以根据不同的状态提供不同的背景。
在XML文件中描述这些状态列表。在唯一的一个<selector>标签下,使用<item>标签来代表一个图形。每个<item>标签使用各种属性来描述它所代表的状态所需要的drawable资源。
再次状态发生改变的时候,都会从上到下遍历这个状态列表,第一个和它匹配的将会被使用-------而不是去选择最适合的匹配。
文件位置
[java] view
plaincopy
res/drawable/filename.xml
The filename is used as the resource ID.
资源引用:
[java] view
plaincopy
In Java: R.drawable.filename
In XML: @[package:]drawable/filename
语法:
[java] view
plaincopy
<?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>元素
属性
属性:
api14后新增的
api11后新增
注意:Android系统将会选中第一条符合当前状态的item。。因此,如果第一项列表中包含了所有的状态属性,那么它是每次就只用他。这就是为什么你的默认值应该放在最后面。
举例:
XML文件的实现:
[java] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/botton_add" />
<item android:state_pressed="true" android:drawable="@drawable/botton_add_down" />
<item android:state_selected="true" android:drawable="@drawable/botton_add" />
<item android:drawable="@drawable/botton_add" />//默认
</selector>
[java] view
plaincopy
<Button
android:background="@drawable/statelist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Java代码的实现:
[java] view
plaincopy
Button btn=(Button)findViewById(R.id.btn);
StateListDrawable drawable=new StateListDrawable();
//如果要设置莫项为false,在前面加负号 ,比如android.R.attr.state_focesed标志true,-android.R.attr.state_focesed就标志false
drawable.addState(new int[]{android.R.attr.state_focused}, this.getResources().getDrawable(R.drawable.botton_add));
drawable.addState(new int[]{android.R.attr.state_pressed}, this.getResources().getDrawable(R.drawable.botton_add_down));
drawable.addState(new int[]{android.R.attr.state_selected}, this.getResources().getDrawable(R.drawable.botton_add));
drawable.addState(new int[]{}, this.getResources().getDrawable(R.drawable.botton_add));//默认
btn.setBackgroundDrawable(drawable);
[java] view
plaincopy
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
使用举例:
http://www.apkbus.com/forum.php?mod=viewthread&tid=52722
在XML文件中描述这些状态列表。在唯一的一个<selector>标签下,使用<item>标签来代表一个图形。每个<item>标签使用各种属性来描述它所代表的状态所需要的drawable资源。
再次状态发生改变的时候,都会从上到下遍历这个状态列表,第一个和它匹配的将会被使用-------而不是去选择最适合的匹配。
文件位置
:
[java] view
plaincopy
res/drawable/filename.xml
The filename is used as the resource ID.
编译数据类型:
指向StateListDrawable的指针
资源引用:
[java] view
plaincopy
In Java: R.drawable.filename
In XML: @[package:]drawable/filename
语法:
[java] view
plaincopy
<?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字符串。 必须的。定义命名空间,必须是
"http://schemas.android.com/apk/res/android"。
android:constantSize布尔值。内部大小(所有状态中最大的那个)改变时是否报道。默认为false
android:dither布尔值。如果位图与屏幕的像素配置不同时,是否允许抖动.(例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565)
android:variablePadding布尔值。默认为false,是否要进行绘图填充。(不明白)
<item>为某个状态定义一个drawable,必须作为<selector>的子元素。
属性:
android:drawable必须的,指向一个drawable资源
android:state_pressedBoolean。是否按下
android:state_focusedBoolean。是否获得获得焦点
android:state_hoveredBoolean。鼠标在上面滑动的状态。通常和state_focused使用同样的drawable
api14后新增的
android:state_selectedBoolean。是否选中
android:state_checkableBoolean。是否可以被勾选(checkable)。只能用在可以勾选的控件上
android:state_checkedBoolean。是否被勾选上
android:state_enabledBoolean。是否可用
android:state_activatedBoolean。是否被激活并持久的选择
api11后新增
android:state_window_focusedBoolean。当前应用程序是否获得焦点
注意:Android系统将会选中第一条符合当前状态的item。。因此,如果第一项列表中包含了所有的状态属性,那么它是每次就只用他。这就是为什么你的默认值应该放在最后面。
举例:
XML文件的实现:
[java] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/botton_add" />
<item android:state_pressed="true" android:drawable="@drawable/botton_add_down" />
<item android:state_selected="true" android:drawable="@drawable/botton_add" />
<item android:drawable="@drawable/botton_add" />//默认
</selector>
[java] view
plaincopy
<Button
android:background="@drawable/statelist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Java代码的实现:
[java] view
plaincopy
Button btn=(Button)findViewById(R.id.btn);
StateListDrawable drawable=new StateListDrawable();
//如果要设置莫项为false,在前面加负号 ,比如android.R.attr.state_focesed标志true,-android.R.attr.state_focesed就标志false
drawable.addState(new int[]{android.R.attr.state_focused}, this.getResources().getDrawable(R.drawable.botton_add));
drawable.addState(new int[]{android.R.attr.state_pressed}, this.getResources().getDrawable(R.drawable.botton_add_down));
drawable.addState(new int[]{android.R.attr.state_selected}, this.getResources().getDrawable(R.drawable.botton_add));
drawable.addState(new int[]{}, this.getResources().getDrawable(R.drawable.botton_add));//默认
btn.setBackgroundDrawable(drawable);
[java] view
plaincopy
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
使用举例:
http://www.apkbus.com/forum.php?mod=viewthread&tid=52722
相关文章推荐
- Android Drawable Resource学习(四)、LayerDrawable
- Android Drawable Resource学习(三)、NinePatchDrawable和NinePatch图片的制作
- Android Api Demos登顶之路(四)
- Android Drawable Resource学习(二)、BitmapDrawable和Bitmap
- Android Drawable Resource学习(一)、Drawable Resource简介
- android Graphics(四):canvas变换与操作
- android Graphics(三):区域(Range)
- android Graphics(三):区域(Range)
- android Graphics(二):路径及文字
- android Graphics(一):概述及基本几何图形绘制
- android 概述 及四大组件
- Android个人错误笔记
- 关于android dropbox API的几点学习
- Android ListView美化
- Android之ListView进阶
- Android studio(Windows)快捷键
- Android声明和使用权限
- Android Studio打包.so文件教程
- Android隐式启动Activity匹配详解:Action,category,data
- Android小记:之Android开发规范