android - 如何在 Jetpack Compose 中为惰性行的每个项目单独延迟可绘制动画矢量的动画
问题描述
我正在尝试将星星放入我的启动画面中,我希望它们通过延迟动画 100 毫秒顺序启动动画,但不是同时启动。我的问题是我正在使用可绘制矢量和可绘制动画矢量。我用了半天的时间在谷歌上搜索,但没有找到解决方案。这里是星星:
动画有效,但他们同时制作动画。这是我的代码:启动画面文件:
@OptIn(ExperimentalAnimationGraphicsApi::class)
@Composable
fun StarNormalList(modifier: Modifier = Modifier) {
var starPosition by remember { mutableStateOf(false) }
var animatorSequentialDelay by remember { mutableStateOf(100L) }
val set = AnimatorInflater.loadAnimator(LocalContext.current, R.animator.rotation)
LazyRow(modifier = modifier) {
items(20) {item ->
set.startDelay = animatorSequentialDelay
animatorSequentialDelay += 100L
StarNormalItem(
Modifier
.padding(10.dp)
.offset(0.dp, if (starPosition) 10.dp else (-10).dp)
.mediaQuery(
Dimensions.Width greaterThan 400.dp,
modifier = Modifier
.size(40.dp, 40.dp)
)
)
starPosition = starPosition.not()
}
}
}
@OptIn(ExperimentalAnimationGraphicsApi::class)
@Composable
fun StarNormalItem(modifier: Modifier = Modifier) {
val star = animatedVectorResource(id = R.drawable.star_normal_animated)
var atEnd by remember { mutableStateOf(false) }
Image(
painter = star.painterFor(atEnd = atEnd),
contentDescription = "star",
modifier = modifier
)
LaunchedEffect(Unit) {
atEnd = !atEnd
}
}
@OptIn(ExperimentalComposeUiApi::class, ExperimentalAnimationGraphicsApi::class)
@Composable
fun SplashScreenContent(maxWidth: Dp, maxHeight: Dp, modifier: Modifier = Modifier) {
ConstraintLayout(modifier = modifier) {
val (stars, moon, moonLight) = createRefs()
if (isSystemInDarkTheme()) {
StarNormalList(
modifier = Modifier
.constrainAs(stars) {
top.linkTo(parent.top, margin = 10.dp)
start.linkTo(parent.start)
}
)
}
}
}
明星正常动画:
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/star_normal">
<target
android:animation="@animator/rotation"
android:name="star_normal_group" />
</animated-vector>
res/animator/rotation_and_morph:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<set
android:ordering="together">
<objectAnimator
android:duration="1500"
android:interpolator="@android:interpolator/anticipate_overshoot"
android:propertyName="rotation"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<objectAnimator
android:duration="1500"
android:interpolator="@android:interpolator/anticipate_overshoot"
android:propertyName="pathData"
android:valueFrom="some path"
android:valueTo="some path"
android:valueType="pathType" />
</set>
</set>
星星以一种形式开始,然后变形为第二种形式并旋转。
解决方案
推荐阅读
- android - 父 ViewModel 与子 ViewModel 和 LiveData 共享变量
- shiny - 如何让用户名登录到shinyapps.io上托管的闪亮应用程序
- javascript - 聊天 React 中的消息顺序
- c# - 使用 aspnetcore 2.2 联合 Azure AD 登录后,User.Identity.Name 为空
- azure - 为什么新创建的 Azure 资源组需要数小时才能显示出来?
- c++ - C++ 二维数组
- sql - ORACLE SQL 用静态数字合并日期
- regex - 如何更改字符串中的不同子字符串?
- symfony - fos_user 配置的两个不同的 user_class
- facebook - Facebook 在自动化测试中测试应用使用情况