關(guān)于Glide
Glide是一款快速高效的Android圖像加載庫,注重于平滑的滾動油湖。Glide提供了易用的API讶迁,高性能、可擴展的圖片解碼管道(decode pipeline)恃慧,以及自動的資源池技術(shù)园蝠。
Glide 支持拉取,解碼和展示視頻快照痢士,圖片彪薛,和GIF動畫茂装。
Glide默認(rèn)使用的是HttpUrlConnection類下載圖片,但是也提供了與Google Volley和Square OkHttp快速集成的工具庫善延。
雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動盡可能地變得更快少态、更平滑,但實際上易遣,Glide幾乎能滿足你對遠(yuǎn)程圖片的拉取/縮放/顯示的一切需求彼妻。
Android SDK 要求
- 使用 Glide 最小SDK版本(minSdkVersion)必須是API 14 (Ice Cream Sandwich) 或更高。
- 使用Glide 編譯SDK版本(compileSdkVersion)必須是 API 27 (Oreo MR1) 或更高版本
Android Studio在線依賴
Glide支持在線依賴豆茫,目前最新版本是4.8.0侨歉,在build.gradle文件中dependencies屬性下增加兩行代碼。
dependencies {
compile 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}
權(quán)限
Glide一般情況下需要向AndroidManifest.xml文件中添加以下四個權(quán)限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- INTERNET:訪問網(wǎng)絡(luò)權(quán)限揩魂,有了這個權(quán)限才能從網(wǎng)絡(luò)上在線加載圖片幽邓。
- ACCESS_NETWORK_STATE:訪問網(wǎng)絡(luò)狀態(tài)權(quán)限,不是必須的權(quán)限火脉,但是加上可以處理片狀網(wǎng)絡(luò)(flaky network) 和飛行模式牵舵。
- READ_EXTERNAL_STORAGE:閱讀本地SD卡權(quán)限,從本地文件夾或 DCIM 或圖庫中加載圖片倦挂。
- WRITE_EXTERNAL_STORAGE:將Glide的緩存存儲到SD卡上需要這個權(quán)限畸颅。
簡單使用
Glide加載圖片非常簡單,只需要一行代碼:
Glide.with(this)
.load("https://github.com/ansen666/images/blob/master/" +
"public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
.into(imageView);
上面這行代碼先后調(diào)用了三個方法:
- with 傳入Activity或者Fragment實例方援,這里我們直接用this
- load 圖片url
- into 圖片加載完成之后顯示在這個控件上
當(dāng)然我們還可以取消加載没炒,但是一般情況不需要使用,因為Glide.with()方法中傳入的Activity或者Fragment實例銷毀時肯骇,Glide 會自動取消加載并回收資源窥浪。
后臺線程
其實Glide是可以通過后臺線程獲取Bitmap的,在后臺線程中直接使用submit(int, int)方法笛丙。
new Thread(runnable).start();
//在后臺線程中獲取bitmap
Runnable runnable=new Runnable() {
@Override
public void run() {
FutureTarget<Bitmap> futureTarget =
Glide.with(MainActivity.this)
.asBitmap()
.load("https://github.com/ansen666/images/blob/master/" +
"public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
.submit();
try {
Bitmap bitmap = futureTarget.get();
Log.i("ansen","獲取的bitmap:"+bitmap);
//當(dāng)上面獲取的bitmap使用完畢時漾脂,調(diào)用clear方法釋放資源
Glide.with(MainActivity.this).clear(futureTarget);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
首先新建一個線程,跟前面的加載圖片不同的是我們調(diào)用了submit方法胚鸯,這個方法可以傳入一個寬高也可以不傳骨稿,同時返回FutureTarget對象,在調(diào)用get方法獲取我們需要的Bitmap姜钳,當(dāng)我們獲取的bitmap使用完畢時坦冠,記得調(diào)用clear方法釋放資源。
futureTarget.get方法會拋出異常哥桥,需要用try catch捕捉辙浑。
當(dāng)然,如果你不想開一個線程獲取Bitmap也是可以的拟糕,可以通過主線程異步獲取Bitmap方式判呕。
Glide.with(this)
.asBitmap()
.load("https://github.com/ansen666/images/blob/master/" +
"public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
//這里我們拿到回掉回來的bitmap倦踢,可以加載到我們想使用到的地方
imageView.setImageBitmap(resource);
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
Log.i("ansen", "圖片加載失敗");
}
});
從上述代碼中可以看到,into方法傳入的是一個SimpleTarget對象侠草,這個類是一個抽象類辱挥,這里我們使用內(nèi)部類方式實現(xiàn),重寫這個類的兩個方法(onResourceReady和onLoadFailed)边涕,onResourceReady加載圖片成功會回調(diào)晤碘,同時把Bitmap當(dāng)參數(shù)返回。onLoadFailed方法加載圖片失敗回調(diào)功蜓。
load方法傳入其他參數(shù)
如果你以為Glide只能加載網(wǎng)絡(luò)圖片的話园爷,那就不會有這么多人使用了,他還能支持Resources資源霞赫、File資源腮介、Uri資源、字節(jié)數(shù)組等方式加載端衰。
Glide.with(context).load(resourceId).into(imageView);
Glide.with(context).load(file).into(imageView);
Glide.with(context).load(uri).into(imageView);
Glide.with(context).load(byte[]).into(imageView);
加載gif圖片
Glide支持直接加載Gif圖片,使用也很簡單,就多調(diào)用一個asGif方法而已
Glide.with(this).asGif().load(R.mipmap.result).into(ivGif);
Generated API
Glide v4 使用 注解處理器 (Annotation Processor) 來生成出一個 API甘改,在 Application 模塊中可使用該流式 API 一次性調(diào)用到 RequestBuilder旅东, RequestOptions 和集成庫中所有的選項。
Generated API 模式的設(shè)計出于以下兩個目的:
- 集成庫可以為 Generated API 擴展自定義選項十艾。
- 在 Application 模塊中可將常用的選項組打包成一個選項在 Generated API 中使用
開始使用
Generated API 目前僅可以在 Application 模塊內(nèi)使用抵代。這一限制可以讓我們僅持有一份 Generated API,而不是各個 Library 和 Application 中均有自己定義出來的 Generated API忘嫉。
這一做法會讓 Generated API 的調(diào)用更簡單荤牍,并確保 Application 模塊中 Generated API 調(diào)用的選項在各處行為一致。這一限制在接下來的版本中也許會被取消(以實驗性或其他的方式給出)庆冕。
在app模塊中使用Generated API康吵,需要兩個步驟:
1.添加 Glide 注解處理器的依賴
dependencies {
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}
我們文章開頭講解Android Studio在線依賴的時候就有包含這個,所以這個步驟可以忽略访递。
在 Application 模塊中包含一個 AppGlideModule 的實現(xiàn)
我們新建一個類晦嵌,類名叫MyAppGlideModule,名字可以隨便起拷姿,但是必須要繼承自AppGlideModule惭载,以及給類加上@GlideModule注解標(biāo)記。
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
/**
* @author ansen
* @create time 2018/10/28
*/
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {
}
Android Studio 在大多數(shù)時候都可以正確地處理注解處理器 (annotation processor) 和 generated API响巢。然而描滔,當(dāng)你第一次添加 AppGlideModule 時,需要重新 (rebuild) 一下項目踪古。不然使用GlideApp類時會提示找不到這個類含长。
使用Generated API
Generated API 默認(rèn)名為 GlideApp 券腔,使用起來跟之前Glide方式一樣,只需要把Glide替換成GlideApp茎芋,例如加載在線圖片顯示颅眶,代碼如下:
//Generated API 使用方式
GlideApp.with(this)
.load("https://github.com/ansen666/images/blob/master/" +
"public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
.into(imageView);
與 Glide.with() 不同,諸如 fitCenter() 和 placeholder() 等選項在 Builder 中直接可用田弥,并不需要再傳入單獨的 RequestOptions 對象涛酗。
說點廢話
今天Glide就給大家介紹到這里了,接下來我還會講解Glide占位符偷厦、動畫商叹、Target、配置只泼、緩存剖笙、集成Okhttp等一系列文章,希望大家持續(xù)關(guān)注请唱,新的一個禮拜又開始了弥咪,祝大家工作愉快。
源碼下載:
如果你想第一時間看我的后期文章十绑,掃碼關(guān)注公眾號聚至,長期推送Android開發(fā)文章、最新動態(tài)本橙、開源項目扳躬,讓你各種漲姿勢。
Android開發(fā)666 - 安卓開發(fā)技術(shù)分享
掃描二維碼加關(guān)注