您的位置:首页 > 其它

ImageLoader之一加载本地图片

2016-04-03 23:59 435 查看
自己写的一个简单的例子,网上好多都写的很复杂所以自己弄出来个稍微简单明了的例子.

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;

}

/**

* 获取内存中所有图片地址

* @return

*/

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

}

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: