Fix start delay for ValueAnimator

This CL ensures that doAnimationFrame() is called the frame
after start() is called, so that AnimatorSet can pulse frames
 into single animators as soon as they are start()'ed.

Test: new cts test in  same topic branch

Change-Id: I4f9522ce9e1a54ca3bcad6c696e6b248c945ff90
This commit is contained in:
Doris Liu
2017-02-03 16:49:20 -08:00
parent cb07efbf74
commit 3b466875bc

View File

@@ -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