我正在寻找一种我可以使用的设计模式,以便在android recyclerView中我能以低质量快速加载图像,然后还可以调用高质量图像 之后写下低质量的图像。我经常看到首先加载低质量图像,然后出现高质量图像。
但是如何在适配器中为回收器视图完成此操作。现在我正在使用毕加索进行缓存和图像加载。例如,这里是一个低质量图像的链接:
http://example.com/lowQuality.jpg以及同样高质量的http://example.com/highQuality.jpg
因此,如果我在viewholder中执行此操作,请在我的适配器中使用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配置文件图像相同的效果(它如何从质量差到质量好)。
答案 0 :(得分:5)
我找到了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 );
}
source这里的更多信息
答案 1 :(得分:1)
我想我理解,你想要的效果就像WhatsApp个人资料图片一样。我认为这个过程取决于你的后端,你的后端应该有一个方法默认调整原始图片的大小/压缩,另一种方法保留原始大小的图像。
示例服务器的伪代码
$image = image.jpg
$requestLowQuality = resizeThis($image)
$requestHighQuality = $image.
因此,当您的应用在后台加载图片时, $ requestLowQuality ..的Async任务请求会加载低质量的默认版本。但是当用户点击查看时,Asynctask向服务器请求 $ requestHighQuality
我认为这就是WhatsApp的作用。这就是为什么你需要等待一段时间才能使模糊图像变得更好。
Picasso 将根据请求方法加载图片
Goodluck bro
答案 2 :(得分: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。