Glide是一款快速高效的Android圖像加載庫,注重於平滑的滾動。Glide提供了易用的API,高性能、可擴展的圖片解碼管道(decode pipeline),以及自動的資源池技術。android
Glide 支持拉取,解碼和展現視頻快照,圖片,和GIF動畫。git
Glide默認使用的是HttpUrlConnection類下載圖片,可是也提供了與Google Volley和Square OkHttp快速集成的工具庫。github
雖然Glide 的主要目標是讓任何形式的圖片列表的滾動儘量地變得更快、更平滑,但實際上,Glide幾乎能知足你對遠程圖片的拉取/縮放/顯示的一切需求。api
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' }
Glide通常狀況下須要向AndroidManifest.xml文件中添加如下四個權限:android-studio
<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" />
Glide加載圖片很是簡單,只須要一行代碼:緩存
Glide.with(this) .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(imageView);
上面這行代碼前後調用了三個方法:網絡
固然咱們還能夠取消加載,可是通常狀況不須要使用,由於Glide.with()方法中傳入的Activity或者Fragment實例銷燬時,Glide 會自動取消加載並回收資源。app
其實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); //當上面獲取的bitmap使用完畢時,調用clear方法釋放資源 Glide.with(MainActivity.this).clear(futureTarget); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } };
首先新建一個線程,跟前面的加載圖片不一樣的是咱們調用了submit方法,這個方法能夠傳入一個寬高也能夠不傳,同時返回FutureTarget對象,在調用get方法獲取咱們須要的Bitmap,當咱們獲取的bitmap使用完畢時,記得調用clear方法釋放資源。
futureTarget.get方法會拋出異常,須要用try catch捕捉。
固然,若是你不想開一個線程獲取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對象,這個類是一個抽象類,這裏咱們使用內部類方式實現,重寫這個類的兩個方法(onResourceReady和onLoadFailed),onResourceReady加載圖片成功會回調,同時把Bitmap當參數返回。onLoadFailed方法加載圖片失敗回調。
若是你覺得Glide只能加載網絡圖片的話,那就不會有這麼多人使用了,他還能支持Resources資源、File資源、Uri資源、字節數組等方式加載。
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);
Glide支持直接加載Gif圖片,使用也很簡單,就多調用一個asGif方法而已
Glide.with(this).asGif().load(R.mipmap.result).into(ivGif);
Glide v4 使用 註解處理器 (Annotation Processor) 來生成出一個 API,在 Application 模塊中可以使用該流式 API 一次性調用到 RequestBuilder, RequestOptions 和集成庫中全部的選項。
Generated API 模式的設計出於如下兩個目的:
Generated API 目前僅能夠在 Application 模塊內使用。這一限制可讓咱們僅持有一份 Generated API,而不是各個 Library 和 Application 中均有本身定義出來的 Generated API。
這一作法會讓 Generated API 的調用更簡單,並確保 Application 模塊中 Generated API 調用的選項在各處行爲一致。這一限制在接下來的版本中也許會被取消(以實驗性或其餘的方式給出)。
在app模塊中使用Generated API,須要兩個步驟:
1.添加 Glide 註解處理器的依賴
dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
咱們文章開頭講解Android Studio在線依賴的時候就有包含這個,因此這個步驟能夠忽略。
在 Application 模塊中包含一個 AppGlideModule 的實現
咱們新建一個類,類名叫MyAppGlideModule,名字能夠隨便起,可是必需要繼承自AppGlideModule,以及給類加上@GlideModule註解標記。
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 在大多數時候均可以正確地處理註解處理器 (annotation processor) 和 generated API。然而,當你第一次添加 AppGlideModule 時,須要從新 (rebuild) 一下項目。否則使用GlideApp類時會提示找不到這個類。
Generated API 默認名爲 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等一系列文章,但願你們持續關注,新的一個禮拜又開始了,祝你們工做愉快。
源碼下載:
https://github.com/ansen666/GlideTest
若是你想第一時間看個人後期文章,掃碼關注公衆號,長期推送Android開發文章、最新動態、開源項目,讓你各類漲姿式。
Android開發666 - 安卓開發技術分享 掃描二維碼加關注