使用RetainingDataSourceSupplier播放动画图像

7
我正在使用Fresco在RecyclerView中显示gif。当用户点击图像后,我会打开一个详细信息屏幕,在最后显示高分辨率GIF。
如果我只是在同一个DraweeView中加载另一个GIF,内容将消失,因为这是Fresco的工作方式,而且当高分辨率图像加载时,用户将看到黑色图像,尽管我已经有了低质量预览。
我也尝试使用低分辨率/高分辨率方案,但在高分辨率图像加载时,低分辨率不会动画。
后来我发现了Fresco中的RetainingDataSourceSupplier,它通过在DraweeView中保留当前图像来工作,直到加载新图像。这很好用,但对于动画内容似乎不起作用。
你能帮我保留当前的动画内容,直到下载高质量内容吗?
2个回答

3
我最终重写了Fresco的一些部分。基本上,RetainingDataSource在实现DataSource时进行了一些修改,将其状态永远保持在PROGRESS中。这意味着当新资源放入DataSource时,控制器将永远不会收到通知,他们也永远无法播放GIF。
我通过修改Fresco库代码并在每次加载资源后通知控制器来解决了这个问题。我向Fresco提交了PR,也许他们会同意这些更改,因为我认为RetainingDataSource是不完整的。
你可以在这里检查PR: Proper support for GIFs when using a RetainingDataSource

0

我以前从未使用过fesco。但我认为这会起作用。

首先加载您的低分辨率gif,然后启动一个timertask来确定gif是否已加载,使用布尔值。

final boolean gifLoaded = false;
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if(gifLoaded){
                        timer.cancel();
                        //animate your gif
                    }
                }
            });
        }
    };
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(timerTask,0,200); //check for the gifLoaded value continuously

您可以使用以下代码检查gif是否已加载:

ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
@Override
public void onFinalImageSet(
    String id,
    @Nullable ImageInfo imageInfo,
    @Nullable Animatable anim) {
    if (anim != null) {
      //now the gif is loaded
      gifLoaded = true;
      anim.start();
    }
  }
};

 Uri uri;
 DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setUri(uri)
    .setControllerListener(controllerListener)
     // other setters
    .build();
 mSimpleDraweeView.setController(controller);

希望这个能够正常工作。更多信息请参见:Fresco:动画图片


我正在正确地预缓存图像。问题在于Fresco的工作方式。如果我将一个新的控制器(其中包含一个新的图像请求)设置给DraweeView,它将擦除显示的内容,显示占位符并加载新内容。你的代码基本上具有与我现在使用的相同的效果。 - Cristian Holdunu
你不能使用两个DraweeView分别加载gif吗?当高清图正在加载时,将高清DraweeView的可见性设置为Gone,在它加载完成后将其设置为可见,并将低清DraweeView的可见性设置为Gone。 - NirmalCode
我正在同时使用相同的组件来为RecyclerView和细节屏幕(它本身只是一个带有详细标题的RecyclerView)进行加载。我希望以正确的方式解决这个问题,而不是通过hack的方式。 - Cristian Holdunu
这正是我所使用的。请阅读我的原始帖子 :) - Cristian Holdunu

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