横竖屏切换时如何让Lottie Animation从停止位置继续播放而非重启
Lottie动画横竖屏切换续播解决方案
根本原因
Android默认配置下,横竖屏切换会销毁并重建当前Activity,绑定在视图树上的LottieAnimationView会重新初始化,因此动画会从头开始播放。
方案一:禁止Activity横竖屏重建(最简单方案)
适用于横竖屏布局完全一致的场景
直接修改AndroidManifest.xml中对应Activity的配置,阻止切换时Activity重建:
<activity android:name=".你的目标Activity类名" android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" />
配置后横竖屏切换时Activity不会走销毁重建流程,动画会自动从当前进度继续播放,不需要额外修改业务代码。
方案二:保存播放进度重建后恢复
适用于横竖屏需要加载不同布局的场景
1. 修改布局属性
关闭Lottie的自动播放属性,避免重建后自动从头开始播放:
<com.airbnb.lottie.LottieAnimationView android:id="@+id/animation_view" android:layout_width="wrap_content" android:layout_height="wrap_content" app:lottie_autoPlay="false" app:lottie_loop="true" app:lottie_rawRes="@raw/hello_world" />
2. 添加状态保存与恢复逻辑
在对应Activity中添加状态保存、恢复的代码即可:
Kotlin示例
class YourTargetActivity : AppCompatActivity() { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 保存动画当前的播放状态与进度 outState.putBoolean("is_anim_playing", animation_view.isAnimating) outState.putFloat("anim_progress", animation_view.progress) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_layout_name) savedInstanceState?.let { // 读取保存的状态 val isPlaying = it.getBoolean("is_anim_playing") val progress = it.getFloat("anim_progress") // 先设置进度再控制播放状态 animation_view.progress = progress if (isPlaying) { animation_view.playAnimation() } else { animation_view.pauseAnimation() } } ?: run { // 首次启动正常播放 animation_view.playAnimation() } } }
Java示例
public class YourTargetActivity extends AppCompatActivity { private LottieAnimationView animationView; @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("is_anim_playing", animationView.isAnimating()); outState.putFloat("anim_progress", animationView.getProgress()); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout_name); animationView = findViewById(R.id.animation_view); if (savedInstanceState != null) { boolean isPlaying = savedInstanceState.getBoolean("is_anim_playing"); float progress = savedInstanceState.getFloat("anim_progress"); animationView.setProgress(progress); if (isPlaying) { animationView.playAnimation(); } else { animationView.pauseAnimation(); } } else { animationView.playAnimation(); } } }
内容的提问来源于stack exchange,提问作者Android Newcomer
相关产品推荐
相关产品推荐

