Затухание анимации при загрузке изображения с помощью Picasso
Я хочу показать эффект затухания при загрузке изображения в режиме просмотра изображений. Я использую Picasso для кэширования изображения и отображения в режиме просмотра изображений. Я много искал для этого, но не мог найти никакого решения.
Я использовал ранее, и я знаю, что в какой-то версии у них был метод.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");
}
});
}
}
Пожалуйста, помогите мне, я застрял в этом в течение довольно долгого времени. Заранее спасибо.
3 ответа
Цитирую ответ Джейка Уортона здесь:
Если изображение поступает откуда угодно, кроме кеша памяти, затухание должно применяться автоматически.
Если вы проверите 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
уже применяется для изображений, загруженных из н / ж, а не из памяти / кэша и 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.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) {
}
});
Вы можете просто сделать
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() {
}
});