From c2333b7ef64370c545d0a6ca6ece07ce8e1ce894 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 13 Nov 2017 15:47:46 +0100 Subject: [PATCH] Add ability to override global duration scale on ValueAnimator This is needed as window animations are being ported over to use ValueAnimator, and thus ValueAnimator need to ability to support custom duration scales per object. Test: ValueAnimatorTests Bug: 64674361 Change-Id: Iea8d673b66e52866929174bbf6ca4a7ae882807b --- core/java/android/animation/ValueAnimator.java | 31 +++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index ee89ca8d55e2..cc95eb6f4ea2 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -254,6 +254,11 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio HashMap mValuesMap; /** + * If set to non-negative value, this will override {@link #sDurationScale}. + */ + private float mDurationScale = -1f; + + /** * Public constants */ @@ -579,8 +584,23 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio return this; } + /** + * Overrides the global duration scale by a custom value. + * + * @param durationScale The duration scale to set; or {@code -1f} to use the global duration + * scale. + * @hide + */ + public void overrideDurationScale(float durationScale) { + mDurationScale = durationScale; + } + + private float resolveDurationScale() { + return mDurationScale >= 0f ? mDurationScale : sDurationScale; + } + private long getScaledDuration() { - return (long)(mDuration * sDurationScale); + return (long)(mDuration * resolveDurationScale()); } /** @@ -735,7 +755,10 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio if (mSeekFraction >= 0) { return (long) (mDuration * mSeekFraction); } - float durationScale = sDurationScale == 0 ? 1 : sDurationScale; + float durationScale = resolveDurationScale(); + if (durationScale == 0f) { + durationScale = 1f; + } return (long) ((AnimationUtils.currentAnimationTimeMillis() - mStartTime) / durationScale); } @@ -1397,7 +1420,9 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio if (mStartTime < 0) { // First frame. If there is start delay, start delay count down will happen *after* this // frame. - mStartTime = mReversing ? frameTime : frameTime + (long) (mStartDelay * sDurationScale); + mStartTime = mReversing + ? frameTime + : frameTime + (long) (mStartDelay * resolveDurationScale()); } // Handle pause/resume -- 2.11.0