gpt4 book ai didi

android - Fresco:使用当前显示在 Drawee 中的图像作为下一次请求的占位符

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:53:19 25 4
gpt4 key购买 nike

我在同一个 SimpleDraweeView 上连续播放多张图片,问题是当提交新的 imageURI 请求时,SimpleDrweeView 会移除当前显示的图片并将其替换为下载 URI 之前什么也没有。所以它会在播放序列中留下空白(你可以想到我正在尝试做的是使用本地照片的卡通动画)。我希望 SimpleDrweeView 保留当前图像,直到下载新图像,然后在准备好时交换它。

我尝试使用 this 中的低分辨率/高分辨率方案将旧 uri 作为占位符的票证但没有用(与以前的效果相同)。

这是我现在拥有的:

 SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);

draweeView.setImageURI(uri /* local image */);

这是我到目前为止尝试过的(没用):

                SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);

Uri lowResUri, highResUri;
DraweeController controller = Fresco.newDraweeControllerBuilder().setTapToRetryEnabled(true)
.setLowResImageRequest(ImageRequest.fromUri((Uri) draweeView.getTag())) /*naive way to test the low/high res feature*/
.setImageRequest(ImageRequest.fromUri(uri))
.setOldController(draweeView.getController())
.build();
draweeView.setTag(uri);
draweeView.setController(controller);

最佳答案

我是 Fresco 团队的一员,也许可以提供帮助。奇怪的是,您在使用低分辨率/高分辨率组合时遇到了同样的问题。如果图像当前正在显示,则意味着它应该在位图内存缓存中,这反过来意味着下次切换到下一帧时设置为低分辨率图像时应该能够立即加载。您确定将正确的 uri 设置为低分辨率图像吗? (Uri) draweeView.getTag() 看起来有点可疑。我会仔细检查那部分。

如果 uri 确实正确,但图像不再位于位图缓存中,则值得研究为什么不再缓存可见图像,因为我们有明确的逻辑可以防止逐出可见图像.查看如何使用详细日志记录来跟踪此 here .

如果以上都失败了,第三个选项是实际实现你自己的 DataSource .我可以帮忙,但这可能有点涉及。基本思想是实现一个 DataSource,它包装另一个实际提供图像的 DataSource。然后你可以这样做:

// keep this instance somewhere
mMyDataSourceSupplier = new MyDataSourceSupplier();

// build controller by specifying your custom datasource supplier instead of specifying any URIs.
Fresco.newDraweeControllerBuilder()
.setDataSourceSupplier(mMyDataSourceSupplier)
.build()

// later, when you need to change the image do
mMyDataSourceSupplier.setUri(nextUri);

// this is just an outline
class MyDataSourceSupplier implements Supplier<DataSource<CloseableReference<CloseableImage>>> {

private Uri mCurrentUri;
private DataSource<CloseableReference<CloseableImage>> mCurrentDataSource;

public void setUri(Uri uri) {
mCurrentUri = uri;
if (mCurrentDatasource != null) {
mCurrentDataSource.setUri(uri);
}
}

@Override
public DataSource<CloseableReference<CloseableImage>> get() {
mCurrentDataSource = new MyDataSource();
mCurrentDataSource.setUri(uri);
return mCurrentDataSource;
}

private class MyDataSource extends AbstractDataSource<CloseableReference<CloseableImage>> {
private DataSource mUnderlyingDataSource;

@Override
protected void closeResult(@Nullable CloseableReference<CloseableImage> result) {
CloseableReference.closeSafely(result);
}

@Override
@Nullable
public CloseableReference<CloseableImage> getResult() {
return CloseableReference.cloneOrNull(super.getResult());
}


@Override
public boolean close() {
if (mUnderlyingDataSource != null) {
mUnderlyingDataSource.close();
mUnderlyingDataSource = null;
}
return super.close();
}

public void setUri(Uri uri) {
if (mUnderlyingDataSource != null) {
mUnderlyingDataSource.close();
mUnderlyingDataSource = null;
}
if (uri != null && !isClosed()) {
mUnderlyingDataSource = Fresco.getImagePipeline().fetchDecodedImage(ImageRequest.fromUri(uri), null);
mUnderlyingDataSource.subscribe(new BaseDataSubscriber {
@Override
protected void onNewResultImpl(DataSource<List<CloseableReference<CloseableImage>>> dataSource) {
MyDataSource.super.setResult(dataSource.getResult(), false);
}
});
}
}
}
}

关于android - Fresco:使用当前显示在 Drawee 中的图像作为下一次请求的占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com