使用 RetainingDataSourceSupplier 播放动画图像

Playing animated images with RetainingDataSourceSupplier

我正在使用 fresco 在 RecyclerView 中显示 gif。用户点击图片后,我会打开一个详细信息屏幕,最后我应该在其中显示高分辨率 GIF。

如果我只是在同一个 DraweeView 中加载另一个 GIF,内容将消失,因为这是 Fresco 的工作方式,用户将在加载高分辨率图像时看到黑色图像,尽管我已经有一个提供低质量预览。

我也试过使用 low-res/high-res 方案,但是在加载高分辨率图像时,低分辨率图像没有动画。

后来我在 Fresco 中发现了 RetainingDataSourceSupplier,它的工作原理是将当前图像保存在 DraweeView 中,直到加载新图像。这工作正常,但它似乎不适用于动画内容。

你能帮我保留当前的动画内容,直到下载高质量的动画内容吗?

我以前没用过fesco。但我认为这会起作用。

首先加载您的低分辨率 gif,然后启动一个计时器任务以确定是否使用布尔值加载 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 : Animated Images

我最终重写了壁画的某些部分。基本上,RetainingDataSource 是在破解 DataSource 的实现,将它的状态永远保持在 PROGRESS 中。这意味着当新资源被放入 DataSource 时,控制器将永远不会收到通知,并且它们将永远无法播放 GIF。

我通过修改 fresco 库代码解决了这个问题,并在每次加载资源后通知控制器。我已经对 fresco 进行了 PR,也许他们会同意这些更改,因为我认为 RetainingDataSource 不完整。

你可以在这里查看 PR:

Proper support for GIFs when using a RetainingDataSource