Android 中 Glide 的基本使用
描述:在工程中依賴(lài)Glide
implementation 'com.github.bumptech.glide:glide:4.9.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
/**
*當(dāng)工程中同時(shí)有 "group:android.annotation"药磺、"android:core"繁莹、"com.android.support",編譯會(huì)有重復(fù)資源
*用exclude掉
*/
入門(mén)基本用法
多數(shù)情況下约计,使用Glide加載圖片非常簡(jiǎn)單铃芦,一行代碼就夠了:
Glide.with(activity) //context
.load("/home/config/13923a63d3421860c638eb809111358c.jpeg") //url鏈接叁丧、地址
.into(imageView) //View控件
取消加載也很簡(jiǎn)單
Glide.with(activity) //context
.clear(imageView) //取消加載
盡管及時(shí)取消不必要的加載是很好的實(shí)踐,但這并不是必須的操作冈止。實(shí)際上狂票,當(dāng) Glide.with() 中傳入的 Activity 或 Fragment 實(shí)例銷(xiāo)毀時(shí),Glide 會(huì)自動(dòng)取消加載并回收資源熙暴。
Glide 唯一要求是闺属,對(duì)于任何可復(fù)用的 View ,若他們?cè)谥拔恢蒙现苊梗眠^(guò) Glide 進(jìn)行加載操作掂器,那么在新的位置上要求執(zhí)行一個(gè)新的加載操作,或者調(diào)用 clear() api 停止 Glide 的工作俱箱。
Glide.with(activity) //context
.load("/home/config/13923a63d3421860c638eb809111358c.jpeg") //url鏈接国瓮、地址
.into(imageView) //View控件
Glide.with(activity).clear(imageView) //clear() 之后
imageView.setImageResource(R.drawable.***) //set資源值
定制請(qǐng)求
Glide 提供了許多可應(yīng)用于單一請(qǐng)求的選項(xiàng),包括變換匠楚、過(guò)渡巍膘、緩存選項(xiàng)等。
默認(rèn)選項(xiàng)可以直接應(yīng)用于請(qǐng)求上:
Glide.with(activity) //context
.load(myUrl)
.placehoder(placehoder)
.fitCenter()
.into(imageView)
選項(xiàng)也可以通過(guò) val shareOptions : RequestOptions = RequestOptions() 在多個(gè)請(qǐng)求中共享:
val shareOptions : RequestOptions = RequestOptions()
.placeholder(placeholder)
.fitCenter()
Glide.with(activity) //context
.load("/home/config/13923a63d3421860c638eb809111358c.jpeg") //url鏈接芋簿、地址
.apply(shareOptions )
.into(imageView1) //View控件
Glide.with(activity) //context
.load("/home/config/13923a63d3421860c638eb809111358c.jpeg") //url鏈接峡懈、地址
.apply(shareOptions )
.into(imageView2) //View控件
在RecyclerView 中使用
在 RecyclerView 中加載圖片的代碼和在單獨(dú)的 View 中加載完全一樣。Glide 已經(jīng)自動(dòng)處理了 View 的復(fù)用和請(qǐng)求取消:
@Override
fun onBindViewHolder(holder : ViewHolder , poistion : Int ){
val url = urls.[poistion]
Glide.with(activity)
.load(url)
.into(holder.imageView)
}
對(duì) url 進(jìn)行 null 檢驗(yàn)并不是必須的 与斤, 如果 url 為 null 肪康,Glide 會(huì)清空 View 的內(nèi)容, 或者顯示 placeholder Drawable 或者 fallback Drawable 的內(nèi)容撩穿。
Glide 唯一要求是磷支,對(duì)于任何可復(fù)用的 View ,若他們?cè)谥拔恢蒙鲜彻眩眠^(guò) Glide 進(jìn)行加載操作雾狈,那么在新的位置上要求執(zhí)行一個(gè)新的加載操作,或者調(diào)用 clear() api 停止 Glide 的工作抵皱。
@Override
fun onBindViewHolder(holder : ViewHolder , poistion : Int ){
if(isShow[poistion]){
val url = urls.[poistion]
Glide.with(activity)
.load(url)
.into(holder.imageView)
}else{
Glide.with(activity).clear(holder.imageView)
holder.imageView.setImageDrawable(R.drawable.***)
}
}
對(duì) View 調(diào)用 clear() 或者 into(View) 善榛,表明在此之前的加載操作中會(huì)被取消辩蛋,并且在方法調(diào)用完后,Glide 不會(huì)改變 View 的內(nèi)容移盆,如果忘記了調(diào)用 clear() 悼院,而又沒(méi)有開(kāi)啟新的加載操作,那么就會(huì)出現(xiàn)這種情況咒循,你已經(jīng)為 View 設(shè)置好了一個(gè) Drawable 据途,但此 view 在之前的位置上使用過(guò) Glide 進(jìn)行過(guò)加載圖片的操作, Glide 加載完畢后可能會(huì)將這個(gè) view 改回原來(lái)的內(nèi)容叙甸。
ListView 與此處的 RecyclerView 一樣颖医。
非 View 目標(biāo)
除了將 Bitmap 和 Drawable 加載到 View 之外,你可以開(kāi)始異步加載到自定義的 Target 中 :
Glide.with(context
.load(url)
.into(new CustomTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<Drawable> transition) {
// Do something with the Drawable here.
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
// Remove the Drawable provided in onResourceReady from any Views and ensure
// no references to it remain.
}
});
使用自定義 Target 有一些陷阱裆蒸,所以請(qǐng)務(wù)必閱讀 目標(biāo)文檔頁(yè) 的詳細(xì)內(nèi)容便脊。
后臺(tái)線(xiàn)程
在后臺(tái)線(xiàn)程加載圖片也是直接使用:
FutureTarget<Bitmap> futureTarget =
Glide.with(context)
.asBitmap()
.load(url)
.submit(width, height);
Bitmap bitmap = futureTarget.get();
// Do something with the Bitmap and then when you're done with it:
Glide.with(context).clear(futureTarget);
如果你不想讓 Bitmap
和 Drawable
自身在后臺(tái)線(xiàn)程中,你也可以使用和前臺(tái)線(xiàn)程一樣的方式來(lái)開(kāi)始異步加載:
Glide.with(context)
.asBitmap()
.load(url)
.into(new Target<Bitmap>() {
...
});