Jetpack Compose 动画rememberInfiniteTransition

在 Jetpack Compose 中,rememberInfiniteTransition 是一个专为无限循环动画(如加载转圈、呼吸灯、骨架屏闪烁、脉冲光效等)设计的 API。

与前面提到的那些需要外部状态触发(如点击按钮、改变布尔值)的动画不同,rememberInfiniteTransition 会在组件进入组合(Composition)时自动开始播放,并按照配置无限循环下去。

一、 核心作用与特点

  1. 自动循环播放(无需状态触发)
    它不需要你定义 var isAnimating by remember { mutableStateOf(false) } 去手动触发。只要组件显示,它就开始转动或变化。
  2. 多属性协同循环
    和 updateTransition 类似,它是一个"容器",你可以在其中创建多个子动画(如 animateFloat、animateColor、animateValue),让尺寸、颜色、透明度等多个属性同时以无限循环的方式变化。
  3. 丰富的重复模式(RepeatMode)
    通过 infiniteRepeatable,你可以轻松控制动画的循环行为:
  • RepeatMode.Restart:动画播完后瞬间重置回起点,重新开始(适合旋转动画、进度条)。
  • RepeatMode.Reverse:动画播完后反向播放回到起点(适合呼吸灯、心跳缩放)。

二、 典型使用示例

以下代码展示了如何使用 rememberInfiniteTransition 实现一个带有缩放呼吸效果和颜色渐变的脉冲加载卡片:

复制代码
@Composable
fun PulsingLoadingBox() {
    // 1. 创建无限过渡容器
    val infiniteTransition = rememberInfiniteTransition(label = "InfiniteTransition")

    // 2. 创建大小/缩放的循环子动画
    val scale by infiniteTransition.animateFloat(
        initialValue = 0.9f,
        targetValue = 1.1f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 800, easing = FastOutSlowInEasing),
            repeatMode = RepeatMode.Reverse // 往返反转(变大然后变小)
        ),
        label = "ScaleAnimation"
    )

    // 3. 创建背景颜色的循环子动画
    val color by infiniteTransition.animateColor(
        initialValue = Color.Blue,
        targetValue = Color.Magenta,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 1000),
            repeatMode = RepeatMode.Reverse
        ),
        label = "ColorAnimation"
    )

    // 4. 应用到 UI 组件
    Box(
        modifier = Modifier
            .size(100.dp)
            .scale(scale) // 应用缩放
            .background(color, shape = RoundedCornerShape(12.dp)),
        contentAlignment = Alignment.Center
    ) {
        Text(text = "Loading", color = Color.White)
    }
}
相关推荐
传奇开心果编程23 分钟前
【Flutter踩坑排雷】第25课:ScrollController 误用坑|跳转失效、监听泄漏与“控制器未附加”
android·flutter·ios·移动开发·跨平台·dart·声明式ui
慕容雪_4 小时前
Capacitor8-Android打包完整手册
android·打包·capacitor
阿杰m8 小时前
Android源码第十三章:Bluetooth——沿一次发现走到控制器
android
booboosui8 小时前
派活给另一个 AI:前后两次文件夹快照,就是交付清单
android
普通人613 小时前
MySQL_FIND_IN_SET函数详解
android·数据库·mysql
好的佩奇1 天前
Dart 之集合元素
android·flutter·dart
Easyhood1 天前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
FlightYe1 天前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
疯华整猫1 天前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
mmsx1 天前
耳切法切带洞多边形:论文能跑通,真实数据为什么崩
android·kotlin