Drawable学习之----LevelListDrawable

一个LevelListDrawable管理着一组交替的drawable资源。LevelListDrawable里面的每一个drawable资源与一个最大数值结合起来,作为LevelListDrawable资源的一项。

调用Drawable的setLevel()方法可以加载level-list或代码中定义的某个drawable资源,判断加载某项的方式:level-list中某项的Android:maxLevel数值大于或者等于setLevel设置的数值,就会被加载。


文件位置:
res/drawable/filename.xml
文件名作为资源ID
编译资源类型:
指向LevelListDrawable的指针
资源引用:
In Java: R.drawable.filename
In XML: @[package:]drawable/filename
语法:
<?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>
必须作为根节点。包含多个<item>节点。

属性:

xmlns:android
String类型。必须的。定义XML文件的命名空间,必须是 "http://schemas.android.com/apk/res/android".
<item>
定义某个level使用的drawable资源

属性:

android:drawable
Drawable 资源。必须的。引用一个Drawable资源
android:maxLevel
Integer类型。该项所允许的最大level。
android:minLevel
Integer类型。该项所允许的最小level。
例子:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/status_off"
        android:maxLevel="0" />
    <item
        android:drawable="@drawable/status_on"
        android:maxLevel="1" />
</level-list>

当应用于一个View的时后,可以使用setLevel()或者setImageLevel()方法来改变level。setLevel()山谷LevelListDrawable的方法,setImageLevel是某些View的方法

参考:



下面看下具体的使用实例:

1、在XML文件中定义

level_list.xml:

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <level-list xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <item android:maxLevel="1" android:drawable="@drawable/image1" />  
  4.   <item android:maxLevel="2" android:drawable="@drawable/image2" />  
  5.   <item android:maxLevel="3" android:drawable="@drawable/image3" />  
  6.   <item android:maxLevel="4" android:drawable="@drawable/image4" />  
  7.   <item android:maxLevel="5" android:drawable="@drawable/image5" />  
  8.  </level-list>  

在布局文件main.xml中:

<ImageView 
        android:id="@+id/imgView"
        android:src="@drawable/level_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


2、在代码中使用:

因为我所使用的图片过大,会导致内存泄露,所以做了一些处理。

[java] view plain copy
  1. package com.example.drawabletest;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.drawable.BitmapDrawable;  
  7. import android.graphics.drawable.LevelListDrawable;  
  8. import android.os.Bundle;  
  9. import android.view.Menu;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12. import android.widget.ImageView;  
  13. import android.widget.Toast;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     private int[] ids = new int[] { R.drawable.image1, R.drawable.image2, R.drawable.image3,  
  18.             R.drawable.image4, R.drawable.image5 };  
  19.   
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         final ImageView imageView = (ImageView) findViewById(R.id.imgView);  
  25.   
  26.         BitmapFactory.Options opts = new BitmapFactory.Options();  
  27.         opts.inJustDecodeBounds = true;  
  28.         BitmapFactory.decodeResource(getResources(), R.drawable.image1, opts);  
  29.         opts.inSampleSize = computeSampleSize(opts, -1500 * 500);  
  30.         opts.inJustDecodeBounds = false;  
  31.           
  32.         LevelListDrawable levelListDrawable = new LevelListDrawable();//定义一个LevelDrawable  
  33.         try {  
  34.             for (int i = 0; i < ids.length; i++) {//for循环,加载5个drawable资源  
  35.                 Bitmap  bmp = BitmapFactory.decodeResource(getResources(),ids[i], opts);  
  36.                 BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp);  
  37.                 levelListDrawable.addLevel(i, i+1, bitmapDrawable);//添加到LevelListDrawable  
  38.             }  
  39.             imageView.setImageDrawable(levelListDrawable);//设置  
  40.         } catch (OutOfMemoryError err) {  
  41.             err.printStackTrace();  
  42.         }  
  43.           
  44.         imageView.setImageLevel(1);//默认的level为0,将到设置为1  
  45.           
  46.         Button btn = (Button) findViewById(R.id.btn);  
  47.         btn.setOnClickListener(new View.OnClickListener() {  
  48.             public void onClick(View v) {  
  49.                 int i = imageView.getDrawable().getLevel();  
  50.                 if (i >=5)  
  51.                     i = 0;  
  52. //                imageView.setImageLevel(++i);//改变level  
  53.              imageView.getDrawable().setLevel(++i); //能达到同样的效果  
  54.             }  
  55.         });  
  56.           
  57.           
  58.     }  
  59.   
  60.     @Override  
  61.     public boolean onCreateOptionsMenu(Menu menu) {  
  62.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  63.         return true;  
  64.     }  
  65.   
  66.     public static int computeSampleSize(BitmapFactory.Options options, int minSideLength,  
  67.             int maxNumOfPixels) {  
  68.         int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);  
  69.   
  70.         int roundedSize;  
  71.         if (initialSize <= 8) {  
  72.             roundedSize = 1;  
  73.             while (roundedSize < initialSize) {  
  74.                 roundedSize <<= 1;  
  75.             }  
  76.         } else {  
  77.             roundedSize = (initialSize + 7) / 8 * 8;  
  78.         }  
  79.   
  80.         return roundedSize;  
  81.     }  
  82.   
  83.     private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength,  
  84.             int maxNumOfPixels) {  
  85.         double w = options.outWidth;  
  86.         double h = options.outHeight;  
  87.   
  88.         int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h  
  89.                 / maxNumOfPixels));  
  90.         int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(  
  91.                 Math.floor(w / minSideLength), Math.floor(h / minSideLength));  
  92.   
  93.         if (upperBound < lowerBound) {  
  94.             // return the larger one when there is no overlapping zone.  
  95.             return lowerBound;  
  96.         }  
  97.   
  98.         if ((maxNumOfPixels == -1) && (minSideLength == -1)) {  
  99.             return 1;  
  100.         } else if (minSideLength == -1) {  
  101.             return lowerBound;  
  102.         } else {  
  103.             return upperBound;  
  104.         }  
  105.     }  
  106. }  

使用LevelDrawable注意几点:

1、默认的level为0,如果没有和0匹配的level,那么就不显示。

2、level匹配以maxLevel优先。即如果有个item,min:1,max:2。   另一份item,min:2,max:3。

如果此时设置level=2,那么会匹配第一个item。

posted @ 2017-06-22 14:36  vegatate  阅读(560)  评论(0编辑  收藏  举报