Skip to content

Commit f90ca31

Browse files
committed
Add support for Lottie animations to respect offsetMillis
1 parent 6a4bf91 commit f90ca31

9 files changed

+34
-10
lines changed

paparazzi/src/main/java/app/cash/paparazzi/PaparazziSdk.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,12 @@ public class PaparazziSdk @JvmOverloads constructor(
323323

324324
// If we have pendingTasks run recomposer to ensure we get the correct frame.
325325
var hasPendingWork = false
326+
327+
if (startNanos > 0) {
328+
// Initialize the choreographer at time=1 to initialize non sdk animations that rely on lastFrameTimeNanos=0 logic to track animation progress
329+
withTime(1) {}
330+
}
331+
326332
withTime(nowNanos) {
327333
val result = renderSession.render(true)
328334
if (result.status == ERROR_UNKNOWN) {

sample/src/test/java/app/cash/paparazzi/sample/LottieTest.kt

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,38 @@ package app.cash.paparazzi.sample
33
import app.cash.paparazzi.Paparazzi
44
import com.airbnb.lottie.LottieAnimationView
55
import com.airbnb.lottie.LottieCompositionFactory
6+
import com.airbnb.lottie.LottieTask
7+
import org.junit.Before
68
import org.junit.Rule
79
import org.junit.Test
10+
import java.util.concurrent.Executor
811

912
class LottieTest {
1013
@get:Rule
1114
var paparazzi = Paparazzi()
1215

16+
17+
@Before
18+
fun setup() {
19+
LottieTask.EXECUTOR = Executor(Runnable::run)
20+
}
21+
1322
@Test
1423
fun lottie() {
1524
val composition = LottieCompositionFactory.fromRawResSync(paparazzi.context, R.raw.lottie_logo)
1625
.value!!
1726
val view = LottieAnimationView(paparazzi.context)
1827
view.setComposition(composition)
19-
// view.progress = 1.0f
20-
// paparazzi.snapshot(view, "lottie logo")
28+
29+
view.playAnimation()
30+
paparazzi.snapshot(view, name = "start", offsetMillis = 0L)
31+
paparazzi.snapshot(view, name = "middle", offsetMillis = 2500L)
32+
paparazzi.snapshot(view, name = "end", offsetMillis = 5000L)
33+
view.cancelAnimation()
34+
35+
view.progress = 1.0f
36+
paparazzi.snapshot(view, "lottie logo")
37+
2138
view.playAnimation()
2239
paparazzi.gif(view, "lottie logo", start = 0L, end = 5000L, fps = 60)
2340
}
@@ -27,15 +44,16 @@ class LottieTest {
2744
val composition = LottieCompositionFactory.fromRawResSync(paparazzi.context, R.raw.masks).value!!
2845
val view = LottieAnimationView(paparazzi.context)
2946
view.setComposition(composition)
47+
view.progress = 0.0f
48+
paparazzi.snapshot(view, "masks0")
49+
50+
view.progress = 0.5f
51+
paparazzi.snapshot(view, "masks1")
52+
53+
view.progress = 1.0f
54+
paparazzi.snapshot(view, "masks2")
55+
3056
view.playAnimation()
31-
// view.progress = 0.0f
32-
// paparazzi.snapshot(view, "masks0")
33-
//
34-
// view.progress = 0.5f
35-
// paparazzi.snapshot(view, "masks1")
36-
//
37-
// view.progress = 1.0f
38-
// paparazzi.snapshot(view, "masks2")
3957
paparazzi.gif(view, "masks", start = 0L, end = 5000L, fps = 60)
4058
}
4159
}
7.83 KB
Loading
7.82 KB
Loading
7.72 KB
Loading
15.7 KB
Loading
15.7 KB
Loading
13.2 KB
Loading
3.62 KB
Loading

0 commit comments

Comments
 (0)