如何在Glance Widget中使用raw目录的Lottie JSON文件实现动画?
在Glance Widget中集成raw目录的Lottie动画
核心前提
Glance Widget基于RemoteViews机制,普通Activity里直接用LottieAnimationView的实现逻辑不适用,必须使用Lottie专门为RemoteViews提供的适配方案。
实现步骤
1. 依赖配置
确保项目中引入对应依赖:
dependencies { // Glance Widget核心依赖 implementation "androidx.glance:glance-appwidget:1.0.0" // Lottie核心及RemoteViews适配依赖 implementation "com.airbnb.android:lottie:6.0.0" }
2. 创建Lottie专属RemoteViews布局
在res/layout下新建widget_lottie_layout.xml,指定raw目录的Lottie JSON文件:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.airbnb.lottie.LottieAnimationView android:id="@+id/lottie_view" android:layout_width="120dp" android:layout_height="120dp" android:layout_gravity="center" app:lottie_rawRes="@raw/your_lottie_json_file" app:lottie_loop="true" app:lottie_autoPlay="true" /> </FrameLayout>
3. 在Glance Widget中嵌入布局
在你的Glance AppWidget类的内容提供方法里,通过remoteViews加载上述布局:
class MyGlanceWidget : GlanceAppWidget() { override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { Column( modifier = GlanceModifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalAlignment = Alignment.CenterVertically ) { // 嵌入Lottie动画布局 remoteViews(R.layout.widget_lottie_layout) // 可添加其他Widget内容 Text(text = "Glance + Lottie Demo") } } } }
4. 可选:动态控制动画状态
如果需要远程控制动画播放/暂停,可通过RemoteViews操作:
fun updateLottiePlayState(context: Context, glanceId: GlanceId, isPlaying: Boolean) { val remoteViews = RemoteViews(context.packageName, R.layout.widget_lottie_layout) if (isPlaying) { remoteViews.setInt(R.id.lottie_view, "playAnimation", 0) } else { remoteViews.setInt(R.id.lottie_view, "pauseAnimation", 0) } // 更新Widget MyGlanceWidget().update(context, glanceId, remoteViews) }
常见问题排查
- 确认raw目录下的Lottie JSON文件命名符合Android资源规范(小写字母、下划线,无特殊字符)
- 检查Lottie与Glance的依赖版本是否兼容,避免版本冲突
- 若动画未自动播放,确认布局中
app:lottie_autoPlay="true"已设置,或通过代码触发播放
内容的提问来源于stack exchange,提问作者Mateusz Augustyniak
相关产品推荐
相关产品推荐

