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添加到集合中
}
}
}
}
}
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添加到集合中
}
}
}
}
}
相关文章推荐
- SDN:motivation
- 学号20145220 《Java程序设计》第5周学习总结
- 二叉树递归与非递归遍历
- Nodejs之HTTP、WEBSOCKET及使用MYSQL
- 使用QZXing识别图片二维码
- codeforces_622D. Optimal Number Permutation(构造)
- TCP/IP协议:最大报文段长度(MSS)是如何确定的(2)
- HDU I Hate It(线段树单点更新,最值查找)
- Exception in thread "main" java.lang.NoSuchMethodError
- 是时候复习一下Java基础了(二)
- <css 六>table
- 20145329 《Java程序设计》第五周学习总结
- 使用树莓派编译是一件十分蛋疼的事情
- Java Design Pattern 2
- 【LeetCode】42. Trapping Rain Water算法及注释
- MySQL的语句执行顺序
- My study note of PHP language(V)
- 在Ubuntu上下载、编译、运行Android系统
- React Native 一:开发环境搭建
- Android 拍照、从相册获取及裁剪的相关实现