From cd2c3bacaed11c9556ed4ed0d9bdf433c1b56aeb Mon Sep 17 00:00:00 2001
From: Sam Judd
Date: Sun, 12 Oct 2014 12:30:49 -0700
Subject: [PATCH] Let animation factories be used for multiple loads
---
.../DrawableCrossFadeViewAnimationTest.java | 8 +--
.../request/animation/ViewAnimationTest.java | 14 +++--
.../bumptech/glide/BitmapRequestBuilder.java | 2 +
.../com/bumptech/glide/DrawableOptions.java | 8 +--
.../glide/DrawableRequestBuilder.java | 3 +
.../bumptech/glide/GenericRequestBuilder.java | 17 +++---
.../com/bumptech/glide/GifRequestBuilder.java | 3 +
.../DrawableCrossFadeViewAnimation.java | 53 ++++++++---------
.../request/animation/ViewAnimation.java | 59 ++++++++++++++-----
9 files changed, 101 insertions(+), 66 deletions(-)
diff --git a/library/src/androidTest/java/com/bumptech/glide/request/animation/DrawableCrossFadeViewAnimationTest.java b/library/src/androidTest/java/com/bumptech/glide/request/animation/DrawableCrossFadeViewAnimationTest.java
index 78190b3242..a4b902486f 100644
--- a/library/src/androidTest/java/com/bumptech/glide/request/animation/DrawableCrossFadeViewAnimationTest.java
+++ b/library/src/androidTest/java/com/bumptech/glide/request/animation/DrawableCrossFadeViewAnimationTest.java
@@ -4,10 +4,7 @@
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
import android.widget.ImageView;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -17,6 +14,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -34,7 +32,7 @@ public void setup() {
public void testStartsDefaultAnimationIfNoPreviousDrawableIsNotSet() {
when(harness.adapter.getView()).thenReturn(harness.view);
harness.animation.animate(harness.current, harness.adapter);
- verify(harness.view).startAnimation(any(Animation.class));
+ verify(harness.defaultAnimation).animate(eq(harness.current), eq(harness.adapter));
}
@Test
@@ -69,7 +67,7 @@ private static class CrossFadeHarness {
Drawable current = new ColorDrawable(Color.GRAY);
ViewAdapter adapter = mock(ViewAdapter.class);
ImageView view = mock(ImageView.class);
- Animation defaultAnimation = new AlphaAnimation(0f, 1f);
+ GlideAnimation defaultAnimation = mock(GlideAnimation.class);
int duration = 200;
DrawableCrossFadeViewAnimation animation = new DrawableCrossFadeViewAnimation(
defaultAnimation, duration);
diff --git a/library/src/androidTest/java/com/bumptech/glide/request/animation/ViewAnimationTest.java b/library/src/androidTest/java/com/bumptech/glide/request/animation/ViewAnimationTest.java
index 163cd53d3c..6d167a3641 100644
--- a/library/src/androidTest/java/com/bumptech/glide/request/animation/ViewAnimationTest.java
+++ b/library/src/androidTest/java/com/bumptech/glide/request/animation/ViewAnimationTest.java
@@ -1,8 +1,7 @@
package com.bumptech.glide.request.animation;
-import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
import android.widget.ImageView;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -17,19 +16,19 @@
@RunWith(RobolectricTestRunner.class)
public class ViewAnimationTest {
- private AlphaAnimation animation;
- private ViewAnimation viewAnimation;
+ private ViewAnimation
*/
public static class DrawableCrossFadeFactory implements GlideAnimationFactory {
- private Context context;
- private int defaultAnimationId;
- private Animation defaultAnimation;
- private int duration;
+ private final ViewAnimation.ViewAnimationFactory animationFactory;
+ private final int duration;
private DrawableCrossFadeViewAnimation animation;
public DrawableCrossFadeFactory() {
- this(getDefaultAnimation(), DEFAULT_DURATION);
+ this(DEFAULT_DURATION);
}
public DrawableCrossFadeFactory(int duration) {
- this(getDefaultAnimation(), duration);
+ this(new ViewAnimation.ViewAnimationFactory(new DefaultAnimationFactory()), duration);
}
public DrawableCrossFadeFactory(Context context, int defaultAnimationId, int duration) {
- this.context = context;
- this.defaultAnimationId = defaultAnimationId;
- this.duration = duration;
+ this(new ViewAnimation.ViewAnimationFactory(context, defaultAnimationId), duration);
}
public DrawableCrossFadeFactory(Animation defaultAnimation, int duration) {
- this.defaultAnimation = defaultAnimation;
+ this(new ViewAnimation.ViewAnimationFactory(defaultAnimation), duration);
+ }
+
+ DrawableCrossFadeFactory(ViewAnimation.ViewAnimationFactory animationFactory, int duration) {
+ this.animationFactory = animationFactory;
this.duration = duration;
}
@@ -73,9 +65,7 @@ public GlideAnimation build(boolean isFromMemoryCache, boolean isFirstResourc
}
if (animation == null) {
- if (defaultAnimation == null) {
- defaultAnimation = AnimationUtils.loadAnimation(context, defaultAnimationId);
- }
+ GlideAnimation defaultAnimation = animationFactory.build(false, isFirstResource);
animation = new DrawableCrossFadeViewAnimation(defaultAnimation, duration);
}
@@ -86,12 +76,10 @@ public GlideAnimation build(boolean isFromMemoryCache, boolean isFirstResourc
/**
* Constructor that takes a default animation and a duration in milliseconds that the cross fade animation should
* last.
- * @param defaultAnimation The default animation that will run if there is nothing to cross fade from when a new
- * {@link android.graphics.drawable.Drawable} is set.
* @param duration The duration that the cross fade animation should run if there is something to cross fade from
* when a new {@link android.graphics.drawable.Drawable} is set.
*/
- public DrawableCrossFadeViewAnimation(Animation defaultAnimation, int duration) {
+ public DrawableCrossFadeViewAnimation(GlideAnimation defaultAnimation, int duration) {
this.defaultAnimation = defaultAnimation;
this.duration = duration;
}
@@ -119,11 +107,18 @@ public boolean animate(T current, ViewAdapter adapter) {
adapter.setDrawable(transitionDrawable);
return true;
} else {
- View view = adapter.getView();
- if (view != null) {
- view.startAnimation(defaultAnimation);
- }
+ defaultAnimation.animate(current, adapter);
return false;
}
}
+
+ private static class DefaultAnimationFactory implements ViewAnimation.AnimationFactory {
+
+ @Override
+ public Animation build() {
+ AlphaAnimation animation = new AlphaAnimation(0f, 1f);
+ animation.setDuration(DEFAULT_DURATION / 2);
+ return animation;
+ }
+ }
}
diff --git a/library/src/main/java/com/bumptech/glide/request/animation/ViewAnimation.java b/library/src/main/java/com/bumptech/glide/request/animation/ViewAnimation.java
index 72fc8b7d17..aeea718789 100644
--- a/library/src/main/java/com/bumptech/glide/request/animation/ViewAnimation.java
+++ b/library/src/main/java/com/bumptech/glide/request/animation/ViewAnimation.java
@@ -14,14 +14,13 @@
*/
public class ViewAnimation implements GlideAnimation {
- private final Animation animation;
+ private final AnimationFactory animationFactory;
/**
* Constructs a new ViewAnimation that will start the given {@link android.view.animation.Animation}.
- * @param animation The animation to use.
*/
- public ViewAnimation(Animation animation) {
- this.animation = animation;
+ ViewAnimation(AnimationFactory animationFactory) {
+ this.animationFactory = animationFactory;
}
/**
@@ -39,7 +38,7 @@ public boolean animate(R current, ViewAdapter adapter) {
View view = adapter.getView();
if (view != null) {
view.clearAnimation();
-
+ Animation animation = animationFactory.build();
view.startAnimation(animation);
}
@@ -50,18 +49,19 @@ public boolean animate(R current, ViewAdapter adapter) {
* A {@link com.bumptech.glide.request.animation.GlideAnimationFactory} that produces ViewAnimations.
*/
public static class ViewAnimationFactory implements GlideAnimationFactory {
- private Animation animation;
- private Context context;
- private int animationId;
+ private final AnimationFactory animationFactory;
private GlideAnimation glideAnimation;
public ViewAnimationFactory(Animation animation) {
- this.animation = animation;
+ this(new ConcreteAnimationFactory(animation));
}
public ViewAnimationFactory(Context context, int animationId) {
- this.context = context;
- this.animationId = animationId;
+ this(new ResourceAnimationFactory(context, animationId));
+ }
+
+ ViewAnimationFactory(AnimationFactory animationFactory) {
+ this.animationFactory = animationFactory;
}
/**
@@ -80,13 +80,42 @@ public GlideAnimation build(boolean isFromMemoryCache, boolean isFirstResourc
}
if (glideAnimation == null) {
- if (animation == null) {
- animation = AnimationUtils.loadAnimation(context, animationId);
- }
- glideAnimation = new ViewAnimation(animation);
+ glideAnimation = new ViewAnimation(animationFactory);
}
return glideAnimation;
}
}
+
+ private static class ConcreteAnimationFactory implements AnimationFactory {
+ private final Animation animation;
+
+ public ConcreteAnimationFactory(Animation animation) {
+ this.animation = animation;
+ }
+
+ @Override
+ public Animation build() {
+ return animation;
+ }
+ }
+
+ private static class ResourceAnimationFactory implements AnimationFactory {
+ private final Context context;
+ private final int animationId;
+
+ public ResourceAnimationFactory(Context context, int animationId) {
+ this.context = context.getApplicationContext();
+ this.animationId = animationId;
+ }
+
+ @Override
+ public Animation build() {
+ return AnimationUtils.loadAnimation(context, animationId);
+ }
+ }
+
+ interface AnimationFactory {
+ Animation build();
+ }
}