使用Fresco在RecyclerView中实现Gif动画闪烁

3

我使用Fresco在Recyclerview中加载gif。

下面是我的Kotlin代码:

fun loadResizeImage(uri: Uri, view: SimpleDraweeView, width: Int, height: Int) {
    val request = ImageRequestBuilder.newBuilderWithSource(uri)
            .setResizeOptions(ResizeOptions(width, height)).build()

val controller = Fresco.newDraweeControllerBuilder()
        .setOldController(view.controller)
        .setImageRequest(request)
        .build()
view.controller = controller

我不播放gif,只将其作为静态图像加载。但是当我调用 notifydatasetchanged 时,gif会闪烁。 我已将 supportsChangeAnimations 设置为false,但只有gif在闪烁。有人能帮我吗?


你正在重置一个控制器。如果控制器的URI没有改变,你能避免这样做吗?那应该可以防止闪烁。 - Droidekas
我可以将URI设置为视图的标签。如果标签等于URI,则我只需不执行块中的操作? - Allen Vork
我已经尝试过这个,但它的效果不好。当我调用notifydatasetchange时,我发现标签与URI不同。 - Allen Vork
1
抱歉,我刚刚理解了您的情况。因此,notifyDatasetChanged 触发完全重绘,无论之前是否已经绘制过项目。这将在屏幕上产生闪烁。即使是使用 Fresco 加载的普通图像(不一定是 GIF),也会发生这种情况。因此,使用 notifyItemChanged 将是更好的解决方案。 - Droidekas
没错,我已经完成了并且它运行良好。notifyDataSetChanged将调用onCreateViewHolder()方法,该方法将创建新的视图并且设置的标签会消失。但是notifyItemChanged将保留此位置的项目标识,因此标签不会被清除。 - Allen Vork
1个回答

1
我的解决方案是将标签设置为视图,如果标签等于URI,则不会重新加载图像。但我发现当我调用notifyDataSetChange时,我设置给视图的标签会改变,但是当我调用notifyItemChanged时,它没有改变。我不知道为什么标签会改变(我没有滚动RecyclerView)。

你修好了吗?我也遇到了同样的问题。如何设置标签?帮帮我。 - Ramachandran A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接