
在使用這個框架的時候,我們必須要配置一個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
