Glide添加Listener后Transition动画失效?技术求助
解决Glide添加Listener后过渡动画失效的问题
嘿,这个坑我之前踩过!当你给Glide请求加上RequestListener之后,过渡动画突然消失,核心原因和Listener的返回值直接相关。
问题根源
Glide的RequestListener有两个关键方法:onResourceReady()和onLoadFailed()。如果这两个方法里返回true,Glide就会认为你已经完全接管了资源加载后的所有处理逻辑,会直接跳过默认的过渡动画和视图绑定流程——这就是动画消失的原因!
解决方案
方案1:让Listener不拦截默认流程(推荐)
最简单的解决方式,就是确保RequestListener的两个方法都返回false,这样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))) .listener(object : RequestListener<Drawable> { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean ): Boolean { // 返回false,让Glide处理默认的失败逻辑 return false } override fun onResourceReady( resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { // 返回false,允许Glide执行过渡动画 // 这里可以添加你的自定义逻辑,比如打印日志、统计加载成功事件 return false } }) .into(my_image_view)
方案2:手动触发过渡动画(适合需要完全自定义的场景)
如果你确实需要在onResourceReady()里执行自定义逻辑,并且要手动控制过渡动画,可以通过Transition对象手动触发。这种方式适合特殊需求,示例代码:
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 { // 先执行你的自定义操作 // 比如:Toast.makeText(this@MainActivity, "图片加载完成", Toast.LENGTH_SHORT).show() // 手动触发过渡动画 if (target is ViewTarget<*, Drawable>) { val transitionOptions = DrawableTransitionOptions.withCrossFade() transitionOptions.transition?.transition(resource, target) } // 返回true,告诉Glide我们已经处理完了 return true } }) .into(my_image_view)
总结
90%的场景下,方案1就能完美解决问题——只要别让Listener拦截Glide的默认流程,过渡动画就会正常播放。如果有特殊的自定义需求,再考虑方案2手动控制动画。
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

