[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閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容

  • 高考結束后,她很是歡喜的撕掉啃了無數遍的書和各種試卷,無關緊要的全都賣了廢品折現,信誓旦旦無論結果如何,這段恐怖的...
    古城小妖閱讀 714評論 0 49
  • 是從去年還是今年起,已經記不清楚了,微信圈里突然多了一項動態——輕松籌!我沒有使用過,或許應該慶幸,因為我不需要。...
    我若化成風閱讀 399評論 0 0
  • 特殊形式的類 接口形式: interface 接口名 { 全局常量(public static final 常量類...
    Jonath閱讀 126評論 0 0
  • 開個特種兵的腦洞 人設 卡卡西: 23歲 K國特種部隊反恐第十隊分隊長 體力:★★★★ 智力/戰術:★★★★ 格斗...
    d9fc31b8fe07閱讀 439評論 0 0
  • 現在二胎盛行。身邊經常有朋友鼓勵別人生二胎,說不管多么困難的條件,只要生了就能養大。大概就是車到山前必有路的意思,...
    牧田麻麻閱讀 163評論 0 0