Glide開源庫的使用

關(guān)于Glide

Glide是一款快速高效的Android圖像加載庫,注重于平滑的滾動油湖。Glide提供了易用的API讶迁,高性能、可擴展的圖片解碼管道(decode pipeline)恃慧,以及自動的資源池技術(shù)园蝠。

Glide 支持拉取,解碼和展示視頻快照痢士,圖片彪薛,和GIF動畫茂装。

Glide默認(rèn)使用的是HttpUrlConnection類下載圖片,但是也提供了與Google Volley和Square OkHttp快速集成的工具庫善延。

雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動盡可能地變得更快少态、更平滑,但實際上易遣,Glide幾乎能滿足你對遠(yuǎn)程圖片的拉取/縮放/顯示的一切需求彼妻。

Android SDK 要求

  • 使用 Glide 最小SDK版本(minSdkVersion)必須是API 14 (Ice Cream Sandwich) 或更高。
  • 使用Glide 編譯SDK版本(compileSdkVersion)必須是 API 27 (Oreo MR1) 或更高版本

Android Studio在線依賴

Glide支持在線依賴豆茫,目前最新版本是4.8.0侨歉,在build.gradle文件中dependencies屬性下增加兩行代碼。

dependencies {
    compile 'com.github.bumptech.glide:glide:4.8.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

權(quán)限

Glide一般情況下需要向AndroidManifest.xml文件中添加以下四個權(quán)限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • INTERNET:訪問網(wǎng)絡(luò)權(quán)限揩魂,有了這個權(quán)限才能從網(wǎng)絡(luò)上在線加載圖片幽邓。
  • ACCESS_NETWORK_STATE:訪問網(wǎng)絡(luò)狀態(tài)權(quán)限,不是必須的權(quán)限火脉,但是加上可以處理片狀網(wǎng)絡(luò)(flaky network) 和飛行模式牵舵。
  • READ_EXTERNAL_STORAGE:閱讀本地SD卡權(quán)限,從本地文件夾或 DCIM 或圖庫中加載圖片倦挂。
  • WRITE_EXTERNAL_STORAGE:將Glide的緩存存儲到SD卡上需要這個權(quán)限畸颅。

簡單使用

Glide加載圖片非常簡單,只需要一行代碼:

Glide.with(this)
    .load("https://github.com/ansen666/images/blob/master/" +
      "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
    .into(imageView);

上面這行代碼先后調(diào)用了三個方法:

  • with 傳入Activity或者Fragment實例方援,這里我們直接用this
  • load 圖片url
  • into 圖片加載完成之后顯示在這個控件上

當(dāng)然我們還可以取消加載没炒,但是一般情況不需要使用,因為Glide.with()方法中傳入的Activity或者Fragment實例銷毀時肯骇,Glide 會自動取消加載并回收資源窥浪。

后臺線程

其實Glide是可以通過后臺線程獲取Bitmap的,在后臺線程中直接使用submit(int, int)方法笛丙。

new Thread(runnable).start();

//在后臺線程中獲取bitmap
Runnable runnable=new Runnable() {
    @Override
    public void run() {
        FutureTarget<Bitmap> futureTarget =
                Glide.with(MainActivity.this)
                        .asBitmap()
                        .load("https://github.com/ansen666/images/blob/master/" +
                                "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
                        .submit();
        try {
            Bitmap bitmap = futureTarget.get();
            Log.i("ansen","獲取的bitmap:"+bitmap);

            //當(dāng)上面獲取的bitmap使用完畢時漾脂,調(diào)用clear方法釋放資源
            Glide.with(MainActivity.this).clear(futureTarget);
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

首先新建一個線程,跟前面的加載圖片不同的是我們調(diào)用了submit方法胚鸯,這個方法可以傳入一個寬高也可以不傳骨稿,同時返回FutureTarget對象,在調(diào)用get方法獲取我們需要的Bitmap姜钳,當(dāng)我們獲取的bitmap使用完畢時坦冠,記得調(diào)用clear方法釋放資源。

futureTarget.get方法會拋出異常哥桥,需要用try catch捕捉辙浑。

當(dāng)然,如果你不想開一個線程獲取Bitmap也是可以的拟糕,可以通過主線程異步獲取Bitmap方式判呕。

Glide.with(this)
    .asBitmap()
    .load("https://github.com/ansen666/images/blob/master/" +
            "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
    .into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
            //這里我們拿到回掉回來的bitmap倦踢,可以加載到我們想使用到的地方
            imageView.setImageBitmap(resource);
        }
    
        @Override
        public void onLoadFailed(@Nullable Drawable errorDrawable) {
            super.onLoadFailed(errorDrawable);
            Log.i("ansen", "圖片加載失敗");
        }
    });

從上述代碼中可以看到,into方法傳入的是一個SimpleTarget對象侠草,這個類是一個抽象類辱挥,這里我們使用內(nèi)部類方式實現(xiàn),重寫這個類的兩個方法(onResourceReady和onLoadFailed)边涕,onResourceReady加載圖片成功會回調(diào)晤碘,同時把Bitmap當(dāng)參數(shù)返回。onLoadFailed方法加載圖片失敗回調(diào)功蜓。

load方法傳入其他參數(shù)

如果你以為Glide只能加載網(wǎng)絡(luò)圖片的話园爷,那就不會有這么多人使用了,他還能支持Resources資源霞赫、File資源腮介、Uri資源、字節(jié)數(shù)組等方式加載端衰。

Glide.with(context).load(resourceId).into(imageView);
Glide.with(context).load(file).into(imageView);
Glide.with(context).load(uri).into(imageView);
Glide.with(context).load(byte[]).into(imageView);

加載gif圖片

Glide支持直接加載Gif圖片,使用也很簡單,就多調(diào)用一個asGif方法而已

Glide.with(this).asGif().load(R.mipmap.result).into(ivGif);

Generated API

Glide v4 使用 注解處理器 (Annotation Processor) 來生成出一個 API甘改,在 Application 模塊中可使用該流式 API 一次性調(diào)用到 RequestBuilder旅东, RequestOptions 和集成庫中所有的選項。

Generated API 模式的設(shè)計出于以下兩個目的:

  • 集成庫可以為 Generated API 擴展自定義選項十艾。
  • 在 Application 模塊中可將常用的選項組打包成一個選項在 Generated API 中使用
開始使用

Generated API 目前僅可以在 Application 模塊內(nèi)使用抵代。這一限制可以讓我們僅持有一份 Generated API,而不是各個 Library 和 Application 中均有自己定義出來的 Generated API忘嫉。

這一做法會讓 Generated API 的調(diào)用更簡單荤牍,并確保 Application 模塊中 Generated API 調(diào)用的選項在各處行為一致。這一限制在接下來的版本中也許會被取消(以實驗性或其他的方式給出)庆冕。

在app模塊中使用Generated API康吵,需要兩個步驟:

1.添加 Glide 注解處理器的依賴

dependencies {
  annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

我們文章開頭講解Android Studio在線依賴的時候就有包含這個,所以這個步驟可以忽略访递。

在 Application 模塊中包含一個 AppGlideModule 的實現(xiàn)
我們新建一個類晦嵌,類名叫MyAppGlideModule,名字可以隨便起拷姿,但是必須要繼承自AppGlideModule惭载,以及給類加上@GlideModule注解標(biāo)記。

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

/**
 * @author ansen
 * @create time 2018/10/28
 */
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {
}

Android Studio 在大多數(shù)時候都可以正確地處理注解處理器 (annotation processor) 和 generated API响巢。然而描滔,當(dāng)你第一次添加 AppGlideModule 時,需要重新 (rebuild) 一下項目踪古。不然使用GlideApp類時會提示找不到這個類含长。

使用Generated API

Generated API 默認(rèn)名為 GlideApp 券腔,使用起來跟之前Glide方式一樣,只需要把Glide替換成GlideApp茎芋,例如加載在線圖片顯示颅眶,代碼如下:

//Generated API 使用方式
GlideApp.with(this)
    .load("https://github.com/ansen666/images/blob/master/" +
            "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
    .into(imageView);

與 Glide.with() 不同,諸如 fitCenter() 和 placeholder() 等選項在 Builder 中直接可用田弥,并不需要再傳入單獨的 RequestOptions 對象涛酗。

說點廢話

今天Glide就給大家介紹到這里了,接下來我還會講解Glide占位符偷厦、動畫商叹、Target、配置只泼、緩存剖笙、集成Okhttp等一系列文章,希望大家持續(xù)關(guān)注请唱,新的一個禮拜又開始了弥咪,祝大家工作愉快。

源碼下載:

https://github.com/ansen666/GlideTest

如果你想第一時間看我的后期文章十绑,掃碼關(guān)注公眾號聚至,長期推送Android開發(fā)文章、最新動態(tài)本橙、開源項目扳躬,讓你各種漲姿勢。

      Android開發(fā)666 - 安卓開發(fā)技術(shù)分享
             掃描二維碼加關(guān)注
qrcode_for_gh_14a89f21bd5e_258.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甚亭,一起剝皮案震驚了整個濱河市贷币,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亏狰,老刑警劉巖役纹,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骚揍,居然都是意外死亡字管,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門信不,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲叔,“玉大人,你說我怎么就攤上這事。” “怎么了茶敏?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵玉工,是天一觀的道長丁逝。 經(jīng)常有香客問我汁胆,道長,這世上最難降的妖魔是什么霜幼? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任嫩码,我火速辦了婚禮,結(jié)果婚禮上罪既,老公的妹妹穿的比我還像新娘铸题。我一直安慰自己,他們只是感情好琢感,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布丢间。 她就那樣靜靜地躺著,像睡著了一般驹针。 火紅的嫁衣襯著肌膚如雪烘挫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天柬甥,我揣著相機與錄音饮六,去河邊找鬼。 笑死苛蒲,一個胖子當(dāng)著我的面吹牛喜滨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撤防,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棒口!你這毒婦竟也來了寄月?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤无牵,失蹤者是張志新(化名)和其女友劉穎漾肮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茎毁,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡克懊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了七蜘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭溉。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橡卤,靈堂內(nèi)的尸體忽然破棺而出扮念,到底是詐尸還是另有隱情,我是刑警寧澤碧库,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布柜与,位于F島的核電站巧勤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弄匕。R本人自食惡果不足惜颅悉,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迁匠。 院中可真熱鬧剩瓶,春花似錦、人聲如沸柒瓣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芙贫。三九已至搂鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磺平,已是汗流浹背魂仍。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拣挪,地道東北人擦酌。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像菠劝,于是被迫代替她去往敵國和親赊舶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容