1

我正在寻找一种设计模式,我可以使用,以便在Android的recyclerView我可以在低质量的快速加载图像,然后也使为高质量图像的通话将将就 写在低质量的图像之后。我经常看到它首先加载低质量图像,然后出现高质量图像。如何在安卓(就像WhatsApp的个人资料图片)之后加载低质量再高品质的图像

这是怎么回事在适配器回收站视图来完成。现在我正在使用毕加索缓存和图像加载。因此,例如,这里是一个低质量的图像链接:

http://example.com/lowQuality.jpg和同样高品质所以在我的适配器为recyclerView http://example.com/highQuality.jpg

如果我这样做的viewholder:

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

您的意思是说有两个版本的图像,低质量和高质量,那么你想先加载低质量,然后再加载高质量? –

+0

为什么不尝试先加载高质量,然后调整为低质量。如果你使用这种设计模式,假设你分别载入45kb和90kb两个图像,如果你加载一次,调整大小为90kb的数据,如果你加载两个135kb的图像两倍。 –

+0

我真正想要的是,我看到的应用程序中,低质量图像加载很快,然后几秒钟后,它转变为更高的质量 – j2emanue

回答

1

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

+0

壁画在消除内存不足问题上效果更好,所以我更喜欢它。但无论如何,这是一个关于滑翔实施的问题。这是否意味着我的服务器应该有低质量的图像。所以无论何时我想要做到这一点,我的服务器都应该像Vivee Omomi提到的那样具有高质量和低质量的图像。是对的吗 ? – j2emanue

+0

是的,你的服务器必须提供不同质量和不同URL的图像。装载时间的利润。使用低质量缩略图时,您的RecyclerView将更快加载图像,然后将大拇指上面的高清图像加载到大拇指上。在这种情况下,用户体验会很好。如果你只是“模仿”这种行为,由于图像大小调整,加载时间会以某种方式增加。这将是多余的操作,因为我理解你是正确的。 –

1

我想我明白,你想就像WhatsApp的个人资料相片的效果。我认为这个过程依赖于后端,应该有你的后端的方法调整大小/压缩默认情况下,并且保持原有尺寸图像的另一方法原始图片。服务器

$image = image.jpg 

$requestLowQuality = resizeThis($image) 

$requestHighQuality = $image. 

例如伪码所以,当你的应用程序加载石化公司背景,为$ requestLowQuality的异步任务请求..它加载低质量的默认版本。但是当用户点击查看时,Asynctask向服务器请求$ requestHighQuality

我认为这是WhatsApp的工作方式。这就是为什么你必须等待一段时间模糊照片变成质量。

毕加索只会加载基于请求方法

古德勒克兄弟

+0

究竟如何whatsapps配置文件图像呢。你的权利。但是这个比你写的我想的要复杂得多。因为让低品质的要求之前说高质量的要求。那么我需要取消低质量的请求等可能有计时问题 – j2emanue

+0

你是非常正确的,可能会有计时问题。但是,只有当服务器立即响应呼叫时才会这样。服务器必须已经准备好这些图像在存储器中,既调整了大小,又保证了正常的质量,我认为这个过程对于只有单张图片可能会被忽略的图片才是有用的。如何使用onclick监听器和后台任务向服务器发出不同的请求,您可以设置一条消息让用户等待并使这些任务相互依赖。一边工作,另一边等待,反之亦然 –

1

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); 
} 

更多信息我也发现了如何从壁画做到这一点:

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

似乎是相同的思路滑行。此信息来自壁画docs