web-dev-qa-db-fra.com

Insérer une animation lors du chargement de l'image à l'aide de Picasso

Je souhaite afficher un effet de fondu lors du chargement de l'image dans Imageview. J'utilise picasso pour mettre en cache l'image et l'afficher en mode d'affichage image. J'ai cherché beaucoup pour cela mais je n'ai trouvé aucune solution.

J'ai déjà utilisé auparavant et je sais que dans certaines versions, ils utilisaient la méthode .fade (int duration) pour atténuer l'image pendant le chargement, mais je ne pouvais plus trouver cette méthode.

Voici ce que je fais maintenant 

Picasso.with(context)
                .load(viewHolder.data.imageList.get(0).url)
                .networkPolicy(NetworkPolicy.OFFLINE)
                .placeholder(R.drawable.a_place_holder_list_view)
                .error(R.drawable.a_place_holder_list_view)
                .into(viewHolder.ivUser, context.loadImage(viewHolder.ivUser, viewHolder.data.imageList.get(0).url));


public Callback loadImage(RoundedImageView ivUser, String url) {
    return new callback(ivUser, url);
}

public class callback implements Callback {

    RoundedImageView imageView;
    String url;

    public callback(RoundedImageView imageView, String url) {
        this.imageView = imageView;
        this.url = url;
    }

    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        Picasso.with(BaseActivity.this)
                .load(url)
                .placeholder(R.drawable.a_place_holder_list_view)
                .error(R.drawable.a_place_holder_list_view)
                .into(imageView, new Callback() {
                    @Override
                    public void onSuccess() {

                    }

                    @Override
                    public void onError() {
                        Log.v("Picasso", "Could not fetch image");
                    }
                });
    }
}

S'il vous plaît, aidez-moi, je suis coincé dans cette affaire depuis assez longtemps… .. Merci d'avance.

18
Android

Citant la réponse de Jake Wharton ici :

Si l'image provient de n'importe où sauf la mémoire cache, le fondu devrait être appliqué automatiquement.

Si vous vérifiez la PicassoDrawable class

boolean fade = loadedFrom != MEMORY && !noFade;
if (fade) {
  this.placeholder = placeholder;
  animating = true;
  startTimeMillis = SystemClock.uptimeMillis();
}
.
.
.
@Override public void draw(Canvas canvas) {
if (!animating) {
  super.draw(canvas);
} else {
.
.
.

fade effect est déjà appliqué aux images chargées à partir de n/w et non de mémoire/cache et FADE_DURATION = 200f; //ms

Pour forcer s'estomper, citant encore la réponse de jake wharton ici :

Vous pouvez spécifier noFade (), puis lire toujours une animation dans le fichier rappel de l'image chargée. Vous pouvez également compter sur le rappel appelé synchroniquement pour déterminer si une animation doit être jouée.

final AtomicBoolean playAnimation = new AtomicBoolean(true);
Picasso.with(context).load(..).into(imageView, new Callback() {
  @Override public void onLoad() {
    if (playAnimation.get()) {
      //play fade
      Animation fadeOut = new AlphaAnimation(0, 1);
      fadeOut.setInterpolator(new AccelerateInterpolator());
      fadeOut.setDuration(1000);
      imageView.startAnimation(fadeOut);

      Animation fadeOutPlaceholder = new AlphaAnimation(1, 0);
      fadeOutPlaceholder.setInterpolator(new AccelerateInterpolator());
      fadeOutPlaceholder.setDuration(1000);
      placeHolderImageView.startAnimation(fadeOutPlaceholder);
    }
  }
  //..
});
playAnimation.set(false);
14
random

Vous pouvez simplement faire

Picasso.with(context).load(url).fetch(new Callback(){
            @Override
            public void onSuccess() {
                imageView.setAlpha(0f);
                Picasso.with(context).load(url).into(imageView);
                imageView.animate().setDuration(300).alpha(1f).start();
            }

            @Override
            public void onError() {

            }
        });
2
Qamar

Je fais ça:

Picasso.get().load(url).fit().noFade().centerInside().into(imageView, new Callback() {

                @Override
                public void onSuccess() {
                    imageView.setAlpha(0f);
                    imageView.animate().setDuration(200).alpha(1f).start();
                }

                @Override
                public void onError(Exception e) {
                }
            });
1
Mateusz Kaflowski