[轉]Glide的使用詳解

注:本文內容主要參考了郭霖的專欄 Glide最全解析總結而成。

Glide做爲一個快速高效的圖片加載庫,在平常的Android開發中常常會用到,下面咱們來詳細介紹一下它的用法。html

1 Glide的簡單使用

配置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);

2 添加RequestOptions

經過RequestOptions,咱們能夠在藉助Glide加載圖片時優化一下用戶體驗:app

  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 更改Glide配置-自定義模塊

建立一個類使其繼承自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的使用這裏再也不介紹,後期用到了再總結吧。

參考資料:

  1. Android圖片加載框架最全解析(八),帶你全面瞭解Glide 4的用法
  2. 關於Glide
相關文章
相關標籤/搜索