使用 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:
我正在使用 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: