Glide知識(shí)點(diǎn)梳理

Android常用圖片庫:Glide、Fresco

  1. 圖片庫比較

Fresco:Facebook出品,
功能強(qiáng)大,使用較復(fù)雜,對(duì)圖片的轉(zhuǎn)換不好處理,占用內(nèi)存較低,能有效避免圖片OOM。體積偏大
Glide和Picasso用法類似,Glide更流暢速度更快,功能更強(qiáng)大,但庫相比Picasso更大,方法數(shù)更多。細(xì)節(jié)可參考 http://blog.csdn.net/richiezhu/article/details/46968569

  1. 今天來學(xué)習(xí)下Glide (3.7.0版Glide)

第一步:怎么用?關(guān)鍵三步走:先with(),再load(),最后into()。熟記這三步,你就已經(jīng)入門Glide了

// with()可接收Context、Activity 或 Fragment參數(shù),也可傳入全局Application
// 傳入實(shí)例會(huì)決定Glide加載圖片的生命周期,若傳入的是Activity或Fragment實(shí)例
// 那么當(dāng)這個(gè)Activity或Fragment被銷毀時(shí),圖片加載也會(huì)停止。
// 若傳入的是Application,那么只有當(dāng)應(yīng)用程序被殺掉的時(shí)候,圖片加載才會(huì)停止
Glide.with(mContext)
// Glide支持加載各種圖片資源,包括網(wǎng)絡(luò)圖片、本地圖片、應(yīng)用資源、二進(jìn)制流、Uri對(duì)象等等
        .load(url)
        // 禁用內(nèi)存緩存
        .skipMemoryCache(true)
        // Glide可自動(dòng)判斷加載Bitmap或gif。
        // .asBitmap()
        .asGif()
        .placeholder(R.drawable.loading_spinner)
        // 圖片加載失敗占位圖
        .error(R.drawable.net_error)
        // 禁用緩存
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        // 調(diào)用crossFade方法在加載圖片的過程中會(huì)有動(dòng)畫效果,體驗(yàn)更好
        .crossFade()
        .into(mTargetView);
        
// 加載本地圖片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);

// 加載應(yīng)用資源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);

// 加載二進(jìn)制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);

// 加載Uri對(duì)象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
 

第二步:還是怎么用?如何自定義Target(ViewTarget和SimpleTarget)

SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        // TODO 
    }
};

public void loadImage(View view) {
    Glide.with(this)
         .load(url)
         .into(simpleTarget);
}


第三步:還是怎么用?Glide回調(diào)與監(jiān)聽(例如:當(dāng)下載圖片單獨(dú)處理處理時(shí))

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

第四步:如何展示下載后處理成圓角,圓形,模糊等圖片

Glide.with(this)
     .load(url)
     .transform(...)
     .into(imageView);

這里附上一個(gè)圖片變換庫:https://github.com/wasabeef/glide-transformations

第五步:如何自定義Glide相關(guān)配置,以及替換網(wǎng)絡(luò)請(qǐng)求庫

public class MyGlideModule implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 這是自定義圖片緩存位置
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }

}

// 最后在AndroidManifest.xml文件里面添加
<meta-data
    android:name="com.yourpackagename.MyGlideMoudle"
    android:value="GlideModule" />

老規(guī)矩,參考鏈接:https://blog.csdn.net/guolin_blog/article/details/78179422

第六步:Glide如何實(shí)現(xiàn)帶進(jìn)度條的效果

參考鏈接:https://blog.csdn.net/guolin_blog/article/details/78357251

第七步:了解Glide的一些原理和細(xì)節(jié)

  1. Glide如何在當(dāng)前頁面退出時(shí),中止當(dāng)前頁面圖片下載的?

答案是通過在當(dāng)前頁面創(chuàng)建一個(gè)隱藏的Fragment來獲知頁面是否退出的

  1. Glide緩存有幾種策略?

內(nèi)存緩存外加磁盤緩存

  1. Glide如何預(yù)加載圖片
Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .preload();

第八步:使用踩過的坑

  1. Glide可以加載圖片和gif動(dòng)畫,如果想將gif加載為一張靜態(tài)圖片,可以調(diào)用。asBitmap()
  2. 當(dāng)列表在滑動(dòng)的時(shí)候,調(diào)用pauseRequests()取消請(qǐng)求,滑動(dòng)停止時(shí),調(diào)用resumeRequests()恢復(fù)請(qǐng)求。當(dāng)你想清除掉所有的圖片加載請(qǐng)求時(shí),可以調(diào)用Glide.clear()
  3. Glide有時(shí)加載不出來圖片有可能是因?yàn)閳D片緩存機(jī)制的問題,可以調(diào)用.override(int, int)方法加載并緩存指定大小圖片
  4. 使用Glide加載圓角圖片使用方法如下
Glide.with(context)
.load(pe.img_url)
// 如果要實(shí)現(xiàn)更復(fù)雜的圖片變換則要重寫B(tài)itmapTransformation這個(gè)類,或者使用glide-transformations這個(gè)glide的增強(qiáng)庫
// bitmapTransform方法傳入的參數(shù)為BitmapTransformation的對(duì)象
// 實(shí)現(xiàn)自己的圖片轉(zhuǎn)換需要繼承這個(gè)類,并重寫它的transform方法
// 加載圓形的圖片使用CropCircleTransformation這個(gè)類
// 在加載圓角圖片的過程中,CropTransformation,使用這個(gè)類除了實(shí)現(xiàn)圓角圖片之外,可以指定顯示圖片的部位,比如上半部分或者中間部分等
.bitmapTransform(new RoundTrans(context, 5))
.into(mTargetView);

  1. 如果使用了其他的一些自定義的圓形Imageview,而你又剛好設(shè)置了占位的話,那么可能出現(xiàn)有的圖片第一次加載的時(shí)候只顯示占位圖,第二次才顯示正常的圖片
  1. 解決方案一: 不設(shè)置占位;
  2. 使用Glide的Transformation API自定義圓形Bitmap的轉(zhuǎn)換。這里是一個(gè)已有的例子;http://stackoverflow.com/questions/25278821/how-do-rounded-image-with-glide-library
  3. 使用下面的代碼加載圖片:
Glide.with(mContext)
    .load(url) 
    .placeholder(R.drawable.loading_spinner)
    .into(new SimpleTarget<Bitmap>(width, height) {
        @Override 
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
            // setImageBitmap(bitmap) on CircleImageView 
        } 
    };
  1. 在使用Glide給imageview加載圖片的過程用不能使用view的setTag方法,否則會(huì)出現(xiàn)問題,如果要使用最好使用setTag(int,object)方法

參考鏈接:

  1. https://blog.csdn.net/guolin_blog/article/details/53759439
  2. Glide的更詳細(xì)的用法和介紹可以參考 http://mrfu.me/2016/02/27/Glide_Getting_Started/
  3. https://iwatching.github.io/blog/%E6%A1%86%E6%9E%B6/2018/05/12/frame4.html
  4. https://github.com/bumptech/glide
  5. https://blog.csdn.net/guolin_blog/article/details/78582548 (愛走捷徑的直接看這篇足以)
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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