滑动过渡不适用于侦听器?

问题描述 投票:0回答:3

我的 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
一起使用,还是我错过了什么?

android-glide
3个回答
3
投票

发现做到这一点的方法不是通过过渡,而是通过

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)

0
投票

如果没有咨询 Glide 文档,我会说这是因为你覆盖了 Glides 的部分工作。您在

Drawable
中获取了库为您获取的
onResourceReady
,并且没有使用 Glide 加载图像,而是将其强制放入您的
ImageView
中。在这个例子中,我将 Glides 函数作为一个可绘制的下载器进行比较,而您则是将图像加载到视图中的人。


0
投票

添加侦听器时

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
更新并按预期应用交叉淡入淡出过渡。

© www.soinside.com 2019 - 2024. All rights reserved.