zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    CentOS部署ElasticSearch7.6.1集群
    Linux安装Elasticsearch7.x
    ElasticSearch安装为Windows服务
    SolrNet Group分组 实现
    ubuntu 下安装sublime
    LeetCode 3: Longest Substring Without Repeating Characters
    LeetCode 179: Largest Number
    LeetCode 1: Two Sum
    LeetCode 190: Reverse Bits
    LeetCode 7: Reverse Integer
  • 原文地址:https://www.cnblogs.com/vegetate/p/9997211.html
Copyright © 2011-2022 走看看