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
相关产品推荐
相关产品推荐

