主流图片加载框架?
1> Picasso
2> Glide
3> Fresco
4> ImageLoader
介绍:
Picasso:和Square的网络库一起能发挥最大作用,因为Picasso可以选择将网络请求的缓存部分交给了okhttp实现
Glide:模仿了Picasso的API,而且在他的基础上加了很多的扩展(比如gif等支持),Glide默认的Bitmap格式是RGB_565,比 Picasso默认的ARGB_8888格式的内存开销要小一半;Picasso缓存的是全尺寸的(只缓存一中),而Glide缓存的是跟ImageView尺寸相同的(即56*56和128*128是两个缓存)。
Fresco:最大的又是在于5.0以下(最低2.3)的Bitmap加载。在5.0以下系统,Fresco将图片放到一个特别的内存区域(Ashmem区)。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。为什么说5.0以下呢?因为在5.0系统以后系统默认就是存储在Ashmem区了。
ImageLoader:旨在为图像加载,缓存和显示提供强大,灵活可定制的工具。他提供了大量的配置选项和良好的控制图像加载和缓存过程。
下面简单说一说这些框架的使用:
Picasso的基本使用:
将Picasso添加进项目后,只需一行就搞定:
Picasso.with(context).load(imageUrl).into(imageView);
1.自动将图像缓存在本地;
2.通过图片压缩转换以减少内存消耗
3.自动处理了ImageView的回收,即自动取消不在事业范围内的ImageView视图资源的加载;
Picasso裁剪:
Picasso.with(context).load(imageUrl).resize(50,50).centerCrop.info(imageView);
自定义格式转换:
为了实现更多想要转换的效果,可以自己实现一个Transformation接口的类,然后将其对象传递给transform()方法:
public class myTransformation implements Transformation{
@Override
public Bitmap transform(Bitmap source){
//对source实现自定义裁剪
}
@Override
public String key(){
return "square()"
}
}
占位符图片:
所谓的占位符图像即当图片为正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误是显示的默认图片,通过error()设置
Picasso.with(context).load(imageUrl).placeholder(R.drawable.image_placeholder).error(R.drawable.image).into(imageView);
载入本地资源:
除了通过网络下载图片,Picasso也可以载入本地图片资源:
Picasso.with(context).load(R.deawable.icon).into(imageView);
Picasso.with(context).load("file://android_asset/Android.png").into(imageView);
Picasso.with(context).load(new File(...)).into(imageView);
调试:为了方便调试,你可以通过测试Picasso的setIndicatiorEnabled(true);可以让不同来源的图片显示一个不同的色彩标记
2.Glide最火图片加载开源框架加载Gif资源到ImageView中
通常ImageView不能加载Gif图片,如果不做任何处理的话,加载到ImageView中的Gif只显示第一帧。网上大多方案都是借助Android的Movie,把gif图片作为流,解析成Android Movie显示,这些定制的基本思想就是线检测图片资源是否为Gif图片,若是,则按照Android Movie解析之。
Glide,本身在图片加载和缓存方面做得比较优秀,同时架子啊Gif图也很方便,把需要加载的Gif图片放到drawable目录下,然后就和普通的ImageView设置一个图片资源R.drawable.xx 一样,很简单。或者从网络URL加载一个图片,开发者不用关心这个图片资源是否是gif还是其他jpg还是png等等格式,直接将其当做一个普通的图片加载即可,
使用:
Glide.with(this).load(R.drawable.loading).into(imageView);
3.Fresco让图片的渐进式呈现的强大框架
Fresco中有个 image pipeline 的模块,负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和cpu时间,他含有3级缓存设计(2级内存,1级文件)
Fresco中设计有一个叫做Drawees模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。
Fresco支持Android2.3及以上系统
特性
内存管理:
解压后的图片,即Bitmap,占用大量的内存。大的内存占用势必会引发更加频繁的GC。在5.0以下,GC将会显著的引发界面卡顿。在5.0以下系统,Fresco将图片放到一个热别的内存区域。当然,在图片不显示的时候,占用的内存会自动释放。这会使得APP更加流畅,减少因为图片内存占用而引发的OOM。
Fresco在低端机器是上一样出色,你再也不用因图片内存占用而思前想后。
图片的渐进式呈现:
渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后UI随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是网络有几大的利好,可带来更好的用户体验。
Android本身的图片库不支持次格式,但是Fresco支持,使用是,和往常一样仅仅需要提供一个图片的URL即可.
GIF图和WebP格式:
支持GIF,支持WebP格式
图像的呈现:
Fresco的Drawees设计,带来一些有用的特性:
自定义居中焦点(对人脸等图片显示非常有帮助)
元教徒,当然圆圈也行。
下载失败后,点击重新下载
自定义占位图,自定义overlay,或者进度条
指定用户按压式的overlay
图像的加载
Fresco的 image pipeline 设计,允许用户在多方面控制图片的加载:为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片先显示一个低解析度的图片,等高清图下载完之后在现实高清图
加载完成回调通知
对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
缩放或者旋转图片
处理已下载的图片
WebP支持
4.ImageLoader
特性:
多线程图像加载(异步或者同步);
ImageLoader配置的广泛定制(线程池,下载器,解码器,内存和磁盘缓存策略,显示图像选项等);
每个显示图像调用的许多自定义选项(存根图像,缓存开关,解码选项,位图处理和显示等);
内存和/或磁盘上的图像缓存(设备的文件系统或SD卡);
监听加载过程(包括下载进度)
根据控件的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载
5.Picasso,Fresco,Glide,ImageLoader优劣
Fresco:
优点:
1.图片存储在安卓系统的匿名共享内存,而不是虚拟机的堆内存中,图片的中间缓冲数据也存放在本地堆内存,所以,应用程序有更多的内存使用,不会因为图片加载而导致oom,同时也减少垃圾回收器频繁回收Bitmap导致的界面卡顿,性能更高。
2.渐进式加载JPEG图片,支持图片从模糊到清晰加载
3.图片可以以任意的中心店显示在ImageView,而不仅仅是图片的中心
4.JPEG图片改变大小也是在native进行的,不是在虚拟机的堆内存,同样减少OOM
5.很少的支持GIF图片的显示
缺点:
框架较大,影响APK体积
使用较繁琐
ImageLoader,Picasso,Glide:这三者实现机制都差不多
ImageLoader:
比较老的框架,稳定,加载速度适中,缺点在于不支持GIF图片加载,使用稍微繁琐,并且缓存机制没有和http的缓存很好的结合,完全是自己的一套缓存机制
Picasso:
使用方便,一行代码完成加载图片显示,框架体积小
缺点在于不支持GIF,并且他可能是想让服务器去处理图片的缩放,他缓存的图片是未缩放的,并且默认使用ARGB_8888格式缓存图片,缓存体积大
Glide:
可以说是Picasso的升级版,有Picasso的优点,并且支持GIF图片的加载,图片缓存也会自动缩放,默认使用RGB_565格式缓存图片,是Picasso缓存体积的一半
总结:
Picasso所能实现的功能,Glide都能做,无非是所需的设置不同。但是Picasso体积比起Glide小太多,如果项目中网络请求本身用的就是okhttp或者retrofit(本质还是okhttp),那么建议用Picasso,体积会小很多。Glide的好处就是处理大型的图片流,比如gif、Video,如果你们是做美拍、爱拍这种视频类应用的话,建议使用Glide。
Freaso在5.0以下的内存优化非常好,代价就是体积也非常大,按体积算Fresco > Glide > Picasso
不过在使用起来也有些不便(建议:他只能用内置的一个ImageView来实现这些功能,用起来比较麻烦,我们通常是根据Fresco自己改改,直接使用它的Bitmap层)