您的位置:首页 > 移动开发 > Android开发

图片加载库简单使用以及介绍

2017-02-24 15:25 323 查看

图片网络加载库

目前市面上主流的图片加载框架有四种:Glide Picasso Fresco ImageLoader

ImageLoader:一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。

Picasso: Square出品,必属精品。和OkHttp搭配起来更配呦!

Fresco:Facebook出的,天生骄傲!不是一般的强大。

Glide:Google推荐的图片加载库,专注于流畅的滚动。

Glide

1.Glide简介

在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。

2.Glide特点

(1)使用简单
(2)可配置度高,自适应程度高
(3)支持常见图片格式 Jpg png gif webp
(4)支持多种数据源  网络、本地、资源、Assets 等
(5)高效缓存策略    支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
(6)生命周期集成   根据Activity/Fragment生命周期自动管理请求
(7)高效处理Bitmap  使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力


3.Glide下载地址

https://github.com/bumptech/glide


4.Glide一些功能

(1)Glide基本可以load任何可以拿到的媒体资源
(2)禁止,清除内存缓存
(3)禁止,清除磁盘缓存
(4)本地视频剧照的解码
(5)获取缓存大小
(6)指定资源的优先加载顺序
(7)先显示缩略图,再显示原图
(8)对图片进行裁剪、模糊、滤镜、图片请求的优化、图片的宽度和高度可重新设定等处理
(9)对请求状态进行监听
(10)对资源的下载进度进行监听


5.Glide使用步骤

a.在build中添加依赖(这里需要注意使用Glide还需要support-v4库)
compile 'com.github.bumptech.glide:glide:3.7.0'
添加权限
<uses-permission android:name="android.permission.INTERNET"/>
b.加载网络图片(也是最基本的使用)
Glide.with(this).load("url").into(ivGlide1);
c.加载资源图片
Glide.with(this).load(R.mipmap.ic_launcher).into(ivGlide2);
e.加载本地图片
String path =Environment.getExternalStorageDirectory()+"/shili1.jpg";
File file = new File(path);
Uri uri = Uri.fromFile(file);
Glide.with(this).load(uri).into(ivGlide3);
f.加载网络gif
String gifUrl = "http://b.hiphotos.baidu.com/zhidao/pic/item/faedab64034f78f066abccc57b310a55b3191c67.jpg";
//.placeholder()设置资源加载过程中的显示的Drawable  error()加载失败的图片
Glide.with(this).load(gifUrl).placeholder(R.mipmap.ic_launcher).into(ivGlide4);
g.加载资源gif
Glide.with(this).load(R.drawable.loading).asGif().placeholder(R.mipmap.ic_launcher).into(ivGlide5);
h.加载本地gif
String gifPath = Environment.getExternalStorageDirectory()+"/shili2.jpg";
File gifFile = new File(gifPath);
Glide.with(this).load(gifFile).placeholder(R.mipmap.ic_launcher).into(ivGlide6);
i.加载本地小视频和快照
String videoPath =Environment.getExternalStorageDirectory()+"/video.mp4";;
File videoFile = new File(videoPath);
Glide.with(this).load(Uri.fromFile(videoFile)).placeholder(R.mipmap.ic_launcher).into(ivGlide7);
j.设置缩略图比例,然后,先加载缩略图,再加载原图
String urlPath="/storage/emulated/0/shili1.jpg";
Glide.with(this).load(new File(urlPath)).thumbnail(0.1f).centerCrop().placeholder(R.mipmap.ic_launcher).into(ivGlide8);
k.先建立一个缩略图对象,然后,先加载缩略图,再加载原图
DrawableRequestBuilder thumbnailRequest=  Glide.with(this).load(new File(urlPath));
Glide.with(this).load(Uri.fromFile(videoFile)).thumbnail(thumbnailRequest).centerCrop().placeholder(R.mipmap.ic_launcher).into(ivGlide9);


6.Glide推荐博客

http://blog.csdn.net/shangmingchao/article/details/51125554 http://www.cnblogs.com/whoislcj/p/5558168.html


Picasso

1.Picasso简介

Picasso是Square公司出品的一个强大的图片下载和缓存图片库

2.Picasso特点

1)在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
2)使用复杂的图片压缩转换来尽可能的减少内存消耗
3)自带内存和硬盘二级缓存功能


3.Picasso下载地址

https://github.com/square/picasso


4.Picasso使用

a.导入jar包或在module的gradle文件中添加
compile 'com.squareup.picasso:picasso:2.5.2'
b.Picasso.with(context).load(imageUrl).into(imageView);
c.资源加载的方法
- placeholder(xxx). 设置资源加载过程中的显示的Drawable。
- error(xxx).设置load失败时显示的Drawable。
- into(xxx) 设置资源加载到的目标 包括ImageView Target等


Fresco

1.Fresco简介

Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络、本地存储和本地资源中加载图片。相对于ImageLoader,拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势,是个很好的图片框架。

2.Fresco特点

1)内存管理
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
内存分配采用:系统匿名共享内存
2)渐进式呈现图片
渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续, 呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
3)支持加载Gif图,支持**WebP**格式。
4)图像的呈现
(1)自定义居中焦点(对人脸等图片显示非常有帮助)。
(2)圆角图,当然圆圈也行。
(3)下载失败之后,点击重新下载。
(4)自定义占位图,自定义overlay, 或者进度条。
(5)指定用户按压时的overlay。
5)图像的加载
(1)为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。
(2)先显示一个低解析度的图片,等高清图下载完之后再显示高清图。
(3)加载完成回调通知。
(4)对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图。
(5)缩放或者旋转图片。
(6)处理已下载的图片。


3.Fresco下载地址

https://github.com/facebook/fresco
官方使用网址: http://fresco-cn.org/docs/index.html


4.Fresco的使用

(1)添加依赖
dependencies {
// 在 API < 14 上的机器支持 WebP 时,需要添加
compile 'com.facebook.fresco:animated-base-support:0.14.1'

// 支持 GIF 动图,需要添加
compile 'com.facebook.fresco:animated-gif:0.14.1'

// 支持 WebP (静态图+动图),需要添加
compile 'com.facebook.fresco:animated-webp:0.14.1'
compile 'com.facebook.fresco:webpsupport:0.14.1'

// 仅支持 WebP 静态图,需要添加
compile 'com.facebook.fresco:webpsupport:0.14.1'

compile 'com.facebook.fresco:fresco:0.14.1'
}
(2)在application中初始化Fresco
Fresco.initialize(this);
(3)配置网络权限
<uses-permission android:name="android.permission.INTERNET"/>
(4)在xml布局文件中,加入命名空间
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
(5)在xml中引入SimpleDraweeView
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/my_drawable"
/>
(6)在Java代码中开始加载图片
Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");

SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);

draweeView.setImageURI(uri);


5.常用的API

android:layout_width="20dp"   // 不支持wrap_content, 如果要设置宽高比, 需要在Java代码中指定setAspectRatio(float ratio);
android:layout_height="20dp"  // 不支持wrap_content
fresco:placeholderImage="@color/wait_color" // 下载成功之前显示的图片
fresco:placeholderImageScaleType="fitCenter" // 设置图片缩放. 通常使用focusCrop,该属性值会通过算法把人头像放在中间
fresco:failureImage="@drawable/error" // 加载失败的时候显示的图片
fresco:failureImageScaleType=“centerInside"// 设置图片缩放
fresco:retryImage="@drawable/retrying" // 加载失败,提示用户点击重新加载的图片(会覆盖failureImage的图片)
fresco:roundAsCircle="true" // 设置圆形方式显示图片


6.Fresco推荐博客

http://blog.csdn.net/u011771755/article/details/47608191 https://github.com/NateRobinson/FrescoStudyDemo


对比

和ImageLoader对比

ImageLoader作为比较老的框架,也是我们一直使用的框架,其它先不说最起码稳定, 加载速度适中,支持图片下载的过程监听,丰富的配置选项

缺点:
1.不支持GIF图片加载
2.并且缓存机制没有和http的缓存很好的结合, 完全是自己的一套缓存机制(完整大小).
3.进过测试Glide和Fresco取消在结束的时候内存消耗都有明显的下降趋势,这是因为他们和Activity的生命周期绑定了,在生命周期结束的时候会自动释放掉内存占用,但是Picasso和ImageLoader需要自己手动去释放。
4.相对于Glide来说ImageLoader,如果在非购物类的App中来说不需要大量的图片处理,只需要最基本的图片展示,ImageLoader相对而言代码量就比较多使用也更加繁琐。
5.最重要一点ImageLoader已经停止维护,也就是说以后出现的任何的bug都不会修复,任何的新特性都不会再继续开发


Glide和Picasso

1.Glide和Picasso其实是非常相似,Glide加载图片的方法和Picasso如出一辙。例如:

Picasso.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
看起来好像是一样的没有什么区别,但是相比交Picasso来言Glide的with方法不光接受Context,还接受Activity 和 Fragment,Context会自动的从他们获取。
同时将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如 Paused状态在暂停加载,在Resumed的时候又自动重新加载。所以我建议传参的时候传递Activity 和 Fragment给Glide,而不是Context。


2.Glide默认加载的是RGB_565 Picasso默认加载的是RGB_8888 当然这样的出现的现象就是Picasso比Glide更加清晰,但是相应的内存消耗也更加大

3.Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此更小。虽然说Picasso也可以指定加载的图片大小但这样需要我们主动计算ImagerView的大小,这样来说明显Glider更加优势

4.Picasso和Glide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟。

5.如果将Glide恢复到全尺寸的话没有Picasso显示的平滑

6.Glide可以加载GIF动态图,而Picasso不能。

7.Picasso (v2.5.1)的大小约118kb,而Glide (v3.5.2)的大小约430kb。Picasso和Glide的方法个数分别是840和2678个。

总结:Glide可以说是 Picasso 的升级版, 有 Picasso 的优点, 并且支持 GIF 图片加载显示, 图片缓存也会自动缩放, 默认使用RGB_565 格式缓存图片, 是 Picasso 缓存体积的一半.Glide也支持本地视频图片加载

Fresco

Fresco在上面也一一列举了,总结来说就是:更好的内存管理和更强大的功能。

Fresco在综合了之前图片加载库的优点的基础上利用本地代码做了性能上的优化。不过编译完成的文件就2M多,如果不是图片比较多的应用没有太大必要使用。

优点:
1. 图片存储在安卓系统的匿名共享内存(Ashmem区), 而不是虚拟机的堆内存中, 图片的中间缓冲数据也存放在本地堆内存,所以, 应用程序有更多的内存使用, 不会因为图片加载而导致 oom, 同时也减少垃圾回收器频繁调用回收 Bitmap导致的界面卡顿, 性能更高.
2. 渐进式加载 JPEG 图片, 支持图片从模糊到清晰加载
3. 图片可以以任意的中心点显示在 ImageView, 而不仅仅是图片的中心.
4. JPEG 图片改变大小也是在 native 进行的, 不是在虚拟机的堆内存, 同样减少 OOM
5. 很好的支持 GIF 图片的显示
缺点:
1. 框架较大, 影响 Apk 体积
2. 使用较繁琐,他只能用内置的一个ImageView来实现这些功能,用起来比较麻烦,我们通常是根据Fresco自己改改,直接使用他的Bitmap层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android文档
相关文章推荐