6

我正在寻找一种我可以使用的设计模式,以便在 android recyclerView 中我可以以低质量快速加载图像,然后还调用高质量图像将在之后覆盖低质量图像。我经常看到首先加载低质量图像然后出现高质量图像的情况。

但是这是如何在回收器视图的适配器中完成的。现在我正在使用 picasso 进行缓存和图像加载。所以例如这里是一个低质量图像的链接:

http://example.com/lowQuality.jpg和同样高质量的http://example.com/highQuality.jpg

因此,如果我在视图中执行此操作,则在我的 recyclerView 适配器中:

public class SearchItemHolder extends RecyclerView.ViewHolder  {

        @BindView(R.id.iv)
        ImageView iv;

        @BindView(R.id.tv_description)
        TextView tv_description;

        public SearchItemHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }

        public void bindSearch(final SearchModel searchModel) {

            String description = searchModel.getProductName();
            final String imageLowQualityIDUrl = searchModel.getIdLowQualityImage();
            final String imageHighQualityIDUrl = searchModel.getIdHighQualityImage();

            tv_price.setText(price);
            tv_description.setText(description);



            Picasso.with(mContext).load(imageLowQualityIDUrl).into(iv);
//but how to switch it to high quality URL after its finished loading ?


        }
    }

所以要清楚,我希望只要尚未加载高质量图像,就可以首先显示低质量图像。

更新:我真正想要的是我在应用程序上看到的效果,其中低质量的图像加载速度很快,然后在几秒钟后它转换为更高的质量。如果有其他工具或方法可以做到这一点,请告诉我。我想要与 whatsapp 个人资料图像相同的效果(它如何从劣质变为优质)。

4

3 回答 3

7

我找到了Glide的解决方案。您可以指定要加载为缩略图的低分辨率图像。所有你需要的是:

private void loadImageThumbnailRequest() {  
// setup Glide request without the into() method
DrawableRequestBuilder<String> thumbnailRequest = Glide
    .with( context )
    .load( yourData.getLowQualityLink() );

// pass the request as a a parameter to the thumbnail request
Glide
    .with( context )
    .load( yourData.getHdUrl() )
    .thumbnail( thumbnailRequest )
    .into( imageView );
}

中的更多信息在这里

于 2017-07-10T09:09:04.700 回答
1

我想我明白了,你想要一个像 WhatsApp 个人资料图片一样的效果。我认为该过程取决于您的后端,您的后端应该有一种方法可以默认调整/压缩原始图片的大小,另一种方法可以保留原始大小的图片。

服务器的示例伪代码

$image = image.jpg

$requestLowQuality = resizeThis($image)

 $requestHighQuality = $image.

因此,当您的应用在后台加载图片时, $requestLowQuality的异步任务请求会加载低质量的默认版本。但是当用户点击查看时,一个 Asynctask 向服务器请求$requestHighQuality

我认为这就是 WhatsApp 的做法。这就是为什么你必须等待一段时间才能让模糊的图片变成质量。

Picasso只会根据请求方法加载图像

祝你好运,兄弟

于 2017-06-27T05:57:51.680 回答
1

我还从 Fresco 找到了如何做到这一点:

Uri lowResUri, highResUri;
DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setLowResImageRequest(ImageRequest.fromUri(lowResUri))
    .setImageRequest(ImageRequest.fromUri(highResUri))
    .setOldController(mSimpleDraweeView.getController())
    .build();
mSimpleDraweeView.setController(controller);

似乎和滑翔的想法一样。此信息来自 fresco docs

于 2017-07-10T11:06:41.960 回答