版權聲明:git
本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。github
每週會統一更新到掘金,若是喜歡,可關注公衆號獲取最新文章。緩存
未經容許,不得轉載。網絡
Glide 如今大範圍的使用在各類商業項目中,而對於通常而言, Glide 的 Api 封裝的很是好,多數狀況下咱們只須要使用它,在使用的基礎之上,才考慮如何瞭解它。ide
本文的目的是讓你如何快速上手 Glide 3.x ,來快速投入開發,本文力求作到快速上手,因此只講在上手的時候,你須要關注的。優化
本文最開始只是想作一個簡短的快速上手的教程,可是在寫的過程當中,越寫越長。可是內容都是我以爲必需要講清楚的,因此若是想要快速上手 Glide,請耐心閱讀。動畫
既然要用到 Glide ,那就先簡單的介紹一下 Glide 。ui
Glide 簡單來講就是一個 Google 主導的圖片加載開源庫。它穩定、速度快、可自適應圖片尺寸、支持衆多格式、支持加載不一樣來源的圖片、內存和磁盤緩存的優化。這些,都是它的好處(固然不止這些),這裏就不一一細說了。this
你只須要知道,它是一款主流的圖片加載庫便可,它包含了你能想到的全部功能,而且支持擴展。線程
Glide 的 Github 地址:
雖然它已經到 v4.x 了,可是本文仍是就最經常使用的 v3.8.0 版本的集成,作一個簡單的介紹。
集成的方式有多種,能夠直接引用 jar 包,也可使用 Maven,這裏仍是使用主流的 Gradle 來集成它。
這裏使用的另一個優秀的網絡請求庫 OkHttp 來作支持。
Glide 是支持鏈式調用的,可是它不是簡單的在每一個方法中,返回 this ,它更復雜一些,後面會講到,因此一般使用它只須要使用一條語句便可。
前面的例子能夠看到,實際上 Glide 的鏈式調用,它的主要方法就是三個,先來簡單看看他們.
這三個主要的部分,貫穿了 Glide 使用的主要重點內容,接下來讓咱們好好看看他們。
前面提到,這裏的 with()
方法用於給 Glide 傳遞一個 Context 對象,它能夠支持多種 Context。
舉個例子:當使用 with(Activity
) 的時候,若是此時當前 Activity 被關閉掉了,那麼 Glide 就會將這個 Activity 下全部的圖片請求中止掉。也就是實現了 Glide 和 頁面聲明週期的綁定,來優化 Glide 自身的請求策略。
因此,在使用 Glide 的時候,儘可能使用當前頁面的 Activity ,而非直接傳遞一個 Context 進去。儘可能小的選擇 Context 的範圍,他們的推薦優先級爲:
Fragment > Activity > Context
load()
方法,就是去指定一個待加載的資源,它支持不少格式和資源種類。例如:網絡地址、本地文件、Drawable 等,它都是能夠作到很好的加載的。
load()
方法,並非在 Glide 中,前面也提到 with()
會返回一個 RequestManager 對象,load()
方法在它內部實現。
load()
方法,支持的資源種類,能夠看到它方法的重載,基本上咱們能想到的,它都支持。
有意思的是 load()
方法,它返回的是另一個 DrawableTypeRequest 對象。
into()
方法,用於指定加載的圖片資源,最終給誰來使用。這個沒什麼好說的,加載的圖片,最終必定是用來顯示的,因此它須要指定一個使用圖片的對象。
into()
其實是 DrawableTypeRequest 中的方法,DrawableTypeRequest 是一個多層繼承的類,它實際上本身是沒有對 into()
方法的實現的,大部分實現都是在其父類 DrawableRequestBuilder 和 父類的父類 GenericRequestBuilder 中的,可是這並不影響咱們使用它。
into()
不僅是能夠接受一個 ImageView ,也能夠是一些其餘的什麼。這也很好理解,在項目內,也不只僅只有 ImageView 能夠用來顯示圖片,View 的 background 也是能夠用於顯示圖片的。
除了 ImageView 前面已經介紹過了,直接使用便可。剩下的後面會有講到。
既然 Glide 使用過程當中,最重要的三個方法已經介紹過了,他們是 Glide 能完成功能的基礎,接下來,就開始介紹 Glide 的使用細節,來見證 Glide 的強大。
本節介紹的 Glide 的使用細節,基本上都是與 load()
方法返回的 DrawableTypeRequest 對象進行操做,對其進行一些配置。
在圖片加載的過程當中,會經歷過多過程,例如:加載中、加載失敗等等,在這些過程當中,實際上是能夠爲暫時爲 ImageView 設置一個佔位的的,來定製加載中、加載失敗這種狀態的顯示效果。
Glide 定製的佔位圖,有三種:
fallback()
是無需指定的,由於
imageUri 是不可能爲
null 的。而其餘的,都會在不一樣的階段顯示出來,加載前會顯示
load_placeholder ,若是加載失敗了,會顯示
load_error 。
注意,不一樣狀態的佔位圖,其實是一種容錯的表現,因此只能用於加載一個『本地資源』,容許傳遞一個 @DrawableId 或者 Drawable 對象。
某些時候,由於圖片的尺寸和控件的尺寸,不必定能匹配,因此會對圖片的顯示效果,進行一些縮放,而大多數狀況下,這種默認的縮放策略,並非咱們想要的。
Glide 提供了一些方法來控制縮放的效果。
這兩個方法和 ImageView.setScaleType() 中傳遞的參數效果相似,就再也不一一贅述了。
如今基本上全部的圖片加載庫,都是遵守三級緩存的策略:網絡、磁盤、內存。Glide 也是如此,而且默認狀況下,爲了更好的體驗,這些緩存都是所有開啓的。
就 Glide 的緩存策略而言,其實咱們也是有辦法去調整的。
對於內存緩存而言,只有有或者沒有的狀況,因此 Glide 只提供了一個 skipMemoryCache()
方法,它能夠傳遞一個 Boolean 的值,用於指定是否跳過磁盤緩存,默認狀況下是 false ,表示須要內存緩存。
可是對於磁盤緩存,就會更復雜一些。Glide 爲了保證效率,實際上默認狀況下是會去緩存多種尺寸的圖片在磁盤上的,也就是說,對於同一個 Uri,若是你在不一樣尺寸的 ImageView 中使用到它了,默認狀況下,在你設備的磁盤上,也會有多張不一樣尺寸的圖片。這樣是爲了下次加載的時候,速度更快,無需再對原圖進行處理,是一種以空間換效率的策略。
而若是咱們須要對磁盤緩存進行調節,就須要使用 diskCacheStrategy()
方法來改變它,前面提到它是一種比較複雜的策略,因此沒法簡單的使用一個 Boolean 值就完成了。它須要傳遞一個 DiskCacheStrategy 的枚舉類型。
因此具體使用那種,就須要看當前加載的圖片屬於哪種了。
對於同一個頁面,若是須要在多個地方都加載線上圖片,必然會存在一個優先級的問題。例如:正常來講,背景圖是比其餘圖片優先級更高的圖片。
Glide 是能夠在加載中,對當前加載的圖片,調整加載的優先級的。須要使用 priority()
方法,它能夠接受一個 Priority 的枚舉類型,包含四種值:LOW(低)、HIGH(高)、NORMAL(普通)、IMMEDIATE(當即)。
能夠在咱們須要的時候,對其進行配置,可是它並不影響用 Glide 加載的圖片的顯示順序,只是用於 Glide 在加載圖片的時候一個優化請求的參數而已,並不影響最終顯示的順序。
Glide 在顯示圖片的時候,爲了讓顯示效果不那麼突兀,會以一種更柔和的方式去顯示,就會在加載的時候給一個動畫效果,它可使用 crossFade()
方法進行配置,若是不特殊處理,默認它是開啓的,而且自己默認動畫的時長是 300ms。
crossFade()
也是有多個重載的,主要是爲了指定動畫以及動畫的時長。若是有心,也能夠看看
crossFade()
的源碼,它實際上只是對 a
nimate()
方法的一個包裝而已,後面會講到。
crossFade()
的效果是默認開啓的,因此若是咱們不須要這樣的一個動畫效果,可使用
dontAnimate()
來禁用動畫效果。
crossFade()
方法並不能知足咱們的需求。若是對加載的動畫有特殊的定製須要,可使用更靈活的
animate()
方法來本身實現動畫。
animate()
支持多種格式的動畫的配置,對於動畫的效果,這裏就不一一講解了。
Glide 的一個很是棒的功能,就是能夠支持 Gif,而且使用起來和正常的想要加載一張網絡上的圖片,並無什麼區別。
可是有時候咱們須要對加載的 Gif 圖作一個檢查,例如校驗它是不是一個 Gif ,若是不是,則認爲是一次錯誤的加載。這個時候就可使用 asGif()
來進行校驗,若是當前加載的圖片不是一個正確的 Gif 格式,則會去顯示 error()
配置的圖片。
asBitmap()
方法標記便可。
只須要將 asGif()
替換成 asBitmap()
就餓能夠了,這裏再也不單獨提供示例了。
Glide 對 Gif 的支持以外,提示還對 Video 格式的文件也進行了支持。可是它和 Gif 顯示的效果不同的一點在於,它並不會去播放視頻文件,而只是將視頻文件的第一幀作爲一個圖片去顯示出來。若是依然想要播放一段視頻文件,使用 Glide 不是一個好注意,你應該使用 VideoView。
其次 Glide 對視頻的支持,僅限於本地視頻,並沒有法對網絡視頻進行支持。
若是有對 Glide 加載的圖片的結果進行監聽的,可使用 listener()
方法設置一個監聽器,它接收一個 RequestListener 的接口
onException()
中作處理。
須要注意的是,這兩個方法的返回值,最好都是 false,由於若是返回 true ,將表示你已經處理了此次的事件,而 Glide 將不會再作額外的處理。例如,若是 onException()
返回了 true 的話,在圖片加載失敗以後,error()
中設置的圖片,並不會被顯示,由於 Glide 認爲開發者已經在外部對這個錯誤進行了處理。
對於使用 Glide 加載的圖片,若是想要在其顯示以前,對其進行一些變換操做,例如,改變顏色、虛化、圓角子類的,都須要用到 transfrom()
方法,它主要用於支持在圖片顯示以前,自定義的變換效果。
變換有兩個方法:
變換這種操做,其實定製性很是的強,展開講就比較複雜了,你們只須要知道,Glide 是能夠對加載的圖片在顯示以前進行一些預處理的操做的,在具體使用的時候再回頭來看相關資料便可。
這裏推薦一個開源的庫,來支持大多數變換的效果。
Github 地址:
前面全部的例子中,into()
方法做爲 Glide 加載圖片流程的最後一個環節,它不只僅只能支持一個 ImageView。有時候咱們還須要給 View 中設置一個背景的須要,這個使用 Glide 也是能夠辦到的,可是就須要用到 into()
方法的其餘重載方法了。
若是咱們不關心圖片加載的用途,只是單純的須要加載一個 Bitmap 或者 Drawable ,就可使用 SimpleTarget 來處理。
再來看看 ViewTarget, 從名稱上能夠纔出來,它其實是想讓 Glide 加載一個圖片資源給某個 View 使用。它能夠解決有時候咱們顯示圖片的 View 並非一個 ImageView 的問題,也多是一個 View 的背景。
在 onResourceReady() 這個回調方法中,直接按咱們的須要使用 GlideDrawable 和 View 便可。
若是是須要在非 ImageView 的其餘 View 上使用圖片,推薦使用 ViewTarget 。它內部是會去計算 View 的尺寸,來優化緩存的圖片。和加載 ImageView 的效果是同樣的,若是使用 SimpleTarget 就須要考慮到 View 的尺寸問題了。
在使用 Target 的時候,還有一點須要額外注意的。
前面也提到,Glide 這次加載的圖片生命週期,會和 with() 傳遞進去的 Context 的生命週期進行綁定,因此使用 Target 加載圖片的時候,就須要額外注意了,若是不是和頁面綁定的圖片資源,可使用 ApplicationContext() ,避免當前頁面被銷燬以後,加載的請求也被中止了。
本文最開始只是想要作一個適合初學者快速上手的 Glide 使用手冊,可是越寫越長,讀到這裏相信你也能有所收穫,以後若是以爲有寫概念也須要初學者瞭解,會繼續補充。