Glide工程依賴
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
}
Glide使用需要Support Library v4依賴支持
Glide基本使用
Glide.with()不僅可以接受Context,還可以接受Activity和Fragment,Glide會從Activity和Fragment中獲取Context,在使用時,盡可能的將Activity或Fragment傳遞給Glide(好處:圖片加載會和Activity/Fragment的生命周期保持一致,比如Paused狀態(tài)在暫停加載,在Resumed的時候又自動重新加載)
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
默認Bitmap格式是RGB_565
Clide默認使用Bitmap格式是RGB_565加載圖片,比ARGB_8888格式的內(nèi)存開銷要小一半,但同時會帶來圖片顯示質(zhì)量下降,可以通過創(chuàng)建一個新的GlideModule將Bitmap格式轉(zhuǎn)換到ARGB_8888,提升圖片質(zhì)量
-
自定義GlideModule
public class GlideConfiguration implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // Apply options to the builder here. builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { // register ModelLoaders here. } }
-
在AndroidManifest.xml中將GlideModule定義為meta-data
<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration" android:value="GlideModule"/>
磁盤緩存
Glide會為每種大小的ImageView緩存一次。盡管一張圖片已經(jīng)緩存了一次,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調(diào)整成新尺寸的大小,然后將這個尺寸的也緩存起來。具體說來就是:假如在第一個頁面有一個200x200的ImageView,在第二個頁面有一個100x100的ImageView,這兩個ImageView本來是要顯示同一張圖片,卻需要下載兩次;可以通過改變Glide的行為讓它即加載全尺寸圖片,也加載不同尺寸圖片
Glide.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
下次在任何ImageView中加載圖片的時候,全尺寸的圖片將從緩存中取出,重新調(diào)整大小,然后緩存。
Clide常用屬性
-
占位符使用
如果要使用Gilde顯示一張網(wǎng)絡(luò)上的圖片,當網(wǎng)絡(luò)不好的時候加載圖片可能需要很長的時間,一個空的ImageViewzai 在任何UI上都不好看,這就有了占位符,在圖片加載完成以前顯示占位符。
Glide 的流式接口讓這個變得非常容易的去做到!只需要調(diào)用 .placeHolder() 用一個 drawable(resource) 引用,Glide 將會顯示它作為一個占位符,直到你的實際圖片準備好。
Glide .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .placeholder(R.mipmap.ic_launcher) // can also be a drawable .into(imageViewPlaceholder);
load():Glide接受所有的值(可以是本地的資源也可以是網(wǎng)絡(luò)上的資源)
-
錯誤占位符
可以從字面的意思來理解什么是錯誤的占位符,也就是我們的APP從一個網(wǎng)站去加載一張圖片的時候,返回時告訴我們獲取失敗,這時就用到了錯誤占位符來顯示圖片,如果想進行一些其他操作,可自己決定。
調(diào)用 Glide 的流式接口和之前顯示預(yù)加載占位符的例子是相同的,不同的是調(diào)用了名為 error() 的函數(shù)。
Glide .with(context) .load("http://futurestud.io/non_existing_image.png") .placeholder(R.mipmap.ic_launcher) //添加占位圖片 .error(R.mipmap.future_studio_launcher) //添加獲取網(wǎng)絡(luò)圖片失敗占位圖片 .into(imageViewError);
crossFade()通過該方法Glide會默認提供一個平滑(漸入漸出)動畫用于加載圖片,crossFade() 方法還有另外重載方法.crossFade(intduration)。如果你想要去減慢(或加快)動畫,隨時可以傳一個毫秒的時間給這個方法。動畫默認的持續(xù)時間是 300毫秒。
dontAnimate():顯示圖片而沒有任何淡入淡出效果,在Glide的建造者中調(diào)用.dontAnimate()
override(horizontalSize, verticalSize):用override(horizontalSize, verticalSize)調(diào)整圖片大小
-
圖像縮放
現(xiàn)在,對于任何圖像操作,調(diào)整大小真的能讓長寬比失真并且丑化圖像顯示。在你大多數(shù)的使用場景中,你想要避免發(fā)生這種情況。Glide 提供了一般變化去處理圖像顯示。提供了兩個標準選項:centerCrop 和 fitCenter
CenterCrop:CenterCrop()是一個裁剪技術(shù),即縮放圖像讓它填充到 ImageView 界限內(nèi)并且側(cè)鍵額外的部分。ImageView 可能會完全填充,但圖像可能不會完整顯示.
Glide .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .override(600, 200) //調(diào)整圖片大小 .centerCrop() //圖片縮放 .into(imageViewResizeCenterCrop);
FitCenter:fitCenter() 是裁剪技術(shù),即縮放圖像讓圖像都測量出來等于或小于ImageView的邊界范圍。該圖像將會完全顯示,但可能不會填滿整個ImageView。
Glide .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .override(600, 200) //調(diào)整圖片大小 .fitCenter() //圖片縮放 .into(imageViewResizeFitCenter);
總結(jié):平時在使用的時候還是CenterCrop()的時候多一些,就像ImageView里面也會用到android: scaleType="centerCrop"
-
內(nèi)存緩存
調(diào)用了.skipMemoryCache(true) 去明確告訴 Glide 跳過內(nèi)存緩存,這意味著 Glide 將不會把這張圖片放到內(nèi)存緩存中去,這里需要明白的是,這只是會影響內(nèi)存緩,Glide將會仍然利用磁盤緩存來避免重復(fù)的網(wǎng)絡(luò)請求。
Glide .with( context ) .load( eatFoodyImages[0] ) .skipMemoryCache( true ) //設(shè)置禁止Glide將圖片寫到內(nèi)存緩存中 .into( imageViewInternet );
-
跳過磁盤緩存
用.diskCacheStrategy()方法為Glide改變磁盤緩存的行為,不同的于.skipMemoryCache() 方法,它需要一個枚舉而不是一個簡答的布爾值,如果你想要為一個請求禁用磁盤緩存,使用枚舉 DiskCacheStrategy.NONE
Glide .with( context ) .load( eatFoodyImages[0] ) .diskCacheStrategy( DiskCacheStrategy.NONE )//禁止磁盤緩存 .skipMemoryCache(true) //禁止內(nèi)存緩存 .into( imageViewInternet );
-
圖片請求的優(yōu)先級
通常,你會遇到這樣的使用場景:你的App將會需要在同一時間內(nèi)加載多個圖像。讓我們假設(shè)你正在構(gòu)建一個信息屏幕,這里有一張很大的英雄圖片在頂部,還有兩個小的,在底部還有一些不那么重要的圖片。對于最好的用戶體驗來說,應(yīng)用圖片元素是顯示要被加載和顯示的,然后才是底部不緊急的 ImageView。Glide 可以用 Priority 枚舉來支持你這樣的行為,調(diào)用 .priority() 方法。
.priority() 方法的參數(shù)priority(優(yōu)先級):
按照遞增priority(優(yōu)先級)的列表:
Priority.LOW Priority.NORMAL Priority.HIGH Priority.IMMEDIATE
注意:優(yōu)先級并不是完全嚴格遵守的。Glide將會用他們作為一個準則,并盡可能的處理這些請求,但是它不能保證所有的圖片都會按照所要求的順序加載。
private void loadImageWithHighPriority() { Glide .with( context ) .load( UsageExampleListViewAdapter.eatFoodyImages[0] ) .priority( Priority.HIGH ) .into( imageViewHero ); } private void loadImagesWithLowPriority() { Glide .with( context ) .load( UsageExampleListViewAdapter.eatFoodyImages[1] ) .priority( Priority.LOW ) .into( imageViewLowPrioLeft ); Glide .with( context ) .load( UsageExampleListViewAdapter.eatFoodyImages[2] ) .priority( Priority.LOW ) .into( imageViewLowPrioRight ); }