Glide 使用簡(jiǎn)單總結(jié)(整理郭霖Glide系列文章)


文中內(nèi)容整理自郭霖Glide系列文章
郭霖 Glide


Glide 使用簡(jiǎn)單總結(jié)

基本使用

  • 基本使用
Glide.with(this)
     .load(url)
     .into(imageView);
  • 添加占位圖
Glide.with(this)
     .load(url)
     .placeholder(本地圖片)
     .error(本地圖片)
     .into(imageView);
  • 強(qiáng)制轉(zhuǎn)換圖片格式(動(dòng)態(tài)gif圖與靜態(tài)bitmap)
// 強(qiáng)制靜態(tài)圖
Glide.with(this)
     .load(url)
     .asBitmap()
     .placeholder(本地圖片)
     .error(本地圖片)
     .into(imageView);

// 強(qiáng)制動(dòng)態(tài)圖(注意如果不是動(dòng)態(tài)圖,會(huì)報(bào)錯(cuò),但是添加了error()方法之后可以捕獲)
Glide.with(this)
     .load(url)
     .asGif()
     .placeholder(本地圖片)
     .error(本地圖片)
     .into(imageView);
  • 指定圖片大小(使用override方法)
Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .override(100, 100) // 可以傳入Target.SIZE_ORIGINAL表示原始圖片大小
     .into(imageView);

緩存

  • 內(nèi)存緩存(默認(rèn)開啟)
Glide.with(this)
     .load(url)
     .skipMemoryCache(true) // 傳入true則表示不使用內(nèi)存緩存
     .into(imageView);
  • 磁盤緩存(默認(rèn)使用的是DiskCacheStrategy.RESULT)

DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容。
DiskCacheStrategy.SOURCE: 表示只緩存原始圖片。
DiskCacheStrategy.RESULT: 表示只緩存轉(zhuǎn)換過后的圖片(默認(rèn)選項(xiàng))。
DiskCacheStrategy.ALL : 表示既緩存原始圖片,也緩存轉(zhuǎn)換過后的圖片。

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

引申使用

緩存使用key來進(jìn)行本地緩存查找,有時(shí)候會(huì)有這樣的情況,地址在變,但是其實(shí)圖片還是同一個(gè)圖片,例如七牛的圖片有時(shí)候可能會(huì)帶有一個(gè)token,像這樣http://url.com/image.jpg?token=d9caa6e02c990b0a, token可能會(huì)變,但是圖片還是同一個(gè)圖片,如果直接使用是無法使用緩存的。這個(gè)時(shí)候需要對(duì)glide的GlideUrl進(jìn)行一下改造。代碼如下:

public class MyGlideUrl extends GlideUrl {
    private String mUrl;
    public MyGlideUrl(String url) {
        super(url);
        mUrl = url;
    }
    /**
    * 關(guān)鍵就是這個(gè)getCacheKey, 在代碼里面將它的token給屏蔽掉即可,那么Glide在緩存時(shí)使
    * 用的key就是去掉token之后的key
    * /
    @Override
    public String getCacheKey() {
        return mUrl.replace(findTokenParam(), "");
    }
    private String findTokenParam() {
        String tokenParam = "";
        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
        if (tokenKeyIndex != -1) {
            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }
        return tokenParam;
    }
}

使用如下:

Glide.with(this)
     .load(new MyGlideUrl(url))  // 在這里將url改為使用MyGlideUrl
     .into(imageView);

回調(diào)與監(jiān)聽

  • Target

先看一下Target的繼承關(guān)系


Target 繼承關(guān)系

其中有兩個(gè)基本的Target

  1. SimpleTarget

單獨(dú)使用比較靈活,但是寫成代碼有點(diǎn)難看

  1. ViewTarget

直接配合View寫,將它添加到自定義View的內(nèi)部,使用的時(shí)候簡(jiǎn)練

  • SimpleTarget使用(比較簡(jiǎn)單,不多贅述)
// 此處的泛型可以是GlideDrawable或者Bitmap。
// 但是如果是Bitmap的話,調(diào)用的時(shí)候就需要添加asBitmap()方法
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        // TODO 在此處做一些其他需要做的事情
        imageView.setImageDrawable(resource);
    }
};

public void loadImage() {
    String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
    Glide.with(this)
         .load(url)
         .into(simpleTarget);
}
  • ViewTarget

用于配合View集成使用,直接寫到View的內(nèi)部,其他和SimpleTarget差不多,只是寫的位置不一樣

// 寫一個(gè)自定義View
public class MyLayout extends LinearLayout {
    
    // 定義一個(gè)ViewTarget, 注意泛型
    private ViewTarget<MyLayout, GlideDrawable> viewTarget; 

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        // 創(chuàng)建并重寫代碼,其實(shí)和SimpleTarget是一樣的
        viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
                MyLayout myLayout = getView();
                myLayout.setImageAsBackground(resource);
            }
        };
    }

    // 重要的是這個(gè)方法,使用Glide的時(shí)候需要調(diào)用這個(gè)方法來得到一個(gè)Target
    public ViewTarget<MyLayout, GlideDrawable> getTarget() {
        return viewTarget;
    }

    public void setImageAsBackground(GlideDrawable resource) {
        setBackground(resource);
    }
}

使用:

public void loadImage(MyLayout myLayout) {
        String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
        Glide.with(this)
             .load(url)
             .into(myLayout.getTarget()); // 就是這里調(diào)用
    }
  • preLoad

preLoad就是只加載,不顯示,意思即可以先將圖片緩存下來,在實(shí)際需要的時(shí)候再調(diào)用,那么就會(huì)從內(nèi)存或者磁盤里面進(jìn)行加載,這樣速度快

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE) // 配合使用SOURCE
     .preload();
Glide.with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target,
                    boolean isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model,
                    Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    return false;
                }
            })
            .into(imageView);

圖片變換

  • 基本變換

默認(rèn)的圖片變換是fitCenter,可能直接使用override進(jìn)行大小指定,這樣圖片會(huì)按指定的大小進(jìn)行加載顯示,也可以使用圖片變換,也可以兩個(gè)同時(shí)使用

Glide.with(this)
     .load(url)
     .dontTransform() // 禁用變換
     .into(imageView);

Glide.with(this)
     .load(url)
     .transform(...) // 使用變換
     .into(imageView);

// 下面兩個(gè)只是對(duì)transform的一個(gè)封裝
Glide.with(this)
     .load(url)
     .centerCrop() // centerCrop
     .into(imageView);

Glide.with(this)
     .load(url)
     .fitCenter() // fitCenter
     .into(imageView);
  • 自定義變換

重寫B(tài)itmapTransform類(略),調(diào)用時(shí)將重寫的BitmapTransform加到transform方法里面

  • 使用變換庫

Github Glide 變換庫或者直接compile

dependencies {
    compile 'jp.wasabeef:glide-transformations:2.0.2'
}

可以多個(gè)同時(shí)使用

Glide.with(this)
     .load(url)
     .bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
     .into(imageView);

Glide的自定義模塊功能(略,參考郭霖 Glide 自定義模塊

  • 自定義配置,緩存策略等
  • 自定義組件,請(qǐng)求框架等
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容