scaleIn
Function
Common
public fun scaleIn(
animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow),
initialScale: Float = 0f,
transformOrigin: TransformOrigin = TransformOrigin.Center,
): EnterTransition
This scales the content as it appears, from an initial scale (defined in initialScale
) to 1f.
transformOrigin
defines the pivot point in terms of fraction of the overall size.
TransformOrigin.Center
by default. scaleIn
can be used in combination with any other type of
EnterTransition
using the plus operator (e.g. scaleIn() + slideInHorizontally()
)
Note: Scale is applied before slide. This means when using slideIn
/slideOut
with
scaleIn
/scaleOut
, the amount of scaling needs to be taken into account when sliding.
The scaling will change the visual of the content, but will not affect the layout size.
scaleIn
can be combined with expandIn
/expandHorizontally
/expandVertically
to coordinate
layout size change while scaling. For example:
Parameters
animationSpec | the animation used for the scale-out, spring by default. |
initialScale | the initial scale for the enter transition, 0 by default. |
transformOrigin | the pivot point in terms of fraction of the overall size. By default it's TransformOrigin.Center . |
Code Examples
ScaledEnterExit
@OptIn(ExperimentalAnimationApi::class)
@Composable
fun ScaledEnterExit() {
Column {
var showRed by remember { mutableStateOf(true) }
var showGreen by remember { mutableStateOf(true) }
AnimatedVisibility(
visible = showGreen,
// By Default, `scaleIn` uses the center as its pivot point. When used with a vertical
// expansion from the vertical center, the content will be growing from the center of
// the vertically expanding layout.
enter = scaleIn() + expandVertically(expandFrom = Alignment.CenterVertically),
// By Default, `scaleOut` uses the center as its pivot point. When used with an
// ExitTransition that shrinks towards the center, the content will be shrinking both
// in terms of scale and layout size towards the center.
exit = scaleOut() + shrinkVertically(shrinkTowards = Alignment.CenterVertically),
) {
Box(
Modifier.size(100.dp)
.background(color = Color.Green, shape = RoundedCornerShape(20.dp))
)
}
AnimatedVisibility(
visible = showRed,
// Scale up from the TopLeft by setting TransformOrigin to (0f, 0f), while expanding the
// layout size from Top start and fading. This will create a coherent look as if the
// scale is impacting the size.
enter =
scaleIn(transformOrigin = TransformOrigin(0f, 0f)) +
fadeIn() +
expandIn(expandFrom = Alignment.TopStart),
// Scale down from the TopLeft by setting TransformOrigin to (0f, 0f), while shrinking
// the layout towards Top start and fading. This will create a coherent look as if the
// scale is impacting the layout size.
exit =
scaleOut(transformOrigin = TransformOrigin(0f, 0f)) +
fadeOut() +
shrinkOut(shrinkTowards = Alignment.TopStart),
) {
Box(
Modifier.size(100.dp)
.background(color = Color.Red, shape = RoundedCornerShape(20.dp))
)
}
}
}