我想要两个合成开始,并同时播放他们的动画.例如,这是我的设置:
LazyColumn(
.semantics(mergeDescendants = true) { contentDescription = contentDes }
) {
item {
ShimmeringComposable() // takes up a lot of the page
}
item {
Spacer()
}
item {
ShimmeringComposable() // under the fold (off the screen)
}
}
我注意到,大多数时候,第一个合成体的动画首先开始播放,然后第二个合成体的动画开始播放.如果第一个可合成的内容在布局中可见,而第二个可合成的内容在屏幕外,有时也会发生这种情况.
有没有办法让两者同步,让它们同时开始/播放动画?
此代码基于YouTube视频教程中的代码:https://www.youtube.com/watch?v=NyO99OJPPec
@Composable
fun ShimmeringComposable() {
Box(Modifier
.size(50.dp)
.shimmer()
)
}
fun Modifier.shimmer(): Modifier = composed {
var size by remember {
mutableStateOf(IntSize.Zero)
}
val width = size.width.toFloat()
val height = size.height.toFloat()
val transition = rememberInfiniteTransition()
val startOffsetX by transition.animateFloat(
initialValue = -2 * width,
targetValue = 2 * width,
animationSpec = infiniteRepeatable(
animation = tween(
durationMillis = 1000,
)
)
)
background(
brush = Brush.linearGradient(
colors = listOf(Color.gray,Color.white,Color.gray),
start = Offset(startOffsetX, 0),
end = Offset(startOffsetX + width, height)
)
).onGloballyPositioned { size = it.size }
}
更新:为清晰起见添加了更多代码
编辑:我想我知道问题出在哪里了.对于InfiniteTransition,动画从合成开始,LazyColumn将合成屏幕上可见的项目.然而,对于屏幕外的那些,直到它们进入视线(用户向下滚动)才会被合成.将所有闪闪发光的元素都包装在Column
英寸中可能会缓解这一问题,因为只要你不使用大量闪闪发光的合成material 作为柱子,就不会像LazyColumn那样具有表现力.