zoukankan      html  css  js  c++  java
  • Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载

      在使用这个框架的时候,我们必须要配置一个DisplayImageOptions对象来作为ImageLoader.getInstance().displayImage()中的参数,所以很有必要讲解这个对象的配制方法。讲解完了后其实这个框架我们就会了解的比较详尽了。

    1.默认的配置

    DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_stub) // resource or drawable
        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
        .showImageOnFail(R.drawable.ic_error) // resource or drawable
        .resetViewBeforeLoading(false)  // default
        .delayBeforeLoading(1000)
        .cacheInMemory(false) // default
        .cacheOnDisk(false) // default
        .preProcessor(...)
        .postProcessor(...)
        .extraForDownloader(...)
        .considerExifParams(false) // default
        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
        .bitmapConfig(Bitmap.Config.ARGB_8888) // default
        .decodingOptions(...)
        .displayer(new SimpleBitmapDisplayer()) // default
        .handler(new Handler()) // default
        .build();

    example:

        /**
         * 显示图片的所有配置
         * @return
         */
        private DisplayImageOptions getWholeOptions() {
            DisplayImageOptions options = new DisplayImageOptions.Builder()  
            .showImageOnLoading(R.drawable.loading) //设置图片在下载期间显示的图片  
            .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片  
            .showImageOnFail(R.drawable.error)  //设置图片加载/解码过程中错误时候显示的图片
            .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
            .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
            .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示  
            .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型
            //.decodingOptions(BitmapFactory.Options decodingOptions)//设置图片的解码配置  
            .delayBeforeLoading(0)//int delayInMillis为你设置的下载前的延迟时间
            //设置图片加入缓存前,对bitmap进行设置  
            //.preProcessor(BitmapProcessor preProcessor)  
            .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
            .displayer(new RoundedBitmapDisplayer(20))//不推荐用!!!!是否设置为圆角,弧度为多少  
            .displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间,可能会出现闪动
            .build();//构建完成
            
            return options;
        }

    2.一般常用的配置

        
        /**
         * 设置常用的设置项
         * @return
         */
        private DisplayImageOptions getSimpleOptions() {
            DisplayImageOptions options = new DisplayImageOptions.Builder()  
            .showImageOnLoading(R.drawable.loading) //设置图片在下载期间显示的图片  
            .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片  
            .showImageOnFail(R.drawable.error)  //设置图片加载/解码过程中错误时候显示的图片
            .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
            .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示  
            .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型
            .build();//构建完成
            return options;
        }

    注意:这里面的参数当然也是可以随意修改的,根据项目需要再定!

    几点说明:

    1).imageScaleType(ImageScaleType imageScaleType)  //设置图片的缩放方式,如:

    .imageScaleType(ImageScaleType.IN_SAMPLE_INT)

    其中,mageScaleType的选择值:
                  EXACTLY :图像将完全按比例缩小的目标大小
                  EXACTLY_STRETCHED:图片会缩放到目标大小完全
                  IN_SAMPLE_INT:图像将被二次采样的整数倍
                  IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
                  NONE:图片不会调整

    2).displayer(BitmapDisplayer displayer)  // 设置图片的显示方式,如:

    .displayer(new FadeInBitmapDisplayer(100))

    其中,displayer的选择值:

         RoundedBitmapDisplayer(int roundPixels)设置圆角图片,不推荐!!!
                  FakeBitmapDisplayer()这个类什么都没做
                  FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
         SimpleBitmapDisplayer()正常显示一张图片

    3.避免OOM

    .bitmapConfig(Bitmap.Config.RGB_565) //默认是ARGB_8888,使用RGB_565会比使用ARGB_8888少消耗2倍的内

    使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT) imageScaleType(ImageScaleType.EXACTLY)

    避免使用.displayer(new RoundedBitmapDisplayer(20)) //他会创建新的ARGB_8888格式的Bitmap对象;

     

    4.实现简单的图片加载

    通过了上面的配置我们就可以实现图片的加载了,这里以一个网络图片进行举例:

    1.最简单的加载

    ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件  

    2.有加载项的加载

    //显示图片的配置
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.ic_stub)
                    .showImageOnFail(R.drawable.ic_error)
                    .cacheInMemory(true)
                    .cacheOnDisk(true)
                    .bitmapConfig(Bitmap.Config.RGB_565)
                    .build();
            
            final ImageView mImageView = (ImageView) findViewById(R.id.image);
    
            String imageUrl = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg";
            
            imageLoader.displayImage(imageUrl, mImageView, options);

    3.加载时进行监听

    public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageLoadingListener listener) {}
    //  ImageLoadingListener 用于监听图片的下载情况。
    imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  
        @Override  
        public void onLoadingStarted() {  
           //开始加载的时候执行  
        }  
        @Override  
        public void onLoadingFailed(FailReason failReason) {        
           //加载失败的时候执行  
        }   
        @Override   
        public void onLoadingComplete(Bitmap loadedImage) {  
           //加载成功的时候执行  
        }   
        @Override   
        public void onLoadingCancelled() {  
           //加载取消的时候执行  
      
        }});  

    4.监听加载进度

    public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
                        ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {}
    imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  
        @Override  
        public void onLoadingStarted() {  
           //开始加载的时候执行  
        }  
        @Override  
        public void onLoadingFailed(FailReason failReason) {        
           //加载失败的时候执行  
        }      
        @Override      
        public void onLoadingComplete(Bitmap loadedImage) {  
           //加载成功的时候执行  
        }      
        @Override      
        public void onLoadingCancelled() {  
           //加载取消的时候执行  
        },new ImageLoadingProgressListener() {        
          @Override  
          public void onProgressUpdate(String imageUri, View view, int current,int total) {     
          //在这里更新 ProgressBar的进度信息  
          }  
        });  
      ImageLoader.getInstance().displayImage(imageUrl, mImageView, getSimpleOptions(), new SimpleImageLoadingListener(),
    new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { double progress = ((double)current/total)*100; System.out.println(progress+"%"); progressTv.setText("当前进度是:" + progress+"%"); } });

    5.转换到Bitmap中

    // Load image, decode it to Bitmap and return Bitmap synchronously
    Bitmap bmp = imageLoader.loadImageSync(imageUri);

    6.设置图片大小

    // Load image, decode it to Bitmap and return Bitmap to callback
    ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size
    imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            // Do whatever you want with Bitmap
        }
    });

    7.加载其他来源的图片

    String imageUri = "http://site.com/image.png"; // from Web
    String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
    String imageUri = "content://media/external/audio/albumart/1"; // from content provider
    String imageUri = "assets://image.png"; // from assets
    String imageUri = "drawable://" + R.drawable.img; // from drawables (non-9patch images)

    ps:当你真的需要用drawable://+……这种形式的时候再用这种形式,否则请考虑传统的方式ImageView.setImageResource(...)来设置图片!!!!

    others:

        //图片来源于Content provider
            String contentprividerUrl = "content://media/external/audio/albumart/13";
            
            //图片来源于assets
            String assetsUrl = Scheme.ASSETS.wrap("image.png");
            
            //图片来源于
            String drawableUrl = Scheme.DRAWABLE.wrap("R.drawable.image");

    Activity代码:

    package com.kale.universalimageloadertest;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.nostra13.universalimageloader.core.DisplayImageOptions;
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.assist.FailReason;
    import com.nostra13.universalimageloader.core.assist.ImageScaleType;
    import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
    import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
    import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
    import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
    import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            final TextView progressTv = (TextView)findViewById(R.id.progress_textView);
            
            final ImageView mImageView = (ImageView) findViewById(R.id.image);  
            
            //图片来自于SD卡
            //String imagePath = "/mnt/sdcard/image.png";  
           /// String imageUrl = Scheme.FILE.wrap(imagePath);  
            
            //图片来自于网络
            String imageUrl = "http://static4.photo.sina.com.cn/middle/69670edbx9475f3f01283&690";  
          
            
            
            ImageLoader.getInstance().displayImage(imageUrl, mImageView, getSimpleOptions(), new SimpleImageLoadingListener(), new ImageLoadingProgressListener() {
    
                @Override
                public void onProgressUpdate(String imageUri, View view,
                        int current, int total) {
                    double progress = ((double)current/total)*100;
                    System.out.println(progress+"%");
                    progressTv.setText("当前进度是:" + progress+"%");
                }
    
            
            });
            //清除缓存
            ImageLoader.getInstance().clearDiskCache();
            ImageLoader.getInstance().clearMemoryCache();
        }
        
        /**
         * 设置常用的设置项
         * @return
         */
        private DisplayImageOptions getSimpleOptions() {
            DisplayImageOptions options = new DisplayImageOptions.Builder()  
            .showImageOnLoading(R.drawable.loading) //设置图片在下载期间显示的图片  
            .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片  
            .showImageOnFail(R.drawable.error)  //设置图片加载/解码过程中错误时候显示的图片
            .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
            .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示  
            .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型
            .build();//构建完成
            return options;
        }
        
        /**
         * 显示图片的所有配置
         * @return
         */
        private DisplayImageOptions getWholeOptions() {
            DisplayImageOptions options = new DisplayImageOptions.Builder()  
            .showImageOnLoading(R.drawable.loading) //设置图片在下载期间显示的图片  
            .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片  
            .showImageOnFail(R.drawable.error)  //设置图片加载/解码过程中错误时候显示的图片
            .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
            .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
            .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示  
            .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型
            //.decodingOptions(BitmapFactory.Options decodingOptions)//设置图片的解码配置  
            .delayBeforeLoading(0)//int delayInMillis为你设置的下载前的延迟时间
            //设置图片加入缓存前,对bitmap进行设置  
            //.preProcessor(BitmapProcessor preProcessor)  
            .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
            .displayer(new RoundedBitmapDisplayer(20))//不推荐用!!!!是否设置为圆角,弧度为多少  
            .displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间,可能会出现闪动
            .build();//构建完成
            
            return options;
        }
        
    
        
        
    /*    DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_stub) // resource or drawable
        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
        .showImageOnFail(R.drawable.ic_error) // resource or drawable
        .resetViewBeforeLoading(false)  // default
        .delayBeforeLoading(1000)
        .cacheInMemory(false) // default
        .cacheOnDisk(false) // default
        .preProcessor(...)
        .postProcessor(...)
        .extraForDownloader(...)
        .considerExifParams(false) // default
        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
        .bitmapConfig(Bitmap.Config.ARGB_8888) // default
        .decodingOptions(...)
        .displayer(new SimpleBitmapDisplayer()) // default
        .handler(new Handler()) // default
        .build();*/
    }

    参考自:

    http://blog.csdn.net/xiaanming/article/details/26810303

    http://blog.csdn.net/vipzjyno1/article/details/23206387

  • 相关阅读:
    c语言动态申请内存(malloc与calloc)
    二维数组的指针
    二分查找(用c语言实现)
    Docker一篇从入门到实战
    MyBatisPlus一篇从入门到实战
    MyBatis一篇从入门到实战
    MySQL一篇从入门到实战
    Nginx一篇从入门到实战
    day04_02逻辑运算符
    day4_01循环引用带来的内存泄露问题
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/4034304.html
Copyright © 2011-2022 走看看