Merge remote-tracking branch 'origin/master' into gpeal/lottie-animation-layout-modifier
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt
index 7f8b83a..bb7a84c 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt
@@ -4,7 +4,6 @@
import androidx.annotation.FloatRange
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -76,7 +75,7 @@
Canvas(
modifier = modifier
- .fillMaxSize()
+ .lottieLayout(composition)
) {
drawIntoCanvas { canvas ->
val compositionSize = Size(composition.bounds.width().toFloat(), composition.bounds.height().toFloat())
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationLayoutModifier.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationLayoutModifier.kt
new file mode 100644
index 0000000..c5d326d
--- /dev/null
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationLayoutModifier.kt
@@ -0,0 +1,50 @@
+package com.airbnb.lottie.compose
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.constrainHeight
+import androidx.compose.ui.unit.constrainWidth
+import com.airbnb.lottie.LottieComposition
+
+internal fun Modifier.lottieLayout(
+ composition: LottieComposition,
+): Modifier {
+ return this.then(LottieAnimationLayoutModifier(composition))
+}
+
+private class LottieAnimationLayoutModifier(
+ private val composition: LottieComposition,
+) : LayoutModifier {
+ override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult {
+ val wrappedConstraints = modifyConstraints(constraints)
+ val placeable = measurable.measure(wrappedConstraints)
+ return layout(placeable.width, placeable.height) {
+ placeable.placeRelative(0, 0)
+ }
+ }
+
+ /**
+ * If there is a fixed size on either the width or height, use that.
+ * If there is not, use the composition size but constraint it to the constraints.
+ */
+ private fun modifyConstraints(constraints: Constraints): Constraints {
+ val width = when {
+ constraints.hasFixedWidth -> constraints.maxWidth
+ else -> constraints.constrainWidth(composition.bounds.width())
+ }
+ val height = when {
+ constraints.hasFixedHeight -> constraints.maxHeight
+ else -> constraints.constrainHeight(composition.bounds.height())
+ }
+ return Constraints(
+ minWidth = width,
+ maxWidth = width,
+ minHeight = height,
+ maxHeight = height,
+ )
+ }
+}
\ No newline at end of file