Android Volley - 如何动画图片加载?

urS*_*Sus 13 android animated fadein imageview android-volley

任何想法如何在图像加载时播放动画淡入淡出?现在它只是闪烁到位.我正在使用Volley工具包中的NetworkImageView.

另外,有没有办法在不使用ImageLoader.get(..)的情况下在网络图像视图上设置加载和错误位图?

谢谢!

//编辑:好的,多亏你们所有人,但是如果我们想成为完美主义者,我们应该只在从磁盘缓存加载时动画,覆盖setImageBitmap即使从 memcache中拉出也会使动画关闭

你想要做的是shouldAnimate像这样向ImageListener.onResponse 添加一个布尔值

public static ImageListener getImageListener(final ImageView view, final int defaultImageResId,
        final int errorImageResId) {
    return new ImageListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            if (errorImageResId != 0) {
                view.setImageResource(errorImageResId);
            }
        }

        @Override
        public void onResponse(ImageContainer response, boolean isImmediate, boolean shouldAnimate) {
            if (response.getBitmap() != null) {
                if (shouldAnimate) {
                    // ADDED
                    view.setAlpha(0f);
                    view.setImageBitmap(response.getBitmap());
                    view.animate().alpha(1f).setDuration(1000);
                    // END ADDED
                } else {
                    view.setImageBitmap(response.getBitmap());
                }
            } else if (defaultImageResId != 0) {
                view.setImageResource(defaultImageResId);
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这是一个设置位图的方法,无论它来自何处,因此您需要将其设置为false,以用于ImageLoader中的每个用法,除了

class BatchedImageRequest {

   private void batchResponse(String cacheKey, BatchedImageRequest request,
        final VolleyError error) {
      ...
      container.mListener.onResponse(container, false, true);
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

我已经为复制和粘贴用法创建了一个要点 - https://gist.github.com/ursusursus/5732521

ben*_*nvd 23

可以在此处找到CommonsWare答案的示例实现:https://gist.github.com/benvd/5683818.

使用a TransitionDrawable确实添加了一层额外的透支.如果你想避免这种情况,也许使用ViewPropertyAnimator可能有所帮助.

它的要点基本上是你的下面的代码片段setImageBitmap():

TransitionDrawable td = new TransitionDrawable(new Drawable[]{
        new ColorDrawable(android.R.color.transparent),
        new BitmapDrawable(getContext().getResources(), bm)
});

setImageDrawable(td);
td.startTransition(FADE_IN_TIME_MS);
Run Code Online (Sandbox Code Playgroud)

  • +1用于支持旧版Android.@Vlasto如果你想避免在缓存加载上动画,可以将这段代码放在`if(!isImmediate)`语句中的`ImageListener`的实现中. (2认同)
  • 看看TransitionDrawable源代码,看起来第一个drawable始终保持不变,除非你设置了crossfade.禁用交叉淡入淡出(默认)后,您可以在顶部的drawable中有透明区域,您可以在下面看到可绘制的区域.因此,`setCrossFadeEnabled(true)`应该在动画完成时摆脱你的透支.https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/graphics/java/android/graphics/drawable/TransitionDrawable.java (2认同)

Com*_*are 6

任何想法如何在图像加载时播放动画淡入淡出?现在它只是闪烁到位.我正在使用Volley工具包中的NetworkImageView.

关闭袖带,创建自己的子类NetworkImageView和覆盖,setImageBitmap()以在应用图像时设置alpha动画.

另外,有没有办法在不使用ImageLoader.get(..)的情况下在网络图像视图上设置加载和错误位图?

打电话,setImageBitmap()或者setImageResource()和常规打电话一样ImageView.


Dal*_*oid 5

这是动画NetworkImageView的实现。它使用ObjectAnimator淡入新下载的图像,而缓存的图像立即显示。实现非常简单-仅要求您重写两个NetworkImageView方法(setImageBitmap(Bitmap)和setImageUrl(String,ImageLoader)),它使用提供的ImageLoader来确定图像是否来自缓存。

public class AnimatedNetworkImageView extends NetworkImageView {

    private static final int ANIM_DURATION = 500;
    private boolean shouldAnimate = false;

    public AnimatedNetworkImageView(Context context) {
        super(context);
    }

    public AnimatedNetworkImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AnimatedNetworkImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        if(shouldAnimate) {
            ObjectAnimator.ofFloat(this, "alpha", 0, 1).setDuration(ANIM_DURATION).start();
        }
    }

    @Override
    public void setImageUrl(String url, ImageLoader imageLoader) {
        shouldAnimate = !imageLoader.isCached(url, 0, 0);
        super.setImageUrl(url, imageLoader);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助!