前言
一、State List介绍
说明
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>
以上是语法,告诉我们怎么写state-list。其中几乎包含了所有状态。但不是每一个状态都适用在所有的控件对象上。比如Button和RadioButton对应的状态就不一样:Button对应state_pressed状态,RadioButton对应state_checked状态(),等等。
属性介绍
android:constantSize
例子:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="false">
<item android:state_checked="true"
android:drawable="@drawable/small"/> <!-- checked -->
<item android:drawable="@drawable/big" /> <!-- default -->
</selector>
.../layout/main.xml中的RadioButton使用上面的state_list.xml图像资源文件,如下所示:
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@drawable/state_list"
android:text="state list"/>
效果如下(以下效果全是checked状态。):
android:variablePadding
注意事项:
<?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>
二、Level List介绍
Level List也是一个Drawable的对象集合,不同的是Level List集合中的drawable对象交替出现----也就是不会同时一起出现,达到一定的Level,就会有对应Level的drawable对象显示。
关联的类:
LevelListDrawable
先来看看Level List的语法:
语法
<?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的属性很少,只有3个。我重点说明一下maxLevel和MinLevel。
maxLevel和MinLevel就是指定Level的最大值和最小值。取值范围是0到10000。
真正得使用需要调用Drawable对象的setLevel方法。
使用
1、使用在SeekBar中
level_list.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/red"
android:maxLevel="5000"
android:minLevel="0"></item>
<item android:drawable="@color/yellow"
android:maxLevel="10000"
android:minLevel="5001"></item>
</level-list>
SeekBar的代码:
<SeekBar
android:id="@+id/progressbar01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="1000"
android:progressDrawable="@drawable/level_list"/>
效果如下(我们上面的代码设置的maxLevel为0-5000和5001-10000.):
需要注意的是,maxLevel和minLevel的最大和最小值,跟SeekBar的android:max属性,没有直接联系。
2、使用在ImageView中
level-list.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/red"
android:maxLevel="0"></item>
<item android:drawable="@color/yellow"
android:maxLevel="1"></item>
<item android:drawable="@color/green"
android:maxLevel="2"></item>
</level-list>
activity中的代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.level_list);
imageView.getDrawable().setLevel(2);//通过setLevel设置Level值,从而显示对应Level的Drawable对象。此处Level为2对应的是绿色。
setContentView(imageView);
}
效果图如下:
同样设置setLevel(0)显示红色,setLevel(1)显示黄色。
这样在同一个ImageView对象上,可以很简单的进行图片的轮换。
Level List的用处很多,比如APP用户的等级到某一个水平之后,所获得的勋章不一样;或者电池电量不足和满格时显示不通的颜色;等等。