Fix: incorrect System.nano() usage leads to the animation to end prematurely (#1227)
Setting System.nanoTime() to lastFrameTimeNs outside doFrame callback may lead to negative timeSinceFrame value. This causes the animation to end right after it started.
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java b/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
index 7318f55..57c1dfa 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
@@ -83,7 +83,7 @@
}
long now = frameTimeNanos;
- long timeSinceFrame = now - lastFrameTimeNs;
+ long timeSinceFrame = lastFrameTimeNs == 0 ? 0 : now - lastFrameTimeNs;
float frameDuration = getFrameDurationNs();
float dFrames = timeSinceFrame / frameDuration;
@@ -151,7 +151,7 @@
return;
}
this.frame = MiscUtils.clamp(frame, getMinFrame(), getMaxFrame());
- lastFrameTimeNs = System.nanoTime();
+ lastFrameTimeNs = 0;
notifyUpdate();
}
@@ -202,7 +202,7 @@
running = true;
notifyStart(isReversed());
setFrame((int) (isReversed() ? getMaxFrame() : getMinFrame()));
- lastFrameTimeNs = System.nanoTime();
+ lastFrameTimeNs = 0;
repeatCount = 0;
postFrameCallback();
}
@@ -222,7 +222,7 @@
public void resumeAnimation() {
running = true;
postFrameCallback();
- lastFrameTimeNs = System.nanoTime();
+ lastFrameTimeNs = 0;
if (isReversed() && getFrame() == getMinFrame()) {
frame = getMaxFrame();
} else if (!isReversed() && getFrame() == getMaxFrame()) {