android 常用的图片加载框架

主流图片加载框架?

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层)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值