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");
}
});
}
}
私がこれにかなり長い間立ち往生しているのを助けてください。前もって感謝します。
ジェイク・ウォートンの答えを引用 ここ :
画像がメモリキャッシュ以外の場所から来る場合、フェードは自動的に適用されるはずです。
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);
簡単にできます
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() {
}
});
私はこれをします:
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) {
}
});