You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:41