[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的改变和使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

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