Glide的基本使用
說到現(xiàn)下Android開發(fā)中熱門的第三方框架,就會談到圖片加載框架Glide這個框架,在大部分的APP開發(fā)中都會有Glide的影子,為什么Glide被廣泛使用呢?Glide官方文檔是這樣描述的:
Glide是一個快速高效的Android圖片加載庫,注重于平滑的滾動。Glide提供了易用的API,高性能、可擴(kuò)展的圖片解碼管道(decode pipeline),以及自動的資源池技術(shù)。
Glide 支持拉取,解碼和展示視頻快照,圖片,和GIF動畫。Glide的Api是如此的靈活,開發(fā)者甚至可以插入和替換成自己喜愛的任何網(wǎng)絡(luò)棧。默認(rèn)情況下,Glide使用的是一個定制化的基于HttpUrlConnection的棧,但同時也提供了與Google Volley和Square OkHttp快速集成的工具庫。
雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動盡可能地變得更快、更平滑,但實(shí)際上,Glide幾乎能滿足你對遠(yuǎn)程圖片的拉取/縮放/顯示的一切需求。
那么Glide在我們開發(fā)中究竟是怎么樣使用的呢?
1、使用要求
Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 或更高。
Compile Sdk Version - Glide 必須使用 API 27或更高版本的 SDK 來編譯。
Support Library Version - Glide 使用的支持庫版本為 27。
2、Glide庫的引入
Android studio中Gradle配置:
在root的build.gradle中增加下面配置,從maven倉庫中引入:
repositories {
mavenCentral()
maven { url 'https://maven.google.com' }
}
并在app的build.gradle中增加對glide的依賴,配置如下:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
}
注: 如果你需要使用不同的支持庫版本,你需要在你的 build.gradle 文件里去從 Glide 的依賴中去除 "com.android.support",例如:
dependencies {
implementation ("com.github.bumptech.glide:glide:4.7.1") {
exclude group: "com.android.support"
}
implementation "com.android.support:support-fragment:26.1.0"
}
3、Glide加載圖片基本方式
特別說明:Glide 現(xiàn)在最新版是v4,與之前的v3版本在使用上有比較大的差異,主要改動是Glide庫處理選項(xiàng)(centerCrop(), placeholder() 等)的方式,V4版本增加RequestOptions類處理選項(xiàng)。因此在本文中主要V4版本的用法。
1.簡單常用的方式
使用Glide加載圖片很簡單,一行代碼足以:
String myUrl = "http://img.zcool.cn/community/0117e2571b8b246ac72538120dd8a4.jpg@1280w_1l_2o_100sh.jpg";
ImageView imageView = (ImageView)findViewById(R.id.iv_background);
Glide.with(fragment)
.load(myUrl) //myurl表示圖片的url地址
.into(imageView);//imageView表示加載的圖片要顯示在imageView上
既然有加載,就有相應(yīng)的取消加載方式,同樣很簡單:
Glide.with(context).clear(imageView); // 取消加載圖片
注:盡管及時的取消不必要的加載是很好的實(shí)踐,但不是必須的操作。因?yàn)樵趯?shí)際中的Activity、Fragment在實(shí)例銷毀的時候,Glide自身會自動取消加載。
2.使用注解處理器的方式
這種方式時使用注解的方式,實(shí)現(xiàn)的。在使用注解方式,務(wù)必要在App的build.gradle的dependencies中引入下:
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
在Application模塊中,通過創(chuàng)建一個帶有@GlideModule注解,并繼承AppGlideModule的類。這個類能夠生成一個流式API,內(nèi)嵌了多種選項(xiàng),如下:
package com.example.myapp;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
通過編譯就好生成一個默認(rèn)名稱為GlideApp的類,在Application中就可以按下方式使用來完成加載圖片功能:
RequestOptions options = new RequestOptions();
options.placeholder(placeholder)
.fitCenter();
GlideApp.with(fragment)
.load(myUrl)
.apply(options)
.into(imageView);
4、Glide的其他設(shè)置
1.占位圖設(shè)置
在實(shí)際圖片的加載過程中,會經(jīng)常出現(xiàn)圖片加載緩慢的問題,這個時候需要展示該圖片的位置就顯示了一片空白,體驗(yàn)效果很不友好,因此Glide提供了占位圖,可以預(yù)設(shè)置一個默認(rèn)的圖片,在實(shí)際的圖片未加載完成時,顯示這個默認(rèn)圖片,提高用戶體驗(yàn)。使用方式如下:
//通過使用RequestOptions去設(shè)置占位圖及加載錯誤時顯示圖
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_default) //這里設(shè)置占位圖
.error(R.drawable.ic_error) ;//這里設(shè)置圖片加載錯誤時要顯示的圖
Glide.with(activity)
.load(url)
.apply(options)
.into(imageView);
placeholder()和error()參數(shù)都是int類型,即使用本地資源對應(yīng)的id,可能主要考慮到加載速度快。
2.縮略圖
設(shè)置縮略圖,與設(shè)置占位圖有所不同,可以設(shè)置網(wǎng)絡(luò)資源。使用如下:
Glide.with(activity)
.load(url)
.thumbnail(0.4f)
.into(imageView);
意思很簡單,就是展示原來0.4倍大小的一個縮略圖。
3.動畫開關(guān)
從Glide 3.7版本開始,默認(rèn)開啟了動畫開關(guān)。如需關(guān)閉動畫可調(diào)用dontAnimate。
但是在V4版本之后動畫設(shè)置移入到TransitionOptions中,有如下三種:
GenericTransitionOptions,DrawableTransitionOptions,BitmapTransitionOptions
Glide.with(this)
.load(url)
.transition(DrawableTransitionOptions.withCrossFade()) //淡入淡出動畫
.apply(RequestOptions.noAnimation()) //關(guān)閉動畫
.into(imageView);
默認(rèn)情況下動畫時間是300ms。
4.圖片緩存
內(nèi)存緩存
為了實(shí)現(xiàn)圖片快速加載,Glide幫我們實(shí)現(xiàn)了圖片緩存功能,如果不需要使用則可調(diào)用skipMemoryCache(true)告訴Glide跳過內(nèi)存緩存。
注意:該方法之對內(nèi)存緩存有影響。
磁盤緩存
由于手機(jī)內(nèi)存使用有限,內(nèi)存資源比較珍貴,不可能將所有的圖片資源緩存的內(nèi)存中,因此為了提高加載效率,Glide還采用了磁盤緩存的方式。
磁盤緩存也是默認(rèn)開啟的,當(dāng)然也可以關(guān)閉,方式如下:
Glide.with(activity)
.load(url)
.apply(RequestOptions.skipMemoryCacheOf(true) //取消內(nèi)存緩存
.diskCacheStrategy(DiskCacheStrategy.NONE)) //取消圖片磁盤緩存
.into(imageView);
緩存設(shè)置同樣式通過RequestOptions進(jìn)行設(shè)置的。
5.顯示gif和video
Glide可以加載和顯示一個gif,使用方式很簡單,如下:
Glide.with(activity)
.asGif()
.load(url)
.into(imageView);
注:這里如果加載的不是一個gif動畫,將無法顯示,所以asGif慎用。
Glide加載video只能針對本地的視頻。
6.其他功能
Glide還有其他的功能,比如自已自定義緩存策略、設(shè)置優(yōu)先級等。這里就不多說了??梢钥纯碦equestOption類。
5、總結(jié)
1.針對兩種方式的使用,可根據(jù)個人喜好自行選擇;
2.Glide使用時,對url進(jìn)行空檢查并不是必須的,如果url為空,則會清空View的內(nèi)容或者使用設(shè)置的默認(rèn)圖片資源;
3.使用在列表(ListView、RecyclerView等)中由于View的復(fù)用,因此針對在之前的位置上,用 Glide 進(jìn)行過加載操作的情況,那么在新的位置上要重新into(view)操作,或調(diào)用clear()API 停止 Glide 的工作。否則可能會出現(xiàn)這樣一個情況:你已經(jīng)對一個view設(shè)置好了Drawable,但該 view 在之前的位置上使用 Glide 進(jìn)行過加載圖片的操作,在Glide 加載完畢后可能會將這個view改回成原來的內(nèi)容,即沒有設(shè)置成功問題。
至此,Glide開源框架的使用就是這么的簡單,到這里就講完了。
后面會從源碼的角度對Glide進(jìn)行分析。