Android圖片加載框架Glide源碼解析(一)

Glide的基本使用

說到現(xiàn)下Android開發(fā)中熱門的第三方框架,就會談到圖片加載框架Glide這個框架,在大部分的APP開發(fā)中都會有Glide的影子,為什么Glide被廣泛使用呢?Glide官方文檔是這樣描述的:

Glide是一個快速高效的Android圖片加載庫,注重于平滑的滾動。Glide提供了易用的API,高性能、可擴(kuò)展的圖片解碼管道(decode pipeline),以及自動的資源池技術(shù)。
Glide 支持拉取,解碼和展示視頻快照,圖片,和GIF動畫。Glide的Api是如此的靈活,開發(fā)者甚至可以插入和替換成自己喜愛的任何網(wǎng)絡(luò)棧。默認(rèn)情況下,Glide使用的是一個定制化的基于HttpUrlConnection的棧,但同時也提供了與Google Volley和Square OkHttp快速集成的工具庫。
雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動盡可能地變得更快、更平滑,但實(shí)際上,Glide幾乎能滿足你對遠(yuǎn)程圖片的拉取/縮放/顯示的一切需求。

那么Glide在我們開發(fā)中究竟是怎么樣使用的呢?

1、使用要求

Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 或更高。
Compile Sdk Version - Glide 必須使用 API 27或更高版本的 SDK 來編譯。
Support Library Version - Glide 使用的支持庫版本為 27。

2、Glide庫的引入

Android studio中Gradle配置:
在root的build.gradle中增加下面配置,從maven倉庫中引入:

repositories {
     mavenCentral()
     maven { url 'https://maven.google.com' }
}

并在app的build.gradle中增加對glide的依賴,配置如下:

dependencies {
     implementation 'com.github.bumptech.glide:glide:4.7.1'
}

注: 如果你需要使用不同的支持庫版本,你需要在你的 build.gradle 文件里去從 Glide 的依賴中去除 "com.android.support",例如:

dependencies {
    implementation ("com.github.bumptech.glide:glide:4.7.1") {
        exclude group: "com.android.support"
    }
    implementation "com.android.support:support-fragment:26.1.0"
}

3、Glide加載圖片基本方式

特別說明:Glide 現(xiàn)在最新版是v4,與之前的v3版本在使用上有比較大的差異,主要改動是Glide庫處理選項(xiàng)(centerCrop(), placeholder() 等)的方式,V4版本增加RequestOptions類處理選項(xiàng)。因此在本文中主要V4版本的用法。

1.簡單常用的方式

使用Glide加載圖片很簡單,一行代碼足以:

String myUrl = "http://img.zcool.cn/community/0117e2571b8b246ac72538120dd8a4.jpg@1280w_1l_2o_100sh.jpg";
ImageView imageView = (ImageView)findViewById(R.id.iv_background);
Glide.with(fragment)
.load(myUrl)    //myurl表示圖片的url地址
.into(imageView);//imageView表示加載的圖片要顯示在imageView上

既然有加載,就有相應(yīng)的取消加載方式,同樣很簡單:

Glide.with(context).clear(imageView); // 取消加載圖片

注:盡管及時的取消不必要的加載是很好的實(shí)踐,但不是必須的操作。因?yàn)樵趯?shí)際中的Activity、Fragment在實(shí)例銷毀的時候,Glide自身會自動取消加載。

2.使用注解處理器的方式

這種方式時使用注解的方式,實(shí)現(xiàn)的。在使用注解方式,務(wù)必要在App的build.gradle的dependencies中引入下:

annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

在Application模塊中,通過創(chuàng)建一個帶有@GlideModule注解,并繼承AppGlideModule的類。這個類能夠生成一個流式API,內(nèi)嵌了多種選項(xiàng),如下:

package com.example.myapp;

import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}

通過編譯就好生成一個默認(rèn)名稱為GlideApp的類,在Application中就可以按下方式使用來完成加載圖片功能:

RequestOptions options = new RequestOptions();
options.placeholder(placeholder)
            .fitCenter();
GlideApp.with(fragment)
   .load(myUrl)
   .apply(options)
   .into(imageView);

4、Glide的其他設(shè)置

1.占位圖設(shè)置

在實(shí)際圖片的加載過程中,會經(jīng)常出現(xiàn)圖片加載緩慢的問題,這個時候需要展示該圖片的位置就顯示了一片空白,體驗(yàn)效果很不友好,因此Glide提供了占位圖,可以預(yù)設(shè)置一個默認(rèn)的圖片,在實(shí)際的圖片未加載完成時,顯示這個默認(rèn)圖片,提高用戶體驗(yàn)。使用方式如下:

//通過使用RequestOptions去設(shè)置占位圖及加載錯誤時顯示圖
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_default) //這里設(shè)置占位圖
            .error(R.drawable.ic_error) ;//這里設(shè)置圖片加載錯誤時要顯示的圖
Glide.with(activity)
    .load(url)
    .apply(options)            
    .into(imageView);

placeholder()和error()參數(shù)都是int類型,即使用本地資源對應(yīng)的id,可能主要考慮到加載速度快。

2.縮略圖

設(shè)置縮略圖,與設(shè)置占位圖有所不同,可以設(shè)置網(wǎng)絡(luò)資源。使用如下:

Glide.with(activity)
      .load(url)
      .thumbnail(0.4f)
      .into(imageView);

意思很簡單,就是展示原來0.4倍大小的一個縮略圖。

3.動畫開關(guān)

從Glide 3.7版本開始,默認(rèn)開啟了動畫開關(guān)。如需關(guān)閉動畫可調(diào)用dontAnimate。
但是在V4版本之后動畫設(shè)置移入到TransitionOptions中,有如下三種:
GenericTransitionOptions,DrawableTransitionOptionsBitmapTransitionOptions

Glide.with(this)
    .load(url)
    .transition(DrawableTransitionOptions.withCrossFade())            //淡入淡出動畫
    .apply(RequestOptions.noAnimation())        //關(guān)閉動畫
    .into(imageView);

默認(rèn)情況下動畫時間是300ms。

4.圖片緩存

內(nèi)存緩存
為了實(shí)現(xiàn)圖片快速加載,Glide幫我們實(shí)現(xiàn)了圖片緩存功能,如果不需要使用則可調(diào)用skipMemoryCache(true)告訴Glide跳過內(nèi)存緩存。
注意:該方法之對內(nèi)存緩存有影響。

磁盤緩存
由于手機(jī)內(nèi)存使用有限,內(nèi)存資源比較珍貴,不可能將所有的圖片資源緩存的內(nèi)存中,因此為了提高加載效率,Glide還采用了磁盤緩存的方式。
磁盤緩存也是默認(rèn)開啟的,當(dāng)然也可以關(guān)閉,方式如下:

Glide.with(activity)
    .load(url)
    .apply(RequestOptions.skipMemoryCacheOf(true)    //取消內(nèi)存緩存
        .diskCacheStrategy(DiskCacheStrategy.NONE))    //取消圖片磁盤緩存    
    .into(imageView);

緩存設(shè)置同樣式通過RequestOptions進(jìn)行設(shè)置的。

5.顯示gif和video

Glide可以加載和顯示一個gif,使用方式很簡單,如下:

Glide.with(activity)
      .asGif()
      .load(url)
      .into(imageView);

注:這里如果加載的不是一個gif動畫,將無法顯示,所以asGif慎用。
Glide加載video只能針對本地的視頻。

6.其他功能

Glide還有其他的功能,比如自已自定義緩存策略、設(shè)置優(yōu)先級等。這里就不多說了??梢钥纯碦equestOption類。

5、總結(jié)

1.針對兩種方式的使用,可根據(jù)個人喜好自行選擇;

2.Glide使用時,對url進(jìn)行空檢查并不是必須的,如果url為空,則會清空View的內(nèi)容或者使用設(shè)置的默認(rèn)圖片資源;

3.使用在列表(ListView、RecyclerView等)中由于View的復(fù)用,因此針對在之前的位置上,用 Glide 進(jìn)行過加載操作的情況,那么在新的位置上要重新into(view)操作,或調(diào)用clear()API 停止 Glide 的工作。否則可能會出現(xiàn)這樣一個情況:你已經(jīng)對一個view設(shè)置好了Drawable,但該 view 在之前的位置上使用 Glide 進(jìn)行過加載圖片的操作,在Glide 加載完畢后可能會將這個view改回成原來的內(nèi)容,即沒有設(shè)置成功問題。

至此,Glide開源框架的使用就是這么的簡單,到這里就講完了。
后面會從源碼的角度對Glide進(jìn)行分析。

本文參考文檔:
Glide官方文檔
Glide源碼


Android圖片加載框架Glide源碼解析(一)
Android圖片加載框架Glide源碼解析(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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