Android中使用level-list改变View显示状态

LeveListDrawable对应的是level-list标签,它表示的是一组可进行切换的drawable图片资源集合,集合里面的每一项drawable资源都有一个对应的level,在代码中通过ViewsetLevel()方法设置不同的等级,等级的范围为0-10000(最小值和默认值都是0),然后根据不同的等级在level-list中匹配对应的drawable资源来显示。判断加载某项的方式为:level-list中某项的maxLevel数值大于或者等于setLevel设置的数值时就会被加载。

使用场景:

  • 音量大小调节
  • 简单的进度条
  • 电量剩余图标
  • wifi信号信息等

语法:

<?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-listitem放置的前后顺序需要注意,系统会从上往下匹配,如果查找到的item符合当前的状态,则不会再继续向下查找其它item,同时Level值不能为负数,只能是正整数。

属性:

  • drawabledrawable类型,匹配的图片资源。
  • maxLevelinteger类型,匹配的最大值。
  • minLevelinteger类型,匹配的最小值。

举例:

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 值为0~25时显示图片 -->
    <item
        android:drawable="@drawable/level1"
        android:maxLevel="25"
        android:minLevel="0" />

    <!-- 值为26~50时显示图片 -->
    <item
        android:drawable="@drawable/level2"
        android:maxLevel="50"
        android:minLevel="26" />

    <!-- 值为51~75时显示图片 -->
    <item
        android:drawable="@drawable/level3"
        android:maxLevel="75"
        android:minLevel="51" />

    <!-- 值为76~100时显示图片 -->
    <item
        android:drawable="@drawable/level4"
        android:maxLevel="100"
        android:minLevel="76" />
</level-list>

引用:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <!-- ImageView可通过src或background设置 -->
        <ImageView
            android:id="@+id/iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/level_list" />

        <!-- 其它控件通过background设置 -->
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/level_list" />
    </LinearLayout>

应用:

package com.example.administrator.test;

import android.app.Activity;
import android.graphics.drawable.LevelListDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView mIv;
    private Button mBtn;
    private Button mChange;
    private int num = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        setLintener();
    }

    private void initView() {
        mIv = (ImageView) findViewById(R.id.iv);
        mBtn = (Button) findViewById(R.id.btn);
        mChange = (Button) findViewById(R.id.change);
    }

    private void setLintener() {
        mChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (num > 90) {
                    num = 0;
                }

                //ImageView如果是通过src引用的,可通过getDrawable方法获取LevelListDrawable对象,也可直接通过setImageLevel方法直接设置level值
                LevelListDrawable levelListDrawable1 = (LevelListDrawable) mIv.getDrawable();
                levelListDrawable1.setLevel(num);

                //如果是通过background引用的,可通过getBackground方法获取LevelListDrawable对象设置level值
                LevelListDrawable levelListDrawable2 = (LevelListDrawable) mBtn.getBackground();
                levelListDrawable2.setLevel(num);

                num += 30;
            }
        });
    }
}

使用LevelListDrawable注意事项:
1. 默认的level0,如果没有和0匹配的level,那么就不显示。
2. level匹配以maxLevel优先,即如果有个itemminLevel="1" maxLevel="2",另一个itemminLevel="2" maxLevel="3",如果此时设置level2,那么会匹配第一个item


版权声明:本文为my_rabbit原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。