From 33d08762d8e8d32422903929ad2b72774d9f8c87 Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Thu, 10 Oct 2013 11:11:37 -0700 Subject: [PATCH] Make LayoutTransition.setInterpolator() actually do something Previously, you could set a new interpolator on a LayoutTransition object, but it wouldn't have any effect, since the value was only used at construction time. This change makes the intended behavior work, byt assigning that new interpolator to the appropriate animations when they are run. Issue #11163487 LayoutTransition.setInterpolator() has no effect Change-Id: I1b390a30c008ac2bf26491dc352e28f276357388 --- .../android/animation/LayoutTransition.java | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java index d8f9e493692d0..188408d04d947 100644 --- a/core/java/android/animation/LayoutTransition.java +++ b/core/java/android/animation/LayoutTransition.java @@ -190,14 +190,26 @@ public class LayoutTransition { private long mChangingDisappearingStagger = 0; private long mChangingStagger = 0; + /** + * Static interpolators - these are stateless and can be shared across the instances + */ + private static TimeInterpolator ACCEL_DECEL_INTERPOLATOR = + new AccelerateDecelerateInterpolator(); + private static TimeInterpolator DECEL_INTERPOLATOR = new DecelerateInterpolator(); + private static TimeInterpolator sAppearingInterpolator = ACCEL_DECEL_INTERPOLATOR; + private static TimeInterpolator sDisappearingInterpolator = ACCEL_DECEL_INTERPOLATOR; + private static TimeInterpolator sChangingAppearingInterpolator = DECEL_INTERPOLATOR; + private static TimeInterpolator sChangingDisappearingInterpolator = DECEL_INTERPOLATOR; + private static TimeInterpolator sChangingInterpolator = DECEL_INTERPOLATOR; + /** * The default interpolators used for the animations */ - private TimeInterpolator mAppearingInterpolator = new AccelerateDecelerateInterpolator(); - private TimeInterpolator mDisappearingInterpolator = new AccelerateDecelerateInterpolator(); - private TimeInterpolator mChangingAppearingInterpolator = new DecelerateInterpolator(); - private TimeInterpolator mChangingDisappearingInterpolator = new DecelerateInterpolator(); - private TimeInterpolator mChangingInterpolator = new DecelerateInterpolator(); + private TimeInterpolator mAppearingInterpolator = sAppearingInterpolator; + private TimeInterpolator mDisappearingInterpolator = sDisappearingInterpolator; + private TimeInterpolator mChangingAppearingInterpolator = sChangingAppearingInterpolator; + private TimeInterpolator mChangingDisappearingInterpolator = sChangingDisappearingInterpolator; + private TimeInterpolator mChangingInterpolator = sChangingInterpolator; /** * These hashmaps are used to store the animations that are currently running as part of @@ -905,14 +917,24 @@ public class LayoutTransition { case APPEARING: startDelay = mChangingAppearingDelay + staggerDelay; staggerDelay += mChangingAppearingStagger; + if (mChangingAppearingInterpolator != sChangingAppearingInterpolator) { + anim.setInterpolator(mChangingAppearingInterpolator); + } break; case DISAPPEARING: startDelay = mChangingDisappearingDelay + staggerDelay; staggerDelay += mChangingDisappearingStagger; + if (mChangingDisappearingInterpolator != + sChangingDisappearingInterpolator) { + anim.setInterpolator(mChangingDisappearingInterpolator); + } break; case CHANGING: startDelay = mChangingDelay + staggerDelay; staggerDelay += mChangingStagger; + if (mChangingInterpolator != sChangingInterpolator) { + anim.setInterpolator(mChangingInterpolator); + } break; } anim.setStartDelay(startDelay); @@ -1148,6 +1170,9 @@ public class LayoutTransition { anim.setTarget(child); anim.setStartDelay(mAppearingDelay); anim.setDuration(mAppearingDuration); + if (mAppearingInterpolator != sAppearingInterpolator) { + anim.setInterpolator(mAppearingInterpolator); + } if (anim instanceof ObjectAnimator) { ((ObjectAnimator) anim).setCurrentPlayTime(0); } @@ -1192,6 +1217,9 @@ public class LayoutTransition { Animator anim = mDisappearingAnim.clone(); anim.setStartDelay(mDisappearingDelay); anim.setDuration(mDisappearingDuration); + if (mDisappearingInterpolator != sDisappearingInterpolator) { + anim.setInterpolator(mDisappearingInterpolator); + } anim.setTarget(child); final float preAnimAlpha = child.getAlpha(); anim.addListener(new AnimatorListenerAdapter() {