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

横竖屏切换时如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:48:03