我的目标是有一个Composable
fun(或Modifier
扩展),我可以从另一个Composable
方法调用它,这个方法将添加一个圆形的红色背景。背景应该以10%的速度缓慢增长和收缩。
这就是它现在的样子:
红色背景不动画,我想知道我的代码有什么问题。内容本身应该保持不变,红色背景应该只增长和缩小:
@Composable
fun PulsatingCircle(content: @Composable () -> Unit) {
val infiniteTransition = rememberInfiniteTransition()
val scale by infiniteTransition.animateFloat(
initialValue = 1f,
targetValue = 2f, // 2 to see if it does really something quickly
animationSpec = infiniteRepeatable(
animation = tween(1700, easing = FastOutSlowInEasing),
repeatMode = RepeatMode.Reverse
)
)
Box(
modifier = Modifier
.layout { measurable, constraints ->
val placeable = measurable.measure(constraints)
val currentHeight = placeable.height
val currentWidth = placeable.width
val newDiameter = maxOf(currentHeight, currentWidth)
val newScale = newDiameter * scale
layout(newScale.toInt(), newScale.toInt()) {
placeable.placeRelative(
((newScale - currentWidth) / 2).toInt(),
((newScale - currentHeight) / 2).toInt()
)
}
}
.background(color = Color.Red, shape = CircleShape)
) {
content()
}
}
1条答案
按热度按时间cyvaqqii1#
如果使用Layout在更改大小的同时移动兄弟节点Modifier.background()的目的应该在Modifier.layout之前,但这可以很容易地设置动画Modifier.drawBehind{drawCircle(Color.Red,radius = size*scale)}
如果您不想让内容在带洋红边框的父对象增长时移动,您也可以使用“布局”
使用修饰符.drawBehind{}
Demo