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;
     }