1

私が使用できるデザインパターンを探していますので、android recyclerViewで低品質ですばやく画像をロードしてから高画質画像を呼び出すと、後で低画質画像を書き込むことになります。 低画質の画像が最初に読み込まれ、その後に高画質が表示される場所がよく見られます。後でアンドロイドで低品質と高品質の画像を読み込む方法(WhatsAppプロファイル画像のように)

しかし、これはリサイクラビューのアダプタでどのように行われますか。今私はキャッシュと画像の読み込みにピカソを使用しています。私はviewholderでこれを行う場合

http://example.com/lowQuality.jpghttp://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プロファイル画像と同じ効果を望んでいます(品質が悪いから良い品質にフェードインする方法)。

+0

低品質と高品質の2つのバージョンのイメージがあり、次に低品質をロードしてから高品質を後でロードすることを意味しますか? –

+0

まず高品質を読み込み、低品質にサイズ変更してみてください。このデザインパターンを使用する場合は、2つのイメージをそれぞれ45kbと90kbとしましょう.1回読み込むと、135kbの2つのイメージを2回読み込むと90kbのデータがリサイズされます。 –

+0

私が本当に欲しいのは、低品質の画像がすぐに読み込まれ、数秒後に高品質に変換されるアプリで見られるその効果です。 – j2emanue

答えて

1

に基づいて画像をロードします。 サムネイルとして読み込む低解像度画像を指定できます。必要なのは次のとおりです。

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

はグライドと同じ考え方であると思われる:ここsource

+0

Frescoはメモリの問題をなくすためにはるかに優れています。しかし、とにかくあなたがここで持っているグライドの実装に関する質問。それは私のサーバーが低品質のイメージを持つべきであることを意味しますか?だからいつでも私はこの効果をしたい、Vivee Omomiが言及したように、私のサーバーは高画質と低画質の両方のイメージを持つべきです。それは正しい? – j2emanue

+0

はい、サーバーは異なる品質と異なるURLの画像を提供する必要があります。ローディング時間の利益。低品質のサムネイルでは、RecyclerViewはイメージをより高速に読み込み、サムの「上」にhdイメージをロードします。その場合、UXは素晴らしいでしょう。この動作を "エミュレート"するだけであれば、イメージのサイズ変更のために読み込み時間が何とか増加します。そして、これはあなたが正しく理解しているように、冗長な操作になります。 –

1

私は、あなたがWhatsAppプロフィールの写真のような効果を望むと思うと思います。私はプロセスがあなたのバックエンドに依存すると思う、元のサイズの画像を保持する別の方法とデフォルトで元の画像をサイズ変更/圧縮する方法がバックエンドにあるはずです。サーバー

$image = image.jpg 

$requestLowQuality = resizeThis($image) 

$requestHighQuality = $image. 

ため

例の擬似コードは、だからあなたのアプリがバックグラウンドで写真をロードする際に、低品質のデフォルトのバージョンをロードし..it $ requestLowQualityための非同期タスク要求。ユーザーが$ requestHighQualityのためにサーバーに、表示する

をAsynctask要求をクリックしたときにしかし、私は、これはのWhatsAppはないかと思います。そのため、写真がぼやけて品質になるまでしばらく待たなければなりません。

ピカソはちょうど私がGlideで解決策を見つけるのリクエストメソッド

グッドラックの仲間

+0

正確にwhatsappsプロファイルイメージがそれを行います。あなたの右。しかしこれはより複雑で、あなたは私が書いたことを書いています。質の低いリクエストの前に高品質のリクエストを完了すると言うことができるからです。私は低品質の要求などをキャンセルする必要がありますタイミング問題がある可能性があります – j2emanue

+0

あなたは非常にタイミングの問題がある可能性があります。しかしこれは、サーバーがすぐに呼び出しを処理する場合のみです。サーバーは、サイズ変更と通常の品質の両方で、これらのイメージを既にストレージに用意しておく必要があります。このプロセスは、オーバーライトできる単一のピクチャだけに適していると思います。 onclickリスナーとバックグラウンドタスクを使用するサーバーへのさまざまな要求については、ユーザーが待機するようにメッセージを設定し、これらのタスクを互いに依存させることができます。 1つは他の待機中に動作し、逆も同様です –

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

詳細情報は、私もフレスコからそれを行う方法を見つけました。この情報はフレスコ画docsです。

関連する問題