天天看點

ImageLoader之一加載本地圖檔

自己寫的一個簡單的例子,網上好多都寫的很複雜是以自己弄出來個稍微簡單明了的例子.

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添加到集合中  

                }  

            }  

        }  

    }  

}

繼續閱讀