Glide和Picasso是目前Android开发中很流行的图片加载库,Glide库和Picasso库也有极大的相似性,这篇文章就通过对比的方式描述一下这个两个功能强大的优秀库的使用。
一、简介:
1、picasso
picasso是Square公司开源的一个Android图形缓存库,不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
- 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题;
- 使用复杂的图片压缩转换来尽可能的减少内存消耗;
- 自带内存和硬盘二级缓存功能。
2、 Glide
Glide 是一个高效、开源、 Android设备上的媒体管理框架,Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果(滚动流畅),另一个是支持远程图片的获取、大小调整和展示。有以下特点:
- GIF动画的解码:通过调用Glide.with(context).load(“图片路径“方法,GIF动画图片可以自动显示为动画效果。如果想有更多的控制,还可以使用Glide.with(context).load(“图片路径“).asBitmap()方法加载静态图片,使用Glide.with(context).load(“图片路径“).asGif()方法加载动画图片。
- 本地视频剧照的解码:通过调用Glide.with(context).load(“图片路径“)方法,Glide能够支持Android设备中的所有视频剧照的加载和展示。
- 缩略图的支持:为了减少在同一个view组件里同时加载多张图片的时间,可以调Glide.with(context).load(“图片路径“).thumbnail(“缩略比例“).into(“view组件“)方法加载一个缩略图,还可以控制thumbnail()中的参数的大小,以控制显示不同比例大小的缩略图。
- Activity生命周期的集成:当Activity暂停和重启时,Glide能够做到智能的暂停和重新开始请求,并且当Android设备的连接状态变化时,所有失败的请求能够自动重新请求。
- 转码的支持:Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode() 方法还能够改变图片的样式。
- 动画的支持:新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能。
- OkHttp和Volley的支持:默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈。
- 其他功能:如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能。
3、总结:
Picasso所能实现的功能,Glide都能做,只是所需的设置不同。但是Picasso体积比起Glide小太多如果项目中网络请求本身用的就是okhttp或者retrofit(本质还是okhttp),那么建议用Picasso,体积会小很多。Glide的好处是大型的图片流,比如gif、Video,如果做美拍这种视频类应用,建议使用。
二、具体应用:
Picasso和Glide都在jcenter上,使用时在项目中添加依赖
1、glide的应用:
TransitionOptions
决定图片加载完成如何从占位符图片(或者之前的图片)过渡,有三种TransitionOptions
1. 添加依赖库:
compile 'com.github.bumptech.glide:glide:3.8.0'
compile 'com.android.support:support-v4:25.4.0'
2.添加依赖后,开始使用
/**
* Glide加载网络图片
*
* @param imgUrl 图片地址
*/
private void GlideShowImg(String imgUrl) {
Glide.with(this) //this 是上下文 activity/fragment
.load(imgUrl)//根据地址下载图片
.listener(setRequestListner())//设置监听
.override(600, 600)//Glide加载图片大小是自动调整的,他根据ImageView的尺寸自动调整加载的图片大小,
// 并且缓存的时候也是按图片大小缓存,每种尺寸都会保留一份缓存,如果图片不会自动适配到 ImageView,调用 override(horizontalSize, verticalSize) 。
// 这将在图片显示到 ImageView之前重新改变图片大小
// .dontAnimate()//不使用glide默认的渐入渐出的动画
.fitCenter()//缩放
// .transform(new GlideRoundTransform(this,20))//显示圆角图片
// .transform(new GlideRotateTransform(this,90))//显示旋转后的图片
// .transform(new GlideCircleTransform(this))//显示圆形图片
// .transform(new GlideRoundTransform(this,20),new GlideRotateTransform(this,90))//圆角且旋转后的显示
// .animate(R.anim.sacle_rotate_anim)//以自定义动画的方式显示
.placeholder(R.mipmap.icon_default)//默认显示图片
.error(R.mipmap.icon_error)//图片加载错误显示的图片
.into(imageView);//显示
}
public RequestListener<String, GlideDrawable> setRequestListner() {
//设置错误监听
RequestListener<String, GlideDrawable> errorListener = new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
//图片加载异常的回调
Log.e("onException", e.toString() + " model:" + model + " isFirstResource: " + isFirstResource);
imageView.setImageResource(R.mipmap.icon_error);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
//图片加载成功的回调
Log.e("onResourceReady", "isFromMemoryCache:" + isFromMemoryCache + " model:" + model + " isFirstResource: " + isFirstResource);
return false;
}
};
return errorListener;
}
代码的注释都很明确,再详细说明一下:
1. Glide可以加载以下五种图片资源,图片的加载以String 型的url为例,一下一句代码就可以实现:
DrawableTypeRequest<String> load(String string)
DrawableTypeRequest<Uri> load(Uri uri)
DrawableTypeRequest<File> load(File file)
DrawableTypeRequest<Integer> load(Integer resourceId)
DrawableTypeRequest<URL> load(URL url)
Glide.with(context).load(imageUrl).into(imageView);
2.当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示: