您的位置:首页 > 移动开发 > Android开发

ADNROID XML图像资源文件详细讲解(三)

2015-07-30 16:36 597 查看

前言

此篇主要介绍State List、Level List。
在实际项目开发中,有一个很简单的原理用于提升用户体验-------“用户对APP的所有触发,APP都应该有一个回应”。

一、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。
取值为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>


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用户的等级到某一个水平之后,所获得的勋章不一样;或者电池电量不足和满格时显示不通的颜色;等等。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息