Glide作爲一個快速高效的圖片加載庫,在Android日常開發中經常會用到,下面我們來詳細介紹一下它的用法。
1 Glide的簡單使用
配置Gradle的依賴項:
打開Glide框架的GitHub主頁:https://github.com/bumptech/glide,按照介紹配置依賴項(版本號會有變化)即可:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
}
配置相關權限:
根據需求,我們需要在AndroidManifest.xml
中配置一下相應權限。
爲了加載網絡圖片,需要添加網絡權限:
<!--添加網絡權限-->
<uses-permission android:name="android.permission.INTERNET" />
爲了監聽網絡狀態,例如在設備重新連接到網絡時重啓之前失敗的請求:
<!--允許訪問網絡狀態-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
爲了從本地文件夾或 DCIM 或圖庫中加載圖片,需要添加讀取外部存儲權限:
<!--讀取外部存儲權限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
如果要使用ExternalPreferredCacheDiskCacheFactory
來將Glide的緩存存儲到公有SD卡上,你還需要添加 寫入外部存儲的權限:
<!--寫入外部存儲權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
一行代碼搞定圖片加載與顯示:
Glide.with(this).load(URL).into(imageView);
2 添加RequestOptions
通過RequestOptions,我們可以在藉助Glide加載圖片時優化一下用戶體驗:
- 添加佔位圖:在展示圖片加載出來之前先顯示一張臨時的圖片;
- 指定圖片寬高;
- 指定緩存機制;
- 進行圖片變換:圓角化、圓形化、模糊化等等。
具體實現如下:
//添加佔位圖
RequestOptions options = new RequestOptions().placeholder(R.drawable.ic_launcher_background);
//指定圖片寬高
RequestOptions options2 = new RequestOptions().override(200, 300);
//指定緩存機制:既緩存原始圖片,也緩存轉換過後的圖片
RequestOptions options3 = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL);
//進行圖片變換
RequestOptions options4 = new RequestOptions().centerCrop();
RequestOptions options5 = new RequestOptions().fitCenter();
RequestOptions options6 = new RequestOptions().circleCrop();
Glide.with(MainActivity.this).load(URL).apply(options).into(imageView);
//進行圖片組合變換方式1
Transformation<android.graphics.Bitmap> transformation = new MultiTransformation<>(new CenterCrop(),new FitCenter());
Glide.with(MainActivity.this).load(URL).transform(transformation).into(imageView);
//進行圖片組合變換方式2
Glide.with(MainActivity.this).load(URL).transform(new FitCenter(),new CenterCrop()).into(imageView);
一般情況下我們是不需要指定圖片的大小的,因爲Glide會根據ImageView的大小來決定圖片的大小;
指定緩存機制有5種類型參數:
- DiskCacheStrategy.NONE:表示不緩存任何內容
- DiskCacheStrategy.DATA:表示只緩存原始圖片
- DiskCacheStrategy.RESOURCE:表示只緩存轉換過後的圖片
- DiskCacheStrategy.ALL :表示既緩存原始圖片,也緩存轉換過後的圖片
- DiskCacheStrategy.AUTOMATIC:表示讓Glide根據圖片資源智能地選擇使用哪一種緩存策略(默認選項)
有關自定義變換效果的內容請參考:定製變換,當然也可以引入第三方的庫:glide-transformations
下面我們可以自己封裝一個工具類:
public class GlideUtil {
public static void load(
Context context, String url, RequestOptions options, ImageView imageView){
Glide.with(context).load(url).apply(options).into(imageView);
}
}
3 在失敗時開始新的請求
藉助error方法實現請求失敗時開始新的請求,需要給error方法傳入一個RequestBuilder對象或本地資源(Drawable或resourceId):
Glide.with(MainActivity.this).load(primaryUrl).error(Glide.with(MainActivity.this)
.load(fallbackUrl)).into(imageView);
4 指定加載格式
不管我們傳入的是一張普通圖片,還是一張GIF圖片,Glide都會自動進行判斷,並且可以正確地把它解析並展示出來,但我們非要指定加載的圖片格式
//強制指定加載靜態圖片
Glide.with(MainActivity.this).asBitmap().load(URL).into(imageView);
//強制指定加載動態圖片
Glide.with(MainActivity.this).asGif().load(URL).into(imageView);
//強制指定加載指定文件格式
Glide.with(MainActivity.this).asFile().load(URL).into(imageView);
//強制以Drawable格式加載圖片
Glide.with(MainActivity.this).asDrawable().load(URL).into(imageView);
5 into方法
into方法除了可以傳入ImageView,還可以傳入
//CustomTarget的具體實現
CustomTarget<Drawable> target=new CustomTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
//重寫的方法中可以獲取到Drawable對象,這裏僅僅將drawable顯示出來
imageView.setImageDrawable(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
};
//將圖片加載到target
Glide.with(MainActivity.this).load(URL).into(target);
有關target更多的用法詳見:目標
6 預加載
需求:對圖片進行預加載,等真正要顯示時直接從緩存中讀取
//以原尺寸預加載
Glide.with(MainActivity.this).load(URL).preload();
//或者以指定尺寸預加載
Glide.with(MainActivity.this).load(URL).preload(200,300);
//在需要加載時再從緩存中讀取即可
Glide.with(MainActivity.this).load(URL).preload();
7 訪問緩存文件
我們藉助submit方法可以只下載圖片而不加載圖片,
loadImageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
downloadImage();
}
});
}
private void downloadImage(){
//target.get()方法會阻塞線程,所以需要單獨開一個線程去獲取緩存路徑
new Thread(new Runnable() {
@Override
public void run() {
try {
FutureTarget<File> target = Glide.with(getApplicationContext()).asFile().load(URL).submit();
imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "下載圖片緩存路徑:"+imageFile.getPath());
}
});
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
打印日誌如下:
下載圖片緩存路徑:/data/user/0/com.crazywish.glidetest/cache/image_manager_disk_cache/3e991b944c38ebc970aac3a217b7f0c6d087883d17a5f77f95d2375feacbe2d9.0
8 監聽
可以藉助listener()方法來監聽圖片加載的狀態:
Glide.with(MainActivity.this).load(URL)
.listener(new RequestListener<Drawable>() {
//圖片加載失敗時的回調
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
//圖片加載完成時的回調
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
}).into(imageView);
若listener方法的onResourceReady方法返回爲true,則表示該事件被處理掉了,則不會繼續向下傳遞,那麼就不會回調Target的onResourceReady方法了。
9
參考資料: