Allow progress to be set in between frames (#1261)
Fixes #1250
diff --git a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.kt b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.kt
index e5bf823..be0508e 100644
--- a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.kt
+++ b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.kt
@@ -106,6 +106,7 @@
testMarkers()
snapshotAssets()
testText()
+ testPartialFrameProgress()
snapshotProdAnimations()
snapshotter.finalizeReportAndUpload()
}
@@ -230,6 +231,28 @@
withDrawable("Tests/RGB.json", "Frame Boundary", "Frame 2 Blue") { drawable ->
drawable.frame = 2
}
+
+ withDrawable("Tests/2FrameAnimation.json", "Float Progress", "0.0") { drawable ->
+ drawable.progress = 0f
+ }
+ }
+
+ private suspend fun testPartialFrameProgress() {
+ withDrawable("Tests/2FrameAnimation.json", "Float Progress", "0") { drawable ->
+ drawable.progress = 0f
+ }
+
+ withDrawable("Tests/2FrameAnimation.json", "Float Progress", "0.25") { drawable ->
+ drawable.progress = 0.25f
+ }
+
+ withDrawable("Tests/2FrameAnimation.json", "Float Progress", "0.5") { drawable ->
+ drawable.progress = 0.5f
+ }
+
+ withDrawable("Tests/2FrameAnimation.json", "Float Progress", "1.0") { drawable ->
+ drawable.progress = 1f
+ }
}
private suspend fun snapshotScaleTypes() = withContext(Dispatchers.Main) {
diff --git a/LottieSample/src/main/assets/Tests/2FrameAnimation.json b/LottieSample/src/main/assets/Tests/2FrameAnimation.json
new file mode 100644
index 0000000..254c0c2
--- /dev/null
+++ b/LottieSample/src/main/assets/Tests/2FrameAnimation.json
@@ -0,0 +1 @@
+{"v":"5.4.4","fr":30.0000305175781,"ip":0,"op":2.00000203450521,"w":200,"h":200,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,100,0],"e":[220,218,0],"to":[20,19.667,0],"ti":[-20,-19.667,0]},{"t":1.0000010172526}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[73.287,73.287],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-61.356,-58.856],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2.00000203450521,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index ace4319..1b907e7 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -677,7 +677,7 @@
});
return;
}
- setFrame((int) MiscUtils.lerp(composition.getStartFrame(), composition.getEndFrame(), progress));
+ animator.setFrame(MiscUtils.lerp(composition.getStartFrame(), composition.getEndFrame(), progress));
}
/**
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 57c1dfa..1863899 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
@@ -146,7 +146,7 @@
setFrame((int) frame);
}
- public void setFrame(int frame) {
+ public void setFrame(float frame) {
if (this.frame == frame) {
return;
}