前言
此篇主要介绍State List、Level List。
一、State List介绍
说明
通过名称直译过来就是(图像)状态集合。State-List类型图像资源展示的效果需要依赖于其他的对象(Button等)的状态变化。比如Button有3中状态,分别是按下(pressed)、获得焦点(focused)、失去焦点(没有被触发),每一个状态对应一个图片,就可以达到点击按钮从视觉上做到被按下后弹起。
关联的Java类:
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
此属性的取值为false和true。默认是false。
例子:
此处以RadioButton为例。
分别有2张大小不同的图片,如下:
.../drawable/state_list.xml代码如下:
<?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:constantSize为false时:
android:constantSize为true时:
android:variablePadding
此属性的取值也是boolean类型。
取值为true时:保持各个Drawable对象的Padding属性不变。
取值为false时:修改各个Drawable对象的Padding以Padding值最大的为准。
其他的属性就不一一解释了。
注意事项:
<?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用户的等级到某一个水平之后,所获得的勋章不一样;或者电池电量不足和满格时显示不通的颜色;等等。
原文链接:https://www.f2er.com/xml/296381.html