1package com.bumptech.glide.request;
2
3import android.content.Context;
4import android.graphics.drawable.Drawable;
5import android.graphics.drawable.TransitionDrawable;
6import android.view.View;
7import android.view.animation.AlphaAnimation;
8import android.view.animation.Animation;
9import android.view.animation.AnimationUtils;
10import com.bumptech.glide.request.target.Target;
11
12public class DrawableCrossFadeViewAnimation implements GlideAnimation<Drawable> {
13    // 150 ms.
14    public static final int DEFAULT_DURATION = 300;
15    private Animation defaultAnimation;
16    private int duration;
17
18    private static Animation getDefaultAnimation() {
19        AlphaAnimation animation = new AlphaAnimation(0f, 1f);
20        animation.setDuration(DEFAULT_DURATION / 2);
21        return animation;
22    }
23
24    public static class DrawableCrossFadeFactory implements GlideAnimationFactory<Drawable> {
25        private Context context;
26        private int defaultAnimationId;
27        private Animation defaultAnimation;
28        private int duration;
29        private DrawableCrossFadeViewAnimation animation;
30
31        public DrawableCrossFadeFactory() {
32            this(getDefaultAnimation(), DEFAULT_DURATION);
33        }
34
35        public DrawableCrossFadeFactory(int duration) {
36            this(getDefaultAnimation(), duration);
37        }
38
39        public DrawableCrossFadeFactory(Context context, int defaultAnimationId, int duration) {
40            this.context = context;
41            this.defaultAnimationId = defaultAnimationId;
42            this.duration = duration;
43        }
44
45        public DrawableCrossFadeFactory(Animation defaultAnimation, int duration) {
46            this.defaultAnimation = defaultAnimation;
47            this.duration = duration;
48        }
49
50        @Override
51        public GlideAnimation<Drawable> build(boolean isFromMemoryCache, boolean isFirstImage) {
52            if (isFromMemoryCache) {
53                return NoAnimation.get();
54            }
55
56            if (animation == null) {
57                if (defaultAnimation == null) {
58                    defaultAnimation = AnimationUtils.loadAnimation(context, defaultAnimationId);
59                }
60                animation = new DrawableCrossFadeViewAnimation(defaultAnimation, duration);
61            }
62
63            return animation;
64        }
65    }
66
67    public DrawableCrossFadeViewAnimation(Animation defaultAnimation, int duration) {
68        this.defaultAnimation = defaultAnimation;
69        this.duration = duration;
70    }
71
72    @Override
73    public boolean animate(Drawable previous, Drawable current, View view, Target<Drawable> target) {
74        if (previous != null) {
75            TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[] { previous, current });
76            transitionDrawable.setCrossFadeEnabled(true);
77            transitionDrawable.startTransition(duration);
78            GlideAnimation<Drawable> none = NoAnimation.get();
79            target.onResourceReady(transitionDrawable, none);
80            return true;
81        } else {
82            view.startAnimation(defaultAnimation);
83            return false;
84        }
85    }
86}
87