1. 程式人生 > >android圖片載入庫Glide4使用教程(專案中如何快速將Glide3替換成Glide4)

android圖片載入庫Glide4使用教程(專案中如何快速將Glide3替換成Glide4)

我想大多數人在自己的專案中還是使用Glide3.7.1這個版本吧!不過Glide版本現在已經到4.4.0了!

當我們把Glide3更換成Glide4,會發現大部分地方都報錯了,那麼該怎樣快速替換Glide3為Glide4呢?

下面我們一起來看看怎樣實現Glide3到Glide4的快速替換。

Glide4的基本用法:

  • 引入Glide
  implementation 'com.github.bumptech.glide:glide:4.4.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'

compiler:包含各種註解的使用,Glide3快速替換成Glide4時要用到。

  • 新增網路許可權
<uses-permission android:name="android.permission.INTERNET" />

在這個地方可能你的專案會報個錯:java.lang.NoSuchMethodError

這是因為Glide4中已經引入了appcompat-v7包,版本不一致引起。

解決方法:

Glide4.4.0引入的是27.0.2版本,所以把你專案中的appcompat-v7更換為:

 implementation 'com.android.support:appcompat-v7:27.0.2'
  • 普通載入圖片
 Glide.with
(this.getApplicationContext()) .load(url) .into(mImage);
  • 佔位圖和錯誤時顯示圖片
 RequestOptions options = new RequestOptions();
                options.placeholder(R.drawable.ic_launcher_background);
                options.error(R.mipmap.load_error);
                //禁用掉Glide的快取功能
                options.diskCacheStrategy
(DiskCacheStrategy.NONE); Glide.with(this.getApplicationContext()) .load(url) .apply(options) .into(mImage);

這裡就是Glide4和Glide3的最大不同,他將部分API功能封裝在RequestOptions 中,在通過apply方法,傳遞給Glide使用,這樣我們就可以很方便的在需要的地方可以進行不同的配置了,不用像Glide3一樣傳遞很多引數!

  • 指定圖片大小
RequestOptions options1 = new RequestOptions();
                //指定大小為200*100
                //options1.override(200, 100);
                //載入一張圖片的原始尺寸的圖片
                options1.override(Target.SIZE_ORIGINAL);
                Glide.with(this.getApplicationContext())
                        .load(url)
                        //請求給定係數的縮圖。如果縮圖比全尺寸圖先載入完,
                        // 就顯示縮圖,否則就不顯示。
                        // 係數sizeMultiplier必須在(0,1)之間,
                        // 可以遞迴呼叫該方法。
                        .thumbnail(0.1f)
                        .apply(options1)
                        .into(mImage);
  • 禁用記憶體快取&硬碟快取功能

 // DiskCacheStrategy.NONE: 表示不快取任何內容。
                // DiskCacheStrategy.DATA: 表示只快取原始圖片。
                // DiskCacheStrategy.RESOURCE: 表示只快取轉換過後的圖片。
                // DiskCacheStrategy.ALL : 表示既快取原始圖片,也快取轉換過後的圖片。
                // DiskCacheStrategy.AUTOMATIC: 表示讓Glide根據圖片資源智慧地選擇使用哪一種快取策略(預設選項)。
                RequestOptions options2 = new RequestOptions()
                        //禁用記憶體快取
                        .skipMemoryCache(true)
                        //硬碟快取功能
                        .diskCacheStrategy(DiskCacheStrategy.NONE);
                Glide.with(this.getApplicationContext())
                        .load(url)
                        .apply(options2)
                        .into(mImage);
  • 指定載入格式GIF
  Glide.with(this.getApplicationContext())
                        .load("file:///android_asset/jdfw.gif")
                        .into(mImage);
  • 獲取gif第一幀
 /**
                 * 注意:在Glide 3中的語法是先load()再asBitmap()的,
                 *
                 * 而在Glide 4中是先asBitmap()再load()的
                 *
                 * 如果寫錯了順序就肯定會報錯了
                 */
                Glide.with(this.getApplicationContext())
                        //.asBitmap()//強制指定載入靜態圖片
                        //.asGif()//強制指定載入動態圖片
                        //.asFile()//強制指定檔案格式的載入
                        .asDrawable()//強制指定Drawable格式的載入
                        .load("file:///android_asset/jdfw.gif")
                        .into(mImage);
  • 回撥與監聽
 /**
     * 回撥與監聽
     */
    SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
        @Override
        public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
            mImage.setImageDrawable(resource);
        }
    };
 Glide.with(this.getApplicationContext())
                        .load(url)
                        .into(simpleTarget);
  • 預載入後顯示
預載入

   Glide.with(this)
                        .load("https://unsplash.it/200/200?random&22")
                        .preload();

預載入後顯示

 Glide.with(this.getApplicationContext())
                        .load("https://unsplash.it/200/200?random&22")
                        .into(mImage);
  • submit()方法:類似Glide3中的downloadOnly
 new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            final Context context = getApplicationContext();
                            FutureTarget<File> target = Glide.with(context)
                                    //.asDrawable()
                                    .asFile()
                                    .load(url)
                                    .submit();
                            //final Drawable drawable = target.get();
                            final File imageFile = target.get();
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    mTextview.setText(imageFile.getPath());
                                }
                            });
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
  • listener()方法
  Glide.with(this.getApplicationContext())
                        .load(url)
                        .listener(new RequestListener<Drawable>() {
                            @Override
                            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                                mTextview.setText("載入失敗");
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                                mTextview.setText("載入成功");
                                return false;
                            }
                        })
                        .into(mImage);
  • 圖片變換(圓角等)
  RequestOptions options3 = new RequestOptions();
                //options3.centerCrop();
                // options3.fitCenter();
                options3.circleCrop();
                Glide.with(this.getApplicationContext())
                        .load("https://unsplash.it/200/200?random&55")
                        .apply(options3)
                        .into(mImage);

自定義模組

在Glide3中定義了自定義模組之後,還必須在AndroidManifest.xml檔案中去註冊它才能生效,而在Glide 4中是不需要的,因為@GlideModule這個註解已經能夠讓Glide識別到這個自定義模組了(記得Build -> Rebuild Project)!

package tsou.com.simple.glide4test.glidemodule;

import android.content.Context;

import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.module.AppGlideModule;

/**
 * Created by Administrator on 2017/12/22 0022.
 * 在Glide3中需要在AndroidManifest.xml中配置
 * <p>
 * Glide4,只要有@GlideModule註解就好
 */
@GlideModule
public class MyAppGlideModule extends AppGlideModule {

    public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;
    public static final String DISK_CACHE_NAME = "huangxiaoguo";

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        super.applyOptions(context, builder);
        /**
         將所有Glide載入的圖片快取到SD卡上,
         預設硬碟快取大小都是250M,這裡改為500
         * */
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));

        /**
         ExternalCacheDiskCacheFactory的預設快取路徑
         是在sdcard/Android/data/包名/cache/image_manager_disk_cache目錄當中
         */
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));

        /**
         * 更改快取最總資料夾名稱
         *
         * 是在sdcard/Android/data/包名/cache/DISK_CACHE_NAME目錄當中
         */
        //此方法在Glide4已過時
        // builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
        builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
        /**
         * Glide也能使用ARGB_8888的圖片格式
         * 雖然圖片質量變好了,但同時記憶體開銷也會明顯增大
         */
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide, Registry registry) {
        super.registerComponents(context, glide, registry);
    }
}
  • 預設快取路徑

這裡寫圖片描述

  • 設定快取路徑為SD卡

這裡寫圖片描述

Glide3替換成Glide4(Generated API)

在自定義模組完成以後,就可以使用Glide的模式啦!請看:

//使用Generated API(類似Glide3用法)
                //使用GlideApp,首先確保你的程式碼中有一個自定義的模組,
                // 並且給它加上了@GlideModule註解,也就是自定義模組
                GlideApp.with(this.getApplicationContext())
                        .load(url)
                        .placeholder(R.drawable.ic_launcher_background)
                        .error(R.mipmap.load_error)
                        .skipMemoryCache(true)//清除快取
                        .diskCacheStrategy(DiskCacheStrategy.NONE)//表示既快取原始圖片,也快取轉換過後的圖片
                        .override(Target.SIZE_ORIGINAL)
                        .circleCrop()//切圓
                        .into(mImage);

把之前Glide替換成GlideApp,就可以使用Glide3的方式進行使用了!是不是很方便!

定製自己的API

定製自己的API需要藉助@GlideExtension和@GlideOption這兩個註解。建立一個我們自定義的擴充套件類

package tsou.com.simple.glide4test.glidemodule;

import com.bumptech.glide.annotation.GlideExtension;
import com.bumptech.glide.annotation.GlideOption;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;

import tsou.com.simple.glide4test.R;

/**
 * Created by Administrator on 2017/12/25 0025.
 */
@GlideExtension
public class MyGlideExtension {
    /**
     * 將這個類的建構函式宣告成private,這是必須要求的寫法
     */
    private MyGlideExtension() {
    }

    @GlideOption
    public static void myGlideConfiguration(RequestOptions options) {
        //佔位圖
        options.placeholder(R.drawable.ic_launcher_background);
        //錯誤圖片
        options.error(R.mipmap.load_error);
        //表示只快取原始圖片
        options.diskCacheStrategy(DiskCacheStrategy.DATA);
        //切圓
        options.circleCrop();
        //...等等所有的屬性
    }
}

使用自定義API方式

 GlideApp.with(this.getApplicationContext())
                        .load(url)
                        .myGlideConfiguration()//自定義API
                        .into(mImage);

這樣,我們就可以直接使用自己的API了,同時所有的Glide配置都在MyGlideExtension 進行配置,方便專案中的同意修改!

到此Glide4的基本使用到此結束,希望對你有所幫助!
同時歡迎大家的指教,謝謝!

Glide4的使用方式雖然和Glide3不同,但是主要的功能卻和Glide3一樣,其他關於Glide4的功能在這裡沒有詳細給出,需要了解,請看: