Glide图片加载库从v3迁移到v4的改变和使用
2017-12-26 本文已影响777人
芒果味的你呀
1.关于配置
app/builde.gradle
dependencies {
compile 'com.github.bumptech.glide:glide:4.4.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'
}
Project:build.gradle
repositories {
mavenCentral()
maven { url 'https://maven.google.com' }
}
2.基本用法:加载三步走
Glide.with(this)
.load(myUrl)
.into(imageView);
3.V3迁移到V4做的比较大的改变
-
在V3版本,选项由一系列复杂的异构建造者(multityped builders)单独处理。比如BitmapRequestBuilder、DrawableRequestBuilder、GifRequestBuilder等。但是Glide v4 中,由一个单一类型的唯一一个建造者接管一系列选项对象,即RequestBuilder
在 Glide v4 版本中,只存在一个RequestBuilder对应一个你正在试图加载的【类型】(Bitmap 、Drawable、GifDrawable等)。RequestBuilder可以直接访问对这个加载过程有影响的选项,包括你想加载的【数据模型】(url, uri、file等),可能存在的【略缩图】请求,以及任何的【监听器】,也是使用【into】开始加载的地方。
-
在V3版本,我们通常会把许多选项在load和into之间,以流式API的形式串联起来,比如
//在v3版本
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)
.into(imageView);
placeholder方法指定占位图
error方法指定异常占位图
diskCacheStrategy磁盘缓存策略
override指定图片大小
我们也可以在中间指定图片格式asBitmap()或者asGif()
或者指定图片展示类型centerCrop()等
对于这些API,在V4上大部分选项被移动到了一个单独的称为 RequestOptions 的对象中。RequestOptions 允许你一次指定一系列的选项,然后对多个加载重用它们:
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH);
RequestOptions myOptions = new RequestOptions()
.fitCenter()
.override(100, 100);
Glide.with(fragment)
.load(url)
.apply(myOptions)
.into(drawableView);
Glide.with(fragment)
.asBitmap()
.apply(myOptions)
.load(url)
.into(bitmapView);
-
变换,对于V3版本,对应不同的变化有不同的类,
但是对于V4版本来说,Glide v4 里的Transformations 现在会替换之前设置的任何变换。在 Glide v4 中,如果你想应用超过一个的Transformation,你需要使用transforms()方法,使用实例:
Glide.with(fragment)
.load(url)
.apply(new RequestOptions().transforms(new CenterCrop(), new RoundedCorners(20)))
.into(target);
在这里我只提出几个重要的改变,还有其它的,比如过渡动画等,点击这个链接查找从v3迁移到v4
4.Generated API
如果我们还是想要像v3一样使用流式api,而不是每次要new RequestOptions等,不需要手动在调用apply。Glide 现在也提供了一套可以为应用定制化生成的 API。应用可以通过包含一个标记了 AppGlideModule的实现来访问生成的 API。如果你不了解这是怎么工作的,可以查看 Generated API
【如何配置Generated API】:
1.在 Application 模块中,创建一个新类 MyAppGlideModule
这个类的特点是有 @GlideModule 注解,继承自 AppGlideModule。
此类可生成出一个流式 API,内联了多种选项,和集成库中自定义的选项:
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
2.生成的 API 默认名为GlideApp,与AppGlideModule的子类包名相同。在 Application 模块中将Glide.with()替换为GlideApp.with(),即可使用该 API 去完成加载工作。
在没有使用 Generated API 时,请求大概长这样:
Glide.with(fragment)
.load(url)
.apply(centerCropTransform()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH))
.into(imageView);
使用 Generated API,RequestOptions 的调用可以被内联:
GlideApp.with(fragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH)
.into(imageView);
使用Generated API,还是可以使用生成的 RequestOptions 子类来应用相同的选项到多次加载中;但生成的 RequestBuilder 子类可能在多数情况下更为方便。
5.列举一些使用实例:
在v3版本,对于圆角和圆形图片我们是需要自定义Transformation的,但是v4已经帮我们封装好直接使用了。这点看之前总结的文章有提到Android加载圆角图片、圆形图片的三种方式
-
圆角实现
GlideApp.with(context)
.load(url)
.transform(new RoundedCorners(20)) //此处为圆角px值
.into(iv);
-
圆形实现
GlideApp.with(context)
.load(TextUtils.isEmpty(url)?url:new MyGlideUrl(url))
.transform(new CircleCrop(context))
.into(iv);
-
占位符
Placeholder 请求图片加载中
Error 请求图片加载错误
Fallback 请求url/model为空
GlideApp.with(fragment)
.load(url)
.placeholder(R.drawable.placeholder)
.error(new ColorDrawable(Color.RED))
.fallback(new ColorDrawable(Color.GREY))
.into(view);
6.写到最后,文章只是挑了一点经典的常用的改变,不会面面俱到,如果没有你需要的,可以查看官网给出的文档查阅学习:点这里
关于Glide系列的其他文章:
Glide源码分析流程思维导图
【两篇就懂系列】Glide源码分析之加载图片流程(1/2)
【两篇就懂系列】Glide源码分析之加载图片流程(2/2)
【一篇就懂系列】Glide源码分析之缓存处理
Glide图片加载库从v3迁移到v4的改变和使用