diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index 470523fc42522..2ffc574a974cb 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -631,13 +631,16 @@ public class ValueAnimator extends Animator { public void setCurrentFraction(float fraction) { initAnimation(); fraction = clampFraction(fraction); - long seekTime = (long) (getScaledDuration() * fraction); - long currentTime = AnimationUtils.currentAnimationTimeMillis(); - mStartTime = currentTime - seekTime; mStartTimeCommitted = true; // do not allow start time to be compensated for jank - if (!isPulsingInternal()) { - // If the animation loop hasn't started, the startTime will be adjusted in the first - // frame based on seek fraction. + if (isPulsingInternal()) { + long seekTime = (long) (getScaledDuration() * fraction); + long currentTime = AnimationUtils.currentAnimationTimeMillis(); + // Only modify the start time when the animation is running. Seek fraction will ensure + // non-running animations skip to the correct start time. + mStartTime = currentTime - seekTime; + } else { + // If the animation loop hasn't started, or during start delay, the startTime will be + // adjusted once the delay has passed based on seek fraction. mSeekFraction = fraction; } mOverallFraction = fraction; @@ -1022,7 +1025,7 @@ public class ValueAnimator extends Animator { // started-but-not-yet-reached-the-first-frame phase. mLastFrameTime = -1; mFirstFrameTime = -1; - addAnimationCallback((long) (mStartDelay * sDurationScale)); + addAnimationCallback(0); if (mStartDelay == 0 || mSeekFraction >= 0 || mReversing) { // If there's no start delay, init the animation and notify start listeners right away