基本使用
Glide.with(this).load(url).into(imageView);
使用占位符
占位符是當請求正在執(zhí)行時被展示的 Drawable 。當請求成功完成時,占位符會被請求到的資源替換。如果被請求的資源是從內(nèi)存中加載出來的,那么占位符可能根本不會被顯示赖欣。如果請求失敗并且沒有設置 error Drawable ,則占位符將被持續(xù)展示。類似地戈毒,如果請求的url/model為 null ,并且 error Drawable 和 fallback 都沒有設置横堡,那么占位符也會繼續(xù)顯示埋市。
RequestOptions options = new RequestOptions().placeholder(R.drawable.loading);
Glide.with(this).load(url).apply(options).into(imageView);
錯誤占位符
error Drawable 在請求永久性失敗時展示。error Drawable 同樣也在請求的url/model為 null 命贴,且并沒有設置 fallback Drawable 時展示道宅。
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.error);
Glide.with(this).load(url).apply(options).into(imageView);
后備回調(diào)符(Fallback)
fallback Drawable 在請求的url/model為 null 時展示。
Glide.with(fragment).load(url).fallback(R.drawable.fallback).into(view);
占位符是在主線程從Android Resources加載的胸蛛,且Transformation僅被應用于被請求的資源污茵,而不會對任何占位符使用。
指定圖片大小
使用Glide在大多數(shù)情況下我們都是不需要指定圖片大小的葬项,因為Glide會自動根據(jù)ImageView的大小來決定圖片的大小泞当,以此保證圖片不會占用過多的內(nèi)存從而引發(fā)OOM。
RequestOptions options = new RequestOptions().override(200, 100);
Glide.with(this).load(url).apply(options).into(imageView);
加載圖片原始尺寸
RequestOptions options = new RequestOptions().override(Target.SIZE_ORIGINAL);
緩存相關
禁用內(nèi)存緩存
RequestOptions options = new RequestOptions().skipMemoryCache(true);
禁用硬盤緩存
RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE);
硬盤緩存選項
DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容民珍。
DiskCacheStrategy.DATA: 表示只緩存原始圖片襟士。
DiskCacheStrategy.RESOURCE: 表示只緩存轉(zhuǎn)換過后的圖片。
DiskCacheStrategy.ALL : 表示既緩存原始圖片嚷量,也緩存轉(zhuǎn)換過后的圖片陋桂。
DiskCacheStrategy.AUTOMATIC: 表示讓Glide根據(jù)圖片資源智能地選擇使用哪一種緩存策略(默認選項)。
其中蝶溶,DiskCacheStrategy.DATA對應Glide 3中的DiskCacheStrategy.SOURCE嗜历,DiskCacheStrategy.RESOURCE對應Glide 3中的DiskCacheStrategy.RESULT。而DiskCacheStrategy.AUTOMATIC是Glide 4中新增的一種緩存策略身坐,并且在不指定diskCacheStrategy的情況下默認使用就是的這種緩存策略秸脱。
加載gif
Picasso不支持此功能,glide會自行判斷圖片格式
Glide.with(this).load("http://guolin.tech/test.gif").into(imageView);
如果強制加載靜態(tài)圖片的話
Glide.with(this).asBitmap().load("http://guolin.tech/test.gif").into(imageView);
asGif()強制加載動態(tài)圖
Glide 4中又新增了asFile()方法和asDrawable()方法部蛇,分別用于強制指定文件格式的加載和Drawable格式的加載摊唇。
過渡選項
TransitionOptions 用于決定你的加載完成時會發(fā)生什么
例如交叉淡入效果
Glide.with(fragment).load(url).transition(withCrossFade()).into(view);
變換選項
RequestOptions options = new RequestOptions();
options.centerCrop();
多重變換
默認情況下,每個 transform() 調(diào)用涯鲁,或任何特定轉(zhuǎn)換方法(fitCenter(), centerCrop(), bitmapTransform() etc)的調(diào)用都會替換掉之前的變換巷查。
如果你想在單次加載中應用多個變換有序,請使用 MultiTransformation 類,或其快捷方法 .transforms() 岛请。
Glide.with(fragment)
.load(url)
.transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
.into(imageView);
—————————————————
apply()方法可以被調(diào)用多次旭寿,因此 RequestOption
可以被組合使用。如果 RequestOptions
對象之間存在相互沖突的設置崇败,那么只有最后一個被應用的 RequestOptions
會生效盅称。
Transformation可以復用
在多個加載中復用 Transformation 應當總是安全的
在Glide中,當你為一個 ImageView 開始加載時后室,Glide可能會自動應用 FitCenter 或 CenterCrop 缩膝,這取決于view的 ScaleType 。如果 scaleType 是 CENTER_CROP , Glide 將會自動應用 CenterCrop 變換岸霹。如果 scaleType 為 FIT_CENTER 或 CENTER_INSIDE 疾层,Glide會自動使用 FitCenter 變換。
—————————————————
圖片url存在token
public class MyGlideUrl extends GlideUrl {
private String mUrl;
public MyGlideUrl(String url) {
super(url);
mUrl = url;
}
@Override
public String getCacheKey() {
return mUrl.replace(findTokenParam(), "");
}
private String findTokenParam() {
String tokenParam = "";
int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
if (tokenKeyIndex != -1) {
int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
if (nextAndIndex != -1) {
tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
} else {
tokenParam = mUrl.substring(tokenKeyIndex);
}
}
return tokenParam;
}
}
Glide.with(this).load(newMyGlideUrl(url)).into(imageView);
利用Glide將圖片加載到不同控件或加載成不同使用方式
(1)拿到圖片實例
//1贡避、通過自己構造 target 可以獲取到圖片實例
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
imageView.setImageDrawable(resource);
}
};
//2痛黎、將圖片實例記載到指定的imageview上,也可以做其他的事情
public void loadImage(View view) {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.into(simpleTarget);
}
將圖片加載到任何位置
/*
*將圖片加載為控件背景
*/
public class MyLayout extends LinearLayout {
private ViewTarget<MyLayout, GlideDrawable> viewTarget;
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
MyLayout myLayout = getView();
myLayout.setImageAsBackground(resource);
}
};
}
public ViewTarget<MyLayout, GlideDrawable> getTarget() {
return viewTarget;
}
public void setImageAsBackground(GlideDrawable resource) {
setBackground(resource);
}
}
//引用圖片到指定控件作為背景
public class MainActivity extends AppCompatActivity {
MyLayout myLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myLayout = (MyLayout) findViewById(R.id.background);
}
public void loadImage(View view) {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.into(myLayout.getTarget());
}
}
————————————————————————————
圖片預加載
Glide.with(this).load("http://guolin.tech/book.png") .preload();
preload()方法有兩個方法重載刮吧,一個不帶參數(shù)湖饱,表示將會加載圖片的原始尺寸,另一個可以通過參數(shù)指定加載圖片的寬和高皇筛。
into()方法
SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
imageView.setImageDrawable(resource);
}
};
public void loadImage(View view) {
Glide.with(this)
.load("http://guolin.tech/book.png")
.into(simpleTarget);
}
submit()方法
submit()方法其實就是對應的Glide 3中的downloadOnly()方法琉历,和preload()方法類似,submit()方法也是可以替換into()方法的水醋。這個方法只會下載圖片旗笔,而不會對圖片進行加載。當圖片下載完成之后拄踪,我們可以得到圖片的存儲路徑蝇恶,以便后續(xù)進行操作。
public void downloadImage() {
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://www.guolin.tech/book.png";
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context)
.asFile()
.load(url)
.submit();
final File imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
當調(diào)用了submit()方法后會立即返回一個FutureTarget對象惶桐,然后Glide會在后臺開始下載圖片文件撮弧。接下來我們調(diào)用FutureTarget的get()方法就可以去獲取下載好的圖片文件了,如果此時圖片還沒有下載完姚糊,那么get()方法就會阻塞住贿衍,一直等到圖片下載完成才會有值返回。
listener()方法
Glide.with(this)
.load("http://www.guolin.tech/book.png")
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
})
.into(imageView);
onResourceReady()方法和onLoadFailed()方法都有一個布爾值的返回值救恨,返回false就表示這個事件沒有被處理贸辈,還會繼續(xù)向下傳遞,返回true就表示這個事件已經(jīng)被處理掉了肠槽,從而不會再繼續(xù)向下傳遞擎淤。舉個簡單點的例子奢啥,如果我們在RequestListener的onResourceReady()方法中返回了true,那么就不會再回調(diào)Target的onResourceReady()方法了嘴拢。
定制變換
盡管 Glide 提供了各種各樣的內(nèi)置 Transformation 實現(xiàn)桩盲,如果你需要額外的功能,你也可以實現(xiàn)你自己的 Transformation席吴。
BitmapTransformation
如果你只需要變換 Bitmap赌结,最好是從繼承 BitmapTransformation 開始。BitmapTransformation 為我們處理了一些基礎的東西孝冒,例如姑曙,如果你的變換返回了一個新修改的 Bitmap ,BitmapTransformation將負責提取和回收原始的 Bitmap迈倍。
public class FillSpace extends BitmapTransformation {
private static final String ID = "com.bumptech.glide.transformations.FillSpace";
private static final String ID_BYTES = ID.getBytes(STRING_CHARSET_NAME);
@Override
public Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
if (toTransform.getWidth() == outWidth && toTransform.getHeight() == outHeight) {
return toTransform;
}
return Bitmap.createScaledBitmap(toTransform, outWidth, outHeight, /*filter=*/ true);
}
@Override
public void equals(Object o) {
return o instanceof FillSpace;
}
@Override
public int hashCode() {
return ID.hashCode();
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest)
throws UnsupportedEncodingException {
messageDigest.update(ID_BYTES);
}
}
必需的方法
請?zhí)貏e注意,對于任何 Transformation 子類捣域,包括 BitmapTransformation啼染,你都有三個方法你 必須 實現(xiàn)它們,以使得磁盤和內(nèi)存緩存正確地工作:
equals()
hashCode()
updateDiskCacheKey
如果你的 Transformation 沒有參數(shù)焕梅,通常使用一個包含完整包限定名的 static final String 來作為一個 ID迹鹅,它可以構成 hashCode() 的基礎,并可用于更新 updateDiskCacheKey() 傳入的 MessageDigest贞言。如果你的 Transformation 需要參數(shù)而且它會影響到 Bitmap 被變換的方式斜棚,它們也必須被包含到這三個方法中。
例如该窗,Glide 的 RoundedCorners 變換接受一個 int弟蚀,它決定了圓角的弧度。它的equals(), hashCode() 和 updateDiskCacheKey 實現(xiàn)看起來像這樣:
@Override
public boolean equals(Object o) {
if (o instanceof RoundedCorners) {
RoundedCorners other = (RoundedCorners) o;
return roundingRadius == other.roundingRadius;
}
return false;
}
@Override
public int hashCode() {
return Util.hashCode(ID.hashCode(),
Util.hashCode(roundingRadius));
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
byte[] radiusData = ByteBuffer.allocate(4).putInt(roundingRadius).array();
messageDigest.update(radiusData);
}
原來的 String 仍然保留酗失,但 roundingRadius 被包含到了三個方法中义钉。這里,updateDiskCacheKey 方法還演示了你可以如何使用 ByteBuffer 來包含基本參數(shù)到你的 updateDiskCacheKey 實現(xiàn)中规肴。
不要忘記 equals() / hashCode()!
值得重申的一點是捶闸,為了讓內(nèi)存緩存正常地工作你是否必須實現(xiàn) equals() 和 hashCode() 方法。很不幸拖刃,即使你沒有復寫這兩個方法删壮,BitmapTransformation 和 Transformation 也能通過編譯,但這并不意味著它們能正常工作兑牡。我們正在探索一些方案央碟,以使在 Glide 的未來版本中,使用默認的 equals() 和 hashCode 方法將拋出一個編譯時錯誤发绢。________________________________________
部分內(nèi)容轉(zhuǎn)自
郭神 Android圖片加載框架最全解析(八)硬耍,帶你全面了解Glide 4的用法