fresco:
1、内存管理:在5.0以下系统,Fresco将图片放到一个特别的内存区域。图片不显示的时候,占用的内存会自动释放,减少图片因占用太多内存而OOM。
2、Image Pipeline:图片三级缓存:已解码图片缓存(bitmap)、未解码图片缓存、磁盘缓存。
Image pipeline 负责完成加载图像,变成Android设备可呈现的形式所要经历的大致流程如下:
a、根据Uri在已解码的(Bitmap缓存)内存缓存中查找,找到了则返回Bitmap对象;如果没找到,则开启后台线程开始后续的工作。
b、根据Uri在未解码的内存缓存中查找,若找到了则解码,然后缓存到已解码的内存缓存中,并且返回Bitmap对象。
d、如果在未解码的内存缓存中没找到,则根据Uri在磁盘缓存中查找,若找到了则读取数据(byte数组),并缓存到未解码的内存缓存中,解码、然后缓存到已解码的内存缓存中,并且返回Bitmap对象。
e、如果在磁盘缓存中没找到,则从网络或者本地加载数据。加载完成后,依次缓存到磁盘缓存、未解码的内存缓存中。解码、然后缓存到已解码的内存缓存中,并且返回Bitmap对象。
流程如下:
3、Drawees 负责图片的呈现。
Fresco 中设计有一个叫做 Drawees 模块,负责图片的呈现。它由三个元素组成分别是:
DraweeView 继承于 View, 负责图片的显示。
DraweeHierarchy 用于组织和维护最终绘制和呈现的 Drawable 对象。
DraweeController 负责和ImagePipeline的交互,可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。
一般情况下,使用 SimpleDraweeView 即可,你可以配置其XML属性来实现各式各样的展示效果。
a、在图片加载完成前显示占位图;
b、在图片加载的过程中显示加载进度图;
c、加载成功后,将占位图或者加载进度图,自动替换为目标图片。
d、加载失败后,它会显示加载失败的图(若没配置加载失败的图,则显示的是占位图)
e、加载失败后,若配置过重试图,则会显示重试图,用户点击可以重新去加载图片(默认配置可重试3次)
f、自定义居中焦点(配合Google提供的服务可以实现人脸识别,经过测试国内目前使用不了)
g、显示圆角图、圆形图和圆圈;
h、添加覆盖物(图层叠加);
j、 实现图片的按下效果;
k、图片的渐进式呈现;(目前只支持Jpeg格式的图片)
x、当图片不再显示在屏幕上时,它会及时地释放内存和空间占用。
4、Fresco目前所支持的图片格式
a、静态图:png、jpg、web
b、动态图:gif、web格式的gif
比较:
3.17如何从网络上加载一个图片显示到界面
*Bitmap---》imageview设置进来 原生
*开源框架:
UniversalImageLoader:15年9月份停止维护,这意味着以后有任何bug都不会在修复,任何新特性都不会再更新。所以不建议以后再用。
*Picasso
*Glide:基于Picasso开发,同样简洁。
不同点:
内存开销:Glide默认RGB—565,Picasso默认的是
ARGB_8888格式,这个内存开销要小一半。
缓存方面:
Picasso(可设置圆角图片)只会缓存原始尺寸的图片,而 Glide缓存的是多种规格,也就意味着
Glide会根据你 ImageView的大小来缓存相应大小的图片尺寸
Glide支持加载 Gif动态图,而
Picasso不支持该特性(Picasso100多k,而Glide不到500k,都是轻量级)
*Fresco是 Facebook出品,他是新一代的图片加载库————》Ashmem区域,属于Native区域,属于C++的地盘,可以大大减少OOM。
缺点:比较大,2——3M,用起来复杂。
综上:轻量级用推荐Glide,如果用来Squre公司的Okhttp,建议用Picasso,兼容性会好点,也比较轻量级。
如果重量级加载图片建议用Fresco。