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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM