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

前言

此篇主要介绍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张大小不同的图片,如下:
small.png big.png
.../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用户的等级到某一个水平之后,所获得的勋章不一样;或者电池电量不足和满格时显示不通的颜色;等等。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨景文Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值