下图可以帮助您确定要使用哪种 API 来实现您的动画效果。

使用以下决策树为您的用例选择最合适的动画 API:
- 您的动画是基于艺术素材(即 SVG 或图片)的吗?
- 是:它是否使用简单的 SVG(即带有微动画的图标)?
- 是:
AnimatedVectorDrawable
。 - 否:第三方动画框架,例如
Lottie
。
- 是:
- 否:动画是否需要无限重复?
- 是:
rememberInfiniteTransition
。 - 否:您是否要为布局添加动画效果?
- 是:您是否在具有不同内容的可组合项之间切换?
- 是:您是否使用 Navigation-Compose?
- 可以:
composable()
,并设置了enterTransition
和exitTransition
。 - 否:
AnimatedContent
、Crossfade
或Pager
。
- 可以:
- 否:您是否要为内容的出现或消失添加动画效果?
- 可以:将
AnimatedVisibility
或animateFloatAsState
与Modifier.alpha()
结合使用。 - 否:您是否要为大小变化添加动画效果?
- 是:
Modifier.animateContentSize
。 - 否:您是否为其他布局属性(例如偏移或内边距)添加了动画效果?
- 是:请参阅“属性是否完全独立?”。
- 否:您是否为列表项添加了动画效果?
- 是:
- 可以:将
- 是:您是否使用 Navigation-Compose?
- 否:您是否要为多个属性添加动画效果?
- 是:这些属性是否完全独立?
- 是:
animate*AsState
。对于文本,请使用TextMotion.Animated
。 - 否:它们是否需要同时开始?
- 可以:
updateTransition
与AnimatedVisibility
、animateFloat
、animateInt
等搭配使用 - 否:使用挂起函数以不同的时间调用
animateTo
的Animatable
。
- 可以:
- 是:
- 否:动画是否具有预定义的目标值?
- 是:
animate*AsState
。对于文本,请使用TextMotion.Animated
。 - 否:动画是否由手势驱动且是唯一的可信来源?
- 是:
Animatable
与animateTo
/snapTo
搭配使用。 - 否:动画是否为一次性动画,且无状态管理?
- 是:
AnimationState
或animate
。 - 否:答案不在这里?提交功能请求。
- 是:
- 是:
- 是:
- 是:这些属性是否完全独立?
- 是:您是否在具有不同内容的可组合项之间切换?
- 是:
- 是:它是否使用简单的 SVG(即带有微动画的图标)?
下载该图的 PDF 版本。