簡體   English   中英

值未更新(Jetpack Compose)

[英]value not updating (Jetpack Compose)

我正在嘗試根據自己的需要調整視頻教程。 基本上,我有一個框列表,我希望每個框都以 1 秒的延遲進行動畫處理。 我不明白為什么我的代碼不起作用。

延遲值

似乎沒有更新。 有任何想法嗎?

    @Composable
fun Rocket(
    isRocketEnabled: Boolean,
    maxWidth: Dp,
    maxHeight: Dp
) {
    val modifier: Modifier
    val delay = remember { mutableStateOf(0) }
    val tileSize = 50.dp
    if (!isRocketEnabled) {
        Modifier.offset(
            y = maxHeight - tileSize,
        )
    } else {
        val infiniteTransition = rememberInfiniteTransition()
        val positionState = infiniteTransition.animateFloat(
            initialValue = 0f,
            targetValue = 1f,
            animationSpec = infiniteRepeatable(
                animation = tween(
                    durationMillis = 2000,
                    delayMillis = delay.value,
                    easing = LinearEasing
                )
            )
        )
        modifier = Modifier.offset(
            x = (maxWidth - tileSize) * positionState.value,
            y = (maxHeight - tileSize) - (maxHeight - tileSize) * positionState.value,
        )
        listOf(
            Color(0xffDFFF00),
            Color(0xffFFBF00),
            Color(0xffFF7F50),
            Color(0xffDE3163),
            Color(0xff9FE2BF),
            Color(0xff40E0D0),
            Color(0xff6495ED),
            Color(0xffCCCCFF),
        ).forEachIndexed { index, color ->
            Box(
                modifier = modifier
                    .width(tileSize)
                    .height(tileSize)
                    .background(color = color)
            )
            delay.value += 1000
        }
    }
}

當在可組合項中記住的 state 發生更改時,整個可組合項都會重新組合。

所以要達到給定的要求,

我們可以簡單地使用Int延遲並在forEach循環中更新其值,並使用更新的延遲創建 animation,而不是使用延遲作為mutableState

.forEachIndexed { index, color ->
            Box(
                modifier = createModifier(maxWidth, maxHeight, tileSize, createAnim(delay = delay))
                    .width(tileSize)
                    .height(tileSize)
                    .background(color = color)
            )
            delay += 1000
        }

使用 animation 創建修飾符:-

fun createModifier(maxWidth: Dp, maxHeight: Dp, tileSize: Dp, positionState: State<Float>): Modifier {
    return  Modifier.offset(
        x = ((maxWidth - tileSize) * positionState.value),
        y = ((maxHeight - tileSize) - (maxHeight - tileSize) * positionState.value),
    )
}

@Composable
fun createAnim(delay: Int): State<Float> {
    val infiniteTransition = rememberInfiniteTransition()
    return infiniteTransition.animateFloat(
        initialValue = 0f,
        targetValue = 1f,
        animationSpec = infiniteRepeatable(
            animation = tween(
                durationMillis = 2000,
                delayMillis = delay,
                easing = LinearEasing
            )
        )
    )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM