【问题标题】:Fade in animation while loading image Using Picasso使用毕加索加载图像时淡入动画
【发布时间】:2016-04-02 00:14:03
【问题描述】:

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

请帮助我,我已经被困了很长时间了。 提前致谢。

【问题讨论】:

标签: android fade picasso image-loading


【解决方案1】:

引用杰克沃顿的回答here

如果图像来自内存缓存以外的任何地方,则淡入淡出 应该会自动应用。

如果您检查 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

要强制淡出,再次引用杰克沃顿的回答here

你可以指定 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);

【讨论】:

  • 淡入淡出效果已应用于从 n/w 加载的图像。淡入淡出持续时间为 200 毫秒。否则如@Hourglass 所述,指定 noFade() 然后在图像加载回调中播放动画。
  • 定义淡出动画并在onLoad回调中应用。请参阅更新的答案以获取一些提示。
  • 我想要的是当我的图像被加载时,它会从占位符图像淡化为实际图像。这段代码的作用是在加载图像后将其淡化。
  • 您可以有两个重叠的图像视图。目标 imageView alpha 可以设置为 0。它下面的占位符图像视图 alpha 可以保持为 1,并且动画可以应用于两个图像视图,其中一个将 alpha 从 0 更改为 1,另一个从 1 更改为 0。或者你可以使用过渡drawable stackoverflow.com/questions/10416871/…一些想法...我只是提供了一些提示。
  • 我不明白 AtomicBoolean 的用法。为什么在调用毕加索后立即设置 false?
【解决方案2】:

你可以这样做

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() {

            }
        });

【讨论】:

    【解决方案3】:

    我这样做:

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

    【讨论】:

    • 什么是setAlpha(0f); ?
    猜你喜欢
    • 2014-09-09
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多