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