Glide的使用

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加載圖片時優化一下用戶體驗:

  1. 添加佔位圖:在展示圖片加載出來之前先顯示一張臨時的圖片;
  2. 指定圖片寬高;
  3. 指定緩存機制;
  4. 進行圖片變換:圓角化、圓形化、模糊化等等。

具體實現如下:

//添加佔位圖
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種類型參數:

  1. DiskCacheStrategy.NONE:表示不緩存任何內容
  2. DiskCacheStrategy.DATA:表示只緩存原始圖片
  3. DiskCacheStrategy.RESOURCE:表示只緩存轉換過後的圖片
  4. DiskCacheStrategy.ALL :表示既緩存原始圖片,也緩存轉換過後的圖片
  5. 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


參考資料:

  1. Android圖片加載框架最全解析(八),帶你全面瞭解Glide 4的用法
  2. 關於Glide
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章