13

画像の読み込み時にアニメーションでフェードを再生する方法はありますか? 今は点滅するだけです。Volley ツールキットの NetworkImageView を使用しています。

また、 ImageLoader.get( .. ) を使用せずに、ネットワーク イメージ ビューで読み込みビットマップとエラー ビットマップを設定する方法はありますか?

ありがとう!

//EDIT :わかりました、皆さんありがとうございます。しかし、完璧主義者になりたい場合は、ディスク キャッシュからロードする場合にのみアニメーション化する必要があります。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);
            }
        }
    };
}

これは、ビットマップがどこからのものかに関係なく、ビットマップを設定するメソッドです。

class BatchedImageRequest {

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

コピー&ペーストの使用のための Gist を作成しました - https://gist.github.com/ursusursus/5732521

4

6 に答える 6

23

CommonsWare の回答の実装例は、https ://gist.github.com/benvd/5683818 にあります。

を使用するTransitionDrawableと、オーバードローのレイヤーが追加されます。それを避けたい場合は、おそらく a を使用する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);
于 2013-06-05T09:43:00.627 に答える
6

画像の読み込み時にアニメーションでフェードを再生する方法はありますか? 今は点滅するだけです。Volley ツールキットの NetworkImageView を使用しています。

すぐに、独自のサブクラスを作成してNetworkImageViewオーバーライドsetImageBitmap()し、画像が適用されたときにアルファ アニメーションを設定します。

また、 ImageLoader.get( .. ) を使用せずに、ネットワーク イメージ ビューで読み込みビットマップとエラー ビットマップを設定する方法はありますか?

通常の と同じようにsetImageBitmap()orを呼び出します。setImageResource()ImageView

于 2013-05-27T18:10:41.630 に答える
5

これは、アニメーション NetworkImageView の私の実装です。ObjectAnimator を使用して新しくダウンロードした画像をフェードインし、キャッシュされた画像をすぐに表示します。実装は非常にシンプルです - 2 つの 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);
    }
}

これが誰かを助けることを願っています!

于 2014-05-03T01:49:55.560 に答える
1

また、 ImageLoader.get( .. ) を使用せずに、ネットワーク イメージ ビューで読み込みビットマップとエラー ビットマップを設定する方法はありますか?

NetworkImageView には、次の 2 つの操作のためのメソッドがあります。

mNetworkImageView.setErrorImageResId(R.drawable.errorImageResourceId);
mNetworkImageView.setDefaultImageResId(R.drawable.loadingImageResourceId);
于 2013-08-30T13:23:53.127 に答える
0

画像や Glide の読み込みには Picasso lib を使用することをお勧めします。画像とアニメーションをロードするには、次のライブラリで Picasso を使用します: com.github.florent37:materialimageloading solution like this..

Picasso.with(this).load(bannerUrl).fit().centerCrop().into(bannerImage, new Callback() {

        @Override
        public void onSuccess() {
            MaterialImageLoading.animate(bannerImage).setDuration(2000).start();
        }

        @Override
        public void onError() {

        }
    });

画像の読み込みに認証が必要な場合は、このように Glide を使用します。

        GlideUrl glideUrl = new GlideUrl(bannerUrl, new LazyHeaders.Builder()
            .addHeader("username", "heyyou")
            .addHeader("password", "heyyou")
            .build());
    Glide.with(this).load(bannerUrl)
            .centerCrop()
            .crossFade(5000)
            .into(bannerImage);

さらに、認証用のピカソにはインターセプターのものがありますが、私はグライドを使用しました。たぶんこれが役立ちます..

于 2015-07-30T16:31:11.503 に答える
0

のこのバージョンはNetworkImageView、画像がキャッシュにある場合に設定された URL で ImageLoader をチェックし、アニメーションを無効にします。@DalvikDroid の回答とは対照的に、これはキャッシュの with/height/scalingType パラメータも尊重します。

/**
 * NetworkImageView that fades-in the drawable upon complete download
 */
public class AnimatedNetworkImageView extends NetworkImageView {
    private static final int ANIM_DURATION = 500;
    private boolean shouldAnimate = true;

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

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

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

    private void init() {
        shouldAnimate = true; // animate by default. Only when {@link #determineIfAnimationIsNecessary} is called animation is dependent upon cache status
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        if (shouldAnimate) {
            // your animation. Here with ObjectAnimator for example
            ObjectAnimator.ofFloat(this, "alpha", 0, 1).setDuration(ANIM_DURATION).start();
        }
    }

    @Override
    public void setImageUrl(String url, ImageLoader imageLoader) {
        shouldAnimate = determineIfAnimationIsNecessary(url, imageLoader);
        super.setImageUrl(url, imageLoader);
    }

    /**
     * checks if for the given imgUrl and imageLoader the view should animate when a bitmap is set.
     * If this method is called before {@link NetworkImageView#setImageUrl(String, ImageLoader)} is called the view would not be animated if the image comes from the cache.
     *
     * @param imgUrl      the image url
     * @param imageLoader the image loader
     */
    public boolean determineIfAnimationIsNecessary(String imgUrl, ImageLoader imageLoader) {
        int width = getWidth();
        int height = getHeight();
        ScaleType scaleType = getScaleType();

        boolean wrapWidth = false, wrapHeight = false;
        if (getLayoutParams() != null) {
            wrapWidth = getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT;
            wrapHeight = getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT;
        }

        // Calculate the max image width / height to use while ignoring WRAP_CONTENT dimens.
        int maxWidth = wrapWidth ? 0 : width;
        int maxHeight = wrapHeight ? 0 : height;

        return !imageLoader.isCached(imgUrl, maxWidth, maxHeight, scaleType);
    }
}
于 2015-12-14T11:45:06.977 に答える