注:本文內容主要參考了郭霖的專欄 Glide最全解析總結而成。
Glide做爲一個快速高效的圖片加載庫,在平常的Android開發中常常會用到,下面咱們來詳細介紹一下它的用法。html
配置Gradle的依賴項:
打開Glide框架的GitHub主頁:https://github.com/bumptech/glide,按照介紹配置依賴項(版本號會有變化)便可:java
dependencies { implementation 'com.github.bumptech.glide:glide:4.10.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' }
配置相關權限:
根據需求,咱們須要在AndroidManifest.xml
中配置一下相應權限。
爲了加載網絡圖片,須要添加網絡權限:android
<!--添加網絡權限--> <uses-permission android:name="android.permission.INTERNET" />
爲了監聽網絡狀態,例如在設備從新鏈接到網絡時重啓以前失敗的請求:git
<!--容許訪問網絡狀態--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
爲了從本地文件夾或 DCIM 或圖庫中加載圖片,須要添加讀取外部存儲權限:github
<!--讀取外部存儲權限--> <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);
固然Glide還支持加載不一樣來源的圖片:本地圖片、應用的Resource、二進制流、Uri對象。(參考 Android圖片加載框架最全解析(一),Glide的基本用法)
// 加載本地圖片 File file = new File(getExternalCacheDir() + "/image.jpg"); Glide.with(this).load(file).into(imageView); // 加載應用資源 int resource = R.drawable.image; Glide.with(this).load(resource).into(imageView); // 加載二進制流 byte[] image = getImageBytes(); Glide.with(this).load(image).into(imageView); // 加載Uri對象 Uri imageUri = getImageUri(); Glide.with(this).load(imageUri).into(imageView);
經過RequestOptions,咱們能夠在藉助Glide加載圖片時優化一下用戶體驗:app
具體實現以下:框架
//添加佔位圖 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); } }
藉助error方法實現請求失敗時開始新的請求,須要給error方法傳入一個RequestBuilder對象或本地資源(Drawable或resourceId):
Glide.with(MainActivity.this).load(primaryUrl).error(Glide.with(MainActivity.this) .load(fallbackUrl)).into(imageView);
無論咱們傳入的是一張普通圖片,仍是一張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);
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更多的用法詳見: 目標
需求:對圖片進行預加載,等真正要顯示時直接從緩存中讀取
//以原尺寸預加載 Glide.with(MainActivity.this).load(URL).preload(); //或者以指定尺寸預加載 Glide.with(MainActivity.this).load(URL).preload(200,300); //在須要加載時再從緩存中讀取便可 Glide.with(MainActivity.this).load(URL).preload();
咱們藉助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
能夠藉助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方法了。
建立一個類使其繼承自AppGlideModule
,並實現applyOptions方法和registerComponents方法,有關具體案例請參考Android圖片加載框架最全解析(六),探究Glide的自定義模塊功能,這裏再也不贅述。
@GlideModule public class MyAppGlideModule extends AppGlideModule{ //更改Glide配置 @Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { //用於配置Glide的內存緩存策略,默認配置是LruResourceCache builder.setMemoryCache(); //用於配置Glide的Bitmap緩存池,默認配置是LruBitmapPool builder.setBitmapPool(); //用於配置Glide的硬盤緩存策略,默認配置是InternalCacheDiskCacheFactory builder.setDiskCache(); //用於配置Glide讀取緩存中圖片的異步執行器, //默認配置是FifoPriorityThreadPoolExecutor,也就是先入先出原則 builder.setDiskCacheExecutor(); } //替換Glide組件 @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { } }
有關Generated API的使用這裏再也不介紹,後期用到了再總結吧。
參考資料: