使用RetainingDataSourceSupplier播放动画图像

时间:2018-08-11 07:11:40

标签: android image fresco

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

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

我还尝试了使用低分辨率/高分辨率方案,但是当加载高分辨率图像时,低分辨率不会动画。

后来,我在Fresco中发现了RetainingDataSourceSupplier,它的工作方式是将当前图像保留在DraweeView中,直到装入新图像为止。效果很好,但似乎不适用于动画内容。

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

2 个答案:

答案 0 :(得分:3)

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

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

您可以在此处查看PR:

Proper support for GIFs when using a RetainingDataSource

答案 1 :(得分:0)

我以前从未使用过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