ADNROID XML图像资源文件详细讲解(三)
前言
此篇主要介绍State List、Level List。
在实际项目开发中,有一个很简单的原理用于提升用户体验-------“用户对APP的所有触发,APP都应该有一个回应”。
一、State List介绍说明
通过名称直译过来就是(图像)状态集合。State-List类型图像资源展示的效果需要依赖于其他的对象(Button等)的状态变化。比如Button有3中状态,分别是按下(pressed)、获得焦点(focused)、失去焦点(没有被触发),每一个状态对应一个图片,就可以达到点击按钮从视觉上做到被按下后弹起。
关联的Java类:
语法样例<?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。
取值为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值最大的为准。
如果要使用这个属性,需要在控件状态更改的时候,同时处理执行Layout布局,很多情况是不支持此属性的。
此属性是建议使用默认值的,不需要修改。
其他的属性就不一一解释了。
注意事项:
1、<selector>标签中至少需要一个<item>标签
2、<item>状态为none的必须放在state list集合中所有<item>的最后面。不然,效果全无。(你可以把此项挡在第一个看看,点击按钮不会有状态图片的变化。)
<?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>
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用户的等级到某一个水平之后,所获得的勋章不一样;或者电池电量不足和满格时显示不通的颜色;等等。
??
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |