[Glide系列第5篇]Glide图片加载库从v3迁移到v4的改变和使用

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版本,对应不同的变化有不同的类,
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的改变和使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 高考结束后,她很是欢喜的撕掉啃了无数遍的书和各种试卷,无关紧要的全都卖了废品折现,信誓旦旦无论结果如何,这段恐怖的...
    古城小妖阅读 729评论 0 49
  • 是从去年还是今年起,已经记不清楚了,微信圈里突然多了一项动态——轻松筹!我没有使用过,或许应该庆幸,因为我不需要。...
    我若化成风阅读 410评论 0 0
  • 特殊形式的类 接口形式: interface 接口名 { 全局常量(public static final 常量类...
    Jonath阅读 129评论 0 0
  • 开个特种兵的脑洞 人设 卡卡西: 23岁 K国特种部队反恐第十队分队长 体力:★★★★ 智力/战术:★★★★ 格斗...
    d9fc31b8fe07阅读 457评论 0 0
  • 现在二胎盛行。身边经常有朋友鼓励别人生二胎,说不管多么困难的条件,只要生了就能养大。大概就是车到山前必有路的意思,...
    牧田麻麻阅读 167评论 0 0