Android 中 Glide 的基本使用
描述:在工程中依赖Glide
implementation 'com.github.bumptech.glide:glide:4.9.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
/**
*当工程中同时有 "group:android.annotation"、"android:core"、"com.android.support",编译会有重复资源
*用exclude掉
*/
入门基本用法
多数情况下,使用Glide加载图片非常简单,一行代码就够了:
Glide.with(activity) //context
.load("/home/config/13923a63d3421860c638eb809111358c.jpeg") //url链接、地址
.into(imageView) //View控件
取消加载也很简单
Glide.with(activity) //context
.clear(imageView) //取消加载
尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 Glide.with() 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。
Glide 唯一要求是,对于任何可复用的 View ,若他们在之前位置上,用过 Glide 进行加载操作,那么在新的位置上要求执行一个新的加载操作,或者调用 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资源值
定制请求
Glide 提供了许多可应用于单一请求的选项,包括变换、过渡、缓存选项等。
默认选项可以直接应用于请求上:
Glide.with(activity) //context
.load(myUrl)
.placehoder(placehoder)
.fitCenter()
.into(imageView)
选项也可以通过 val shareOptions : RequestOptions = RequestOptions() 在多个请求中共享:
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 中加载图片的代码和在单独的 View 中加载完全一样。Glide 已经自动处理了 View 的复用和请求取消:
@Override
fun onBindViewHolder(holder : ViewHolder , poistion : Int ){
val url = urls.[poistion]
Glide.with(activity)
.load(url)
.into(holder.imageView)
}
对 url 进行 null 检验并不是必须的 , 如果 url 为 null ,Glide 会清空 View 的内容, 或者显示 placeholder Drawable 或者 fallback Drawable 的内容。
Glide 唯一要求是,对于任何可复用的 View ,若他们在之前位置上,用过 Glide 进行加载操作,那么在新的位置上要求执行一个新的加载操作,或者调用 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.***)
}
}
对 View 调用 clear() 或者 into(View) ,表明在此之前的加载操作中会被取消,并且在方法调用完后,Glide 不会改变 View 的内容,如果忘记了调用 clear() ,而又没有开启新的加载操作,那么就会出现这种情况,你已经为 View 设置好了一个 Drawable ,但此 view 在之前的位置上使用过 Glide 进行过加载图片的操作, Glide 加载完毕后可能会将这个 view 改回原来的内容。
ListView 与此处的 RecyclerView 一样。
非 View 目标
除了将 Bitmap 和 Drawable 加载到 View 之外,你可以开始异步加载到自定义的 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 有一些陷阱,所以请务必阅读 目标文档页 的详细内容。
后台线程
在后台线程加载图片也是直接使用:
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
自身在后台线程中,你也可以使用和前台线程一样的方式来开始异步加载:
Glide.with(context)
.asBitmap()
.load(url)
.into(new Target<Bitmap>() {
...
});