Glide.with(vh.image)
.setDefaultRequestOptions(requestOptions)
.load(mImages[pos])
.fitCenter()
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(vh.image)
当使用Glide如上面的方式加载图片时,尤其是当图片资源比较大时,在更新图片资源(即将图a换成图b)时可能会出现ImageView短暂显示为透明状态,给人以闪烁的感觉,很不友好。
原因在于Glide会将我们传入的ImageView包装成ImageViewTarget对象,当Glide为Imageview重新加载新图片前会先调用com.bumptech.glide.request.SingleRequest的clear()方法,
@Override
public void clear() {
...
if (state == Status.CLEARED) {
return;
}
state = Status.CLEARED;
if (target != null) {
target.onLoadCleared(getPlaceholderDrawable());
}
...
}
这里会调用ImageViewTarget的onLoadCleared()方法,
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
super.onLoadCleared(placeholder);
if (animatable != null) {
animatable.stop();
}
setResourceInternal(null);
setDrawable(placeholder);
}
如果我们使用Glide时没有设置placeholder占位图,这里的placeholder则为null,这是导致ImageView有短暂透明状态的直接原因。
此时,我们只要重写onLoadCleared()方法即可解决此类问题:
Glide.with(vh.image)
.asBitmap()
.load(image)
.fitCenter()
.override(com.bumptech.glide.request.target.Target.SIZE_ORIGINAL, com.bumptech.glide.request.target.Target.SIZE_ORIGINAL)
.into(object : CustomTarget<Bitmap?>() {
override fun onResourceReady(
resource: Bitmap,
@Nullable transition: Transition<in Bitmap?>?
) {
vh.image.setImageBitmap(resource) // 直接设置 Bitmap,避免清空 ImageView
}
override fun onLoadCleared(@Nullable placeholder: Drawable?) {
}
})