提问人:Marco 提问时间:10/22/2023 更新时间:10/22/2023 访问量:28
每秒创建一个新的可组合元素
Create a new composable element every second
问:
我正在尝试一个每秒射出一个球的循环。 球本身有一个协程,可以动画化它的偏移量X。 下面我有一个带按钮的行,它激活了一个带有 while 循环的协程,可以发射球。我这样做的方式显然行不通:一个球被击中,仅此而已。 我怎样才能触发一个循环,让它不断射球,并且不干扰球本身的协程? 作为作曲的新手,我仍然无法弄清楚该怎么做。有人可以帮忙吗?
这是带有 Button 的 Row、coroutinge、无限 while 循环和 isLoading 更改时创建的 Ball。
val coroutineScope = rememberCoroutineScope()
var isLoading by remember { mutableStateOf(false) }
Row(
horizontalArrangement = Arrangement.End,
verticalAlignment = Alignment.Top,
modifier = Modifier
.width(noteSize * scoreLength)
.fillMaxHeight()
) {
Button(
colors = ButtonDefaults.buttonColors(containerColor = Color.Red),
onClick = {
coroutineScope.launch {
while (true){
isLoading = true
delay(1000)
isLoading = false
}
}
}) {
Text(text = "shoot")
}
if (isLoading) Ball(noteSize, noteSize / 2 + (noteSize / 2) * 8, 8, w)
}
}
这是当它被击中时向左移动的注意。作为可组合项的 Note 实际上是一个 OutlinedButton。
@Composable
fun Ball(
noteSize: Dp,
verticalOffSet: Dp,
target: Float,
) {
val coroutineScope = rememberCoroutineScope()
val offsetX = remember { Animatable(350f) }
val v = verticalOffSet.dpToPx().toInt()
OutlinedButton(
colors = ButtonDefaults.buttonColors(containerColor = Color.Red),
onClick = { },
modifier = Modifier
.offset {
IntOffset(
offsetX.value.toInt(),
v
)
}
.size(noteSize),
shape = CircleShape
) { }
coroutineScope.launch {
offsetX.animateTo(
targetValue = -target,
animationSpec = tween(durationMillis = 3000, easing = LinearEasing))
}
}
答: 暂无答案
上一个:SVA中的门级时序检查
下一个:在打瞌睡模式下延迟运行协程
评论
if (isLoading)
delay(1000)
isLoading = false