自己寫的一個簡單的例子,網上好多都寫的很複雜是以自己弄出來個稍微簡單明了的例子.
ImageLoaderConfiguration是針對圖檔緩存的全局配置,主要有線程類、緩存大小、磁盤大小、圖檔下載下傳與解析、日志方面的配置。
ImageLoader是具體下載下傳圖檔,緩存圖檔,顯示圖檔的具體執行類,它有兩個具體的方法displayImage(...)、loadImage(...),但是其實最終他們的實作都是displayImage(...)。
DisplayImageOptions用于指導每一個Imageloader根據網絡圖檔的狀态(空白、下載下傳錯誤、正在下載下傳)顯示對應的圖檔,是否将緩存加載到磁盤上,下載下傳完後對圖檔進行怎麼樣的處理。
從三者的協作關系上看,他們有點像廚房規定、廚師、客戶個人口味之間的關系。ImageLoaderConfiguration就像是廚房裡面的規定,每一個廚師要怎麼着裝,要怎麼保持廚房的幹淨,這是針對每一個廚師都适用的規定,而且不允許個性化改變。ImageLoader就像是具體做菜的廚師,負責具體菜單的制作。DisplayImageOptions就像每個客戶的偏好,根據客戶是重口味還是清淡,每一個imageLoader根據DisplayImageOptions的要求具體執行。
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ArrayList<String> list;
private DisplayImageOptions options;
private ListView lv_main;
private AnimateFirstDisplayListener animateFirstDisplayListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//顯示圖象選項
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher) // 設定圖檔下載下傳期間顯示的圖檔
.showImageForEmptyUri(R.drawable.ic_launcher)// 設定圖檔Uri為空或是錯誤的時候顯示的圖檔
.showImageOnFail(R.drawable.ic_launcher)// 設定圖檔加載或解碼過程中發生錯誤顯示的圖檔
.cacheInMemory() // 設定下載下傳的圖檔是否緩存在記憶體中
.cacheOnDisc() // 設定下載下傳的圖檔是否緩存在SD卡中
.displayer(new RoundedBitmapDisplayer(20)) // 設定成圓角圖檔
.build(); // 建立配置過得DisplayImageOption對象
//用法:ImageLoader.getInstance().displayImage(url, imageView, options);
//我被坑的一次居然還要這樣用,:圖像加載程式配置
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
this)
.defaultDisplayImageOptions(options) //設定預設的顯示圖檔選擇
.threadPriority(Thread.NORM_PRIORITY - 2) //線程數量,預設5個
.denyCacheImageMultipleSizesInMemory() //否認在記憶體中緩存圖像多種尺寸
.discCacheFileNameGenerator(new Md5FileNameGenerator()) //設定盤緩存檔案名的生産者
.tasksProcessingOrder(QueueProcessingType.LIFO).build(); //設定任務訂單處理(隊列處理類型)
ImageLoader.getInstance().init( config);
//ImageLoader.getInstance().displayImage(url, imageView, options);
list = getImgPathList();
lv_main = (ListView) findViewById(R.id.lv_img);
MyAdapter adapter = new MyAdapter(list);
lv_main.setAdapter(adapter);
animateFirstDisplayListener = new AnimateFirstDisplayListener();
}
class MyAdapter extends BaseAdapter{
private ArrayList<String> list;
public MyAdapter(ArrayList<String> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder holer = null;
if(convertView==null){
holer= new MyHolder();
convertView = View.inflate(getApplicationContext(), R.layout.item_img, null);
holer.iv_item = (ImageView) convertView.findViewById(R.id.iv_item);
holer.tv_item = (TextView) convertView.findViewById(R.id.tv_item);
convertView.setTag(holer);
}else{
holer = (MyHolder) convertView.getTag();
}
ImageLoader.getInstance().displayImage("file:///"+list.get(position), holer.iv_item, options
,animateFirstDisplayListener);
holer.tv_item.setText("md");
return convertView;
}
}
class MyHolder{
ImageView iv_item;
TextView tv_item;
}
private ArrayList<String> getImgPathList() {
ArrayList<String> list = new ArrayList<String>();
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { "_id", "_data" }, null, null, null);
while (cursor.moveToNext()) {
list.add(cursor.getString(1));// 将圖檔路徑添加到list中
}
cursor.close();
return list;
}
private static class AnimateFirstDisplayListener extends
SimpleImageLoadingListener {
static final List<String> displayedImages = Collections
.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500); // 設定image隐藏動畫500ms
displayedImages.add(imageUri); // 将圖檔uri添加到集合中
}
}
}
}
}