1、开源框架XUtils,参考http://blog.csdn.net/dj0379/article/details/38356773
XUtils框架中的BitmapUtils不能加载drawable中的图片,如果想加载可以参考https://github.com/nostra13/Android-Universal-Image-Loader控件中对drawable的处理。
可以参考文章http://www.07net01.com/2015/03/787393.html,它在加载相册图片时不会出现图片重复现象。
缓存采用的是LruDiskCache LruMemoryCache
2、开源框架Android-Universal-Image-Loader,参考http://blog.csdn.net/xiaanming/article/details/26810303
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
支持图片的内存缓存,文件系统缓存或者SD卡缓存
支持图片下载过程的监听
根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载
3、开源框架Picasso, 参考 http://square.github.io/picasso/
这个仍然是Square的开源项目,Picasso是一个用于Android平台上的下载和缓存图片的项目。它有许多定制选项,如何处理下载图片(包括调整和裁剪,以及提供一个接口让你随自己心意将图片转换成圆角等)。Picasso将要下载的图片(如果没有缓存)并将它负载到指定的目标,转换图片以适合所显示的ImageView,来减少内存消耗。
1、可以快速加载本地图片,对所有图片的加载必须使用它,如果有的使用image.setImageResource,有的使用Picasso,加载图片时可能重复现象。PS:有三张图片,第一张用Picasso,后面用image.setImageResource方法就有可能出现图片重复现象。
加载图片效率高,可以参考http://blog.csdn.net/xu_fu/article/details/17043231
Picasso.with(mContext)
.load(new File(bean.name))
.placeholder(R.drawable.default_error)
//.error(R.drawable.default_error)
.resize(DensityUtil.dip2px(mContext, 80), DensityUtil.dip2px(mContext, 80))
.centerCrop()
.into(holder.iv_image);
4、Uri解析过程
//在加载相册图片时,对于一些网络图片名中有%号的,会将%25通过Uri解析成%,导致找不到图片
uri之前-/storage/emulated/0/CSDN/http%253A%252F%252Fimg.ask.csdn.net%252Fupload%252F201506%252F08%252F1433727012_994034.png
uri之后-/storage/emulated/0/CSDN/http%3A%2F%2Fimg.ask.csdn.net%2Fupload%2F201506%2F08%2F1433727012_994034.png
holder.iv_image.setImageURI(Uri.parse("file://"+path));
5、下面是项目中遇到读取本地图片和drawable图片
XUtils框架中的BitmapUtils不能加载drawable中的图片,如果想加载可以参考https://github.com/nostra13/Android-Universal-Image-Loader控件中对drawable的处理。
可以参考文章http://www.07net01.com/2015/03/787393.html,它在加载相册图片时不会出现图片重复现象。
缓存采用的是LruDiskCache LruMemoryCache
2、开源框架Android-Universal-Image-Loader,参考http://blog.csdn.net/xiaanming/article/details/26810303
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
支持图片的内存缓存,文件系统缓存或者SD卡缓存
支持图片下载过程的监听
根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载
/**
* ImageLoader框架优化
* 1、加载列表时,避免重复创建DisplayImageOptions对象
* 2、图片类型设置为Bitmap.Config.RGB_565
* 3、图片缩放方式设置为ImageScaleType.IN_SAMPLE_INT
* 4、内存缓存(cacheInMemory)设置为false
* 5、内存缓存采用弱引用,可以采用LRULimitedMemoryCache,WeakMemoryCache不太稳定缓存的图片容易被回收掉
* 6、使用ImageViewAware,它将ImageView的强引用变成弱引用,当内存不足的时候,可以更好的回收ImageView对象
* 7、在滚动时不加载图片,setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, false)),
* 但是会出现图片错乱现象。
*/
3、开源框架Picasso, 参考 http://square.github.io/picasso/
这个仍然是Square的开源项目,Picasso是一个用于Android平台上的下载和缓存图片的项目。它有许多定制选项,如何处理下载图片(包括调整和裁剪,以及提供一个接口让你随自己心意将图片转换成圆角等)。Picasso将要下载的图片(如果没有缓存)并将它负载到指定的目标,转换图片以适合所显示的ImageView,来减少内存消耗。
1、可以快速加载本地图片,对所有图片的加载必须使用它,如果有的使用image.setImageResource,有的使用Picasso,加载图片时可能重复现象。PS:有三张图片,第一张用Picasso,后面用image.setImageResource方法就有可能出现图片重复现象。
加载图片效率高,可以参考http://blog.csdn.net/xu_fu/article/details/17043231
Picasso.with(mContext)
.load(new File(bean.name))
.placeholder(R.drawable.default_error)
//.error(R.drawable.default_error)
.resize(DensityUtil.dip2px(mContext, 80), DensityUtil.dip2px(mContext, 80))
.centerCrop()
.into(holder.iv_image);
4、Uri解析过程
//在加载相册图片时,对于一些网络图片名中有%号的,会将%25通过Uri解析成%,导致找不到图片
uri之前-/storage/emulated/0/CSDN/http%253A%252F%252Fimg.ask.csdn.net%252Fupload%252F201506%252F08%252F1433727012_994034.png
uri之后-/storage/emulated/0/CSDN/http%3A%2F%2Fimg.ask.csdn.net%2Fupload%2F201506%2F08%2F1433727012_994034.png
holder.iv_image.setImageURI(Uri.parse("file://"+path));
5、下面是项目中遇到读取本地图片和drawable图片
public View getView(int position, View convertView, ViewGroup parent) {
....
//设置gridview项宽度和高度一样
if (convertView!=null) {
convertView.setLayoutParams(new AbsListView.LayoutParams(itemWidth,itemWidth));
}
if (bean.id==-1) {
// 采用setImageResource结合Picasso或ImageLoader会出现图片重复现象,因此必须要统一
// holder.iv_image.setImageResource(R.mipmap.send_photo);
// Picasso.with(mContext).load(R.mipmap.send_photo).into(holder.iv_image);
// ImageLoader.getInstance().displayImage( bean.name, new ImageViewAware(holder.iv_image));
}else if(bean.id==-2){
// holder.iv_image.setImageResource(R.mipmap.send_video);
// Picasso.with(mContext).load(R.mipmap.send_video).into(holder.iv_image);
// ImageLoader.getInstance().displayImage( bean.name, new ImageViewAware(holder.iv_image));
}else {
// 1、使用这种方法,没有缓存策略,加载速度很慢
// holder.iv_image.setImageBitmap(decodeFile(bean.name,itemWidth,itemWidth));
// 2、对含有%名字的图片可能加载不到,同1
// holder.iv_image.setImageURI(Uri.parse("file:/"+bean.name));
// 3、开源框架
// mBitmapUtils.display(holder.iv_image, bean.name);
// 4、开源框架 Picasso
Picasso.with(mContext)
.load(new File(bean.name))
.placeholder(R.drawable.default_error)
.resize(itemWidth, itemWidth)
.centerCrop()
.into(holder.iv_image);
// 5、开源框架
// ImageLoader.getInstance().displayImage("file:/"+bean.name, new ImageViewAware(holder.iv_image));
}
return convertView;
}
//通过下面的方法来进行加载图片时,同时加载九张图片(2-3M)时需要2秒时间,其中宽度和高度都是手机屏幕宽度的1/3.
private Bitmap decodeFile(String path, int viewWidth, int viewHeight){
BitmapFactory.Options options = new BitmapFactory.Options();
//设置为true,表示解析Bitmap对象,该对象不占内存
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
//设置缩放比例
options.inSampleSize = computeScale(options, viewWidth, viewHeight);
System.out.println("---------------+"+options.inSampleSize);
//设置为false,解析Bitmap对象加入到内存中
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){
int inSampleSize = 1;
if(viewWidth == 0 || viewWidth == 0){
return inSampleSize;
}
int bitmapWidth = options.outWidth;
int bitmapHeight = options.outHeight;
if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){
int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);
int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);
inSampleSize = widthScale < heightScale ? widthScale : heightScale;
}
return inSampleSize;
}