Lottie 中文文档 下载 App

Jetpack Compose 集成——LottieAnimation Compose 函数

依赖

implementation "com.airbnb.android:lottie-compose:6.5.0"

基本用法

@Composable
fun LoadingScreen() {
    val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.loading))
    val progress by animateLottieCompositionAsState(
        composition = composition,
        iterations = LottieConstants.IterateForever,
    )

    LottieAnimation(
        composition = composition,
        progress = { progress },
        modifier = Modifier.size(200.dp),
    )
}

三个核心函数

rememberLottieComposition

从各种来源加载 JSON 并解析为 LottieComposition:

// 从 raw 资源
rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.loading))

// 从 assets
rememberLottieComposition(LottieCompositionSpec.Asset("loading.json"))

// 从 URL(异步加载)
rememberLottieComposition(LottieCompositionSpec.Url("你的 CDN 托管地址"))

// 从原始 JSON 字符串
rememberLottieComposition(LottieCompositionSpec.JsonString("""{...}"""))

返回的 composition 是 State<LottieComposition?>——加载过程中是 null,加载完才有值。

animateLottieCompositionAsState

创建动画进度的 State,自动处理循环、倍速、播放方向:

val progress by animateLottieCompositionAsState(
    composition = composition,
    iterations = 3,              // 循环 3 次
    speed = 1.5f,                // 倍速
    direction = LottieDirection.POSITIVE,
    isPlaying = true,            // 手动控制播放
    restartOnPlay = true,
    clipsPerLoop = null,         // 只播放部分帧
)

LottieAnimation

渲染组件,接受 composition 和 progress:

LottieAnimation(
    composition = composition,
    progress = { progress },       // 进度回调,每帧调用
    modifier = Modifier.size(200.dp),
    alignment = Alignment.Center,
    clipSpec = null,               // 可选的裁切面
)

手动控制播放

如果需要手动控制(比如点击播放、按状态跳转),可以用 animateLottieCompositionAsState 的 isPlaying 参数:

var isPlaying by remember { mutableStateOf(true) }

val progress by animateLottieCompositionAsState(
    composition = composition,
    iterations = LottieConstants.IterateForever,
    isPlaying = isPlaying,
)

Button(onClick = { isPlaying = !isPlaying }) {
    Text(if (isPlaying) "暂停" else "播放")
}

加载状态处理

composition 加载过程中是 null,要做 null 检查:

@Composable
fun LoadingScreen() {
    val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.loading))

    if (composition != null) {
        val progress by animateLottieCompositionAsState(
            composition = composition!!,
            iterations = LottieConstants.IterateForever,
        )
        LottieAnimation(
            composition = composition!!,
            progress = { progress },
        )
    } else {
        // 加载中的占位
        CircularProgressIndicator()
    }
}