我的 Glide 代码如下
Glide.with(this)
.load("https://flybubble.com/media/wysiwyg/images/home/mainpage-box-5L.jpg")
.transition(DrawableTransitionOptions.withCrossFade())
.apply(RequestOptions()
.placeholder(R.drawable.placeholder)
.centerCrop()
.transforms(CenterCrop(), RoundedCorners(1000)))
.into(my_image_view)
一切正常,当加载图像时,
withCrossFade()
显示它淡入。
但是,当我如下添加侦听器时
Glide.with(this)
.load("https://flybubble.com/media/wysiwyg/images/home/mainpage-box-5L.jpg")
.transition(DrawableTransitionOptions.withCrossFade())
.apply(RequestOptions()
.placeholder(R.drawable.placeholder)
.centerCrop()
.transforms(CenterCrop(), RoundedCorners(1000)))
.listener(object: RequestListener<Drawable>{
override fun onLoadFailed(e: GlideException?, model: Any, target: Target<Drawable>, isFirstResource: Boolean): Boolean {
return false
}
override fun onResourceReady(resource: Drawable, model: Any, target: Target<Drawable>, dataSource: DataSource, isFirstResource: Boolean): Boolean {
my_image_view.setImageDrawable(resource)
return true
}
})
.into(my_image_view)
withCrossFade()
无法再工作。是因为 transition
不能与 listener
一起使用,还是我错过了什么?
发现做到这一点的方法不是通过过渡,而是通过
Transition
来喂养 target.onResourceReady
。
Glide.with(this)
.load("https://flybubble.com/media/wysiwyg/images/home/mainpage-box-5L.jpg")
//.transition(DrawableTransitionOptions.withCrossFade()) //Remove this line
.apply(RequestOptions()
.placeholder(R.drawable.placeholder)
.centerCrop()
.transforms(CenterCrop(), RoundedCorners(1000)))
.listener(object: RequestListener<Drawable>{
override fun onLoadFailed(e: GlideException?, model: Any, target: Target<Drawable>, isFirstResource: Boolean): Boolean {
return false
}
override fun onResourceReady(resource: Drawable, model: Any, target: Target<Drawable>, dataSource: DataSource, isFirstResource: Boolean): Boolean {
target.onResourceReady(resource, DrawableCrossFadeTransition(1000, !isFirstResource))
return true
}
})
.into(my_image_view)
如果没有咨询 Glide 文档,我会说这是因为你覆盖了 Glides 的部分工作。您在
Drawable
中获取了库为您获取的 onResourceReady
,并且没有使用 Glide 加载图像,而是将其强制放入您的 ImageView
中。在这个例子中,我将 Glides 函数作为一个可绘制的下载器进行比较,而您则是将图像加载到视图中的人。
添加侦听器时
withCrossFade()
转换不再起作用的原因在于您处理 onResourceReady
方法的方式。在初始代码中,您使用 my_image_view.setImageDrawable(resource)
手动设置图像,这绕过了 Glide 的默认行为,包括过渡。
要解决此问题,您应该在
false
方法中返回 true
而不是 onResourceReady
。这允许 Glide 继续其正常处理,包括应用过渡。当您返回 false
时,Glide 将处理在 ImageView
上设置图像并自动应用过渡。
这是更正后的代码:
Glide.with(this)
.load("https://flybubble.com/media/wysiwyg/images/home/mainpage-box-5L.jpg")
.transition(DrawableTransitionOptions.withCrossFade())
.apply(RequestOptions()
.placeholder(R.drawable.placeholder)
.centerCrop()
.transforms(CenterCrop(), RoundedCorners(1000)))
.addListener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any,
target: Target<Drawable>,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: Drawable,
model: Any,
target: Target<Drawable>,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
// Return false to let Glide handle setting the image and applying the transition
return false
}
})
.into(my_image_view)
通过在
false
中返回 onResourceReady
,Glide 将管理 ImageView
更新并按预期应用交叉淡入淡出过渡。