You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose是否支持animation-list类型的drawable资源?

解决Jetpack Compose中使用animation-list帧动画的问题

你遇到的核心问题是:AnimatedImageVector.animatedVectorResource()仅支持加载animated-vector类型的动画资源,完全不兼容传统的animation-list帧动画,这就是导致Resources$NotFoundException的原因。要直接复用现有animation-list资源,无需转换格式,可通过Compose包装原生Android View的方式实现,具体步骤如下:

实现代码

@Composable
fun GarageIndicator() {
    // 用remember保存AnimationDrawable实例,避免重组时重复创建
    val animationDrawable = remember { mutableStateOf<AnimationDrawable?>(null) }

    AndroidView(
        factory = { context ->
            ImageView(context).apply {
                // 加载animation-list资源
                setImageResource(R.drawable.garage_door_closing_animation)
                // 获取AnimationDrawable实例
                animationDrawable.value = drawable as AnimationDrawable
            }
        },
        update = { imageView ->
            // 首次加载时自动启动动画(避免重组重复触发)
            animationDrawable.value?.takeIf { !it.isRunning }?.start()
        }
    )

    // 可选:添加动画控制逻辑(示例为启停按钮)
    // Button(onClick = {
    //     animationDrawable.value?.let {
    //         if (it.isRunning) it.stop() else it.start()
    //     }
    // }) {
    //     Text(if (animationDrawable.value?.isRunning == true) "停止动画" else "启动动画")
    // }
}

关键说明

  • AndroidView的作用:作为Compose与原生Android View的桥梁,直接复用原生ImageView加载animation-list的能力,完全兼容现有资源格式。
  • remember保存状态:避免Compose重组时重复创建AnimationDrawable,同时能在组件生命周期内持续控制动画状态。
  • 动画控制:通过AnimationDrawable的start()、stop()方法可自由控制动画启停,isRunning属性可判断当前状态。

注意事项

  • 确保animation-list及依赖的layer-list、vector资源路径正确,无资源ID错误。
  • 若需根据业务状态同步动画启停,可将动画状态与Compose的State变量绑定,实现响应式控制。

内容的提问来源于stack exchange,提问作者80sTron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:40:22