web-dev-qa-db-ja.com

Picassoを使用して画像の読み込み中にアニメーションをフェードインする

Imageviewに画像を読み込んでいるときにフェード効果を表示したい。ピカソを使用して画像をキャッシュし、画像ビューに表示しています。私はこれをたくさん探しましたが、解決策を見つけることができませんでした。

以前に使用したことがあり、一部のバージョンでは、ロード中に画像をフェードするための.fade(int Duration)メソッドがありましたが、このメソッドはもう見つかりませんでした。

これが私が今やっていることです

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

私がこれにかなり長い間立ち往生しているのを助けてください。前もって感謝します。

18
Android

ジェイク・ウォートンの答えを引用 ここ

画像がメモリキャッシュ以外の場所から来る場合、フェードは自動的に適用されるはずです。

PicassoDrawable クラスをチェックする場合

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は、メモリ/キャッシュではなくn/wからロードされた画像に既に適用されており、FADE_DURATION = 200f; //ms

フェードを強制するには、再びジェイクウォートンの答えを引用します ここ

NoFade()を指定してから、常に画像をロードしたコールバックでアニメーションを再生できます。また、コールバックを同期的に呼び出して、アニメーションを再生する必要があるかどうかを判断することもできます。

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

簡単にできます

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

私はこれをします:

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