1

ich für ein Entwurfsmuster bin auf der Suche laden i i Bilder schnell bei niedriger Qualität und machen dann auch geladen werden kann, so dass in Android recyclerView verwenden kann Ein Anruf für ein Bild mit hoher Qualität wird über das Bild niedriger Qualität später schreiben. Ich sehe es oft, wo zuerst ein Bild niedriger Qualität geladen wird und dann die hohe Qualität erscheint.Wie niedrige Qualität und dann qualitativ hochwertiges Bild danach in Android (wie WhatsApp Profil-Bild)

Aber wie ist das im Adapter für die Recycler-Ansicht gemacht. Im Moment benutze ich Picasso für den Cache und das Laden von Bildern. so zum Beispiel hier ist ein Link zu einem Bild geringen Qualität:

http://example.com/lowQuality.jpg und ebenfalls hohe Qualität http://example.com/highQuality.jpg

Also in meinem Adapter für die recyclerView wenn ich dies tue in dem 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 ? 


     } 
    } 

so Um klar zu sein, möchte ich, dass das Bild mit niedriger Qualität zuerst angezeigt werden kann, solange das Bild mit hoher Qualität noch nicht geladen ist.

Update: Was ich wirklich will, ist dieser Effekt i auf apps sehen, wo die niedrige Bildqualität lädt schnell dann nach wenigen Sekunden auf eine höhere Qualität übergeht. Wenn es ein anderes Werkzeug oder eine andere Möglichkeit gibt, lass es mich wissen. Ich möchte den gleichen Effekt wie das Whatsapp-Profilbild (wie es von schlechter Qualität zu guter Qualität verblasst). wie WhatsApp profile pic

+0

Meinst du, dass es zwei Versionen von Bildern gibt, niedrige Qualität und hohe Qualität, dann möchten Sie zuerst niedrige Qualität und dann hohe Qualität laden? –

+0

Warum versuchen Sie nicht zuerst, hohe Qualität zu laden und dann auf niedrige Qualität zu verkleinern. Wenn Sie dieses Entwurfsmuster verwenden sagen wir die zwei Bilder 45kb und 90kb, wenn Sie einmal laden, Größe ändern, die 90kb Daten ist, wenn Sie zweimal die zwei Bilder laden, die 135kb ist. –

+0

Was ich wirklich will, ist der Effekt, den ich in Apps sehe, wo das Bild mit niedriger Qualität schnell geladen wird und nach ein paar Sekunden in eine höhere Qualität übergeht – j2emanue

Antwort

1

Ich finde Lösung mit Glide. Sie können ein Bild mit niedriger Auflösung angeben, das als Miniaturbild geladen werden soll. Alles, was Sie brauchen, ist:

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

Mehr Informationen in source hier

+0

Fresco funktioniert viel besser für die Beseitigung von Speicherproblemen, so dass ich es besser mag. Aber wie auch immer, eine Frage zur Gleit-Implementierung hast du hier. Bedeutet dies, dass mein Server ein Bild mit niedriger Qualität haben sollte. Also, wann immer ich diesen Effekt machen möchte, sollte mein Server sowohl eine hohe Qualität als auch eine niedrige Bildqualität haben, wie Vivee Omomi erwähnt. ist das richtig ? – j2emanue

+0

Ja, Ihr Server muss Bilder mit unterschiedlicher Qualität und verschiedenen URLs bereitstellen. Gewinn in Ladezeit. Mit Thumbnails von geringer Qualität lädt Ihr RecyclerView Bilder schneller und lädt dann HD-Bilder "oben" auf den Daumen. In diesem Fall wird UX großartig sein. Und wenn Sie dieses Verhalten nur "emulieren", wird die Ladezeit aufgrund der Größenanpassung des Bildes irgendwie zunehmen. Und das wird redundante Operation sein, wie ich dich richtig verstehe. –

1

Ich glaube, ich verstehe, Sie wirken wollen. Ich denke, der Prozess hängt von Ihrem Backend ab, es sollte eine Methode in Ihrem Backend geben, die das Originalbild standardmäßig skaliert/komprimiert und eine andere Methode, die das Originalbild beibehält.

Beispiel psuedocode für Server

$image = image.jpg 

$requestLowQuality = resizeThis($image) 

$requestHighQuality = $image. 

Also, wenn Sie Ihre App lädt das Bild im Hintergrund, die Async Aufgabenanfrage für $ requestLowQuality .it die niedrige Qualität Standardversion lädt. Aber wenn Benutzer klickt, um anzuzeigen, fordert eine Asynctask an den Server für $ requestHighQuality

Ich denke, das ist, wie WhatsApp tut. Deshalb muss man eine Weile warten, bis die unscharfe Abbildung zur Qualität wird.

Picasso lädt nur die Bilder basierend auf den Anforderungsmethoden

Goodluck bro

+0

genau wie whatsapps Profilbild tut es. Ihr Recht. aber das ist komplizierter als du geschrieben hast, denke ich. weil wir sagen, dass eine Anfrage mit hoher Qualität vor einer Anfrage mit niedriger Qualität endet. dann muss ich niedrige Qualitätsanforderung etc. annullieren es kann Zeitprobleme geben – j2emanue

+0

Sie haben sehr recht dort kann Zeitprobleme sein. Dies ist jedoch nur der Fall, wenn der Server sofort auf Anrufe reagiert. Der Server muss diese Bilder bereits im Speicher vorbereitet haben, sowohl in der Größe als auch in der normalen Qualität, ich denke, dass dieser Prozess nur für einzelne Bilder geeignet ist, die überschätzt werden können. Wie wäre es mit verschiedenen Anfragen an den Server mit onclick Listener und Hintergrundaufgaben, können Sie eine Nachricht einstellen, um Benutzer warten zu lassen und diese Aufgaben voneinander abhängig zu machen. Einer arbeitet, während der andere wartet und umgekehrt –

1

Ich fand auch heraus, wie es von Fresko zu tun:

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

scheint die gleiche Idee wie gleiten zu sein. Diese Information ist von Fresko docs.

Verwandte Themen