android 动画DpAsState在填充喷气背包合成中的应用

olhwl3o2  于 2023-03-11  发布在  Android
关注(0)|答案(1)|浏览(144)

我正在从文档中学习animateDpAsState。我做它没有任何问题,但是我看到发生了很多重组。所以我想知道推荐的方法是什么?

@Composable
private fun PaddingViewAnimation() {
    var visible by remember { mutableStateOf(true) }
    val iconOffsetAnimation: Dp by animateDpAsState(
        if (visible) 13.dp else 0.dp, tween(1000)
    )
    PaddingViewAnimationStateLess(
        { iconOffsetAnimation },
        visible,
        onVisibleChange = {
            visible = it
        }
    )
}

填充视图动画无状态

@Composable
fun PaddingViewAnimationStateLess(
    iconOffsetAnimation: () -> Dp,
    visible: Boolean,
    onVisibleChange: (Boolean) -> Unit,
) {
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .padding(start = 16.dp, top = 16.dp)
    ) {
        Image(
            modifier = Modifier.padding(top = iconOffsetAnimation()),
            imageVector = Icons.Default.ShoppingCart,
            contentDescription = null,
        )
        Button(
            modifier = Modifier.padding(top = 10.dp),
            onClick = {
                onVisibleChange(!visible)
            },
        ) {
            Text(text = "Move Text")
        }
    }
}

当第一次按钮点击动画发生,我可以看到在布局检查器。我不知道这是正常的,或者我们可以解决这个问题。谢谢

t2a7ltrp

t2a7ltrp1#

除了设置顶部填充的动画之外,您还可以使用graphicsLayer修改器和lambda块进行不同的y平移,这会导致层属性更新,而不会触发重新组合和重新布局。
您可以将其应用于Column或每个子对象。
比如:

Column(
    modifier = Modifier
        .fillMaxWidth()
        .padding(start = 16.dp, top = 16.dp)
        .graphicsLayer { translationY = iconOffsetAnimation().toPx() }
) {
    Image(
        imageVector = Icons.Default.ShoppingCart,
        contentDescription = null,
    )
    //....
}

相关问题