轻量级嵌入式系统的 Lottie 动画实现

在嵌入式 Linux 系统中实现流畅的 Lottie 动画交互

引言

Lottie 动画以其轻量级、高质量的特点,已经成为现代 UI 设计的标配。但在嵌入式 Linux 系统中实现流畅的 Lottie 动画播放,并提供精确的交互控制,却并非易事。本文将介绍如何在 TinyPiXOS 中实现可暂停/恢复的 Lottie 动画效果。

技术背景

TpGUI 是TinyPiXOS提供的轻量级 GUI 框架。它提供了 TpLottieAnimation 类来支持 Lottie 动画播放 。

TpLottieAnimation

原生的 TpLottieAnimation 类只提供了 setVisible() 方法来控制显隐,隐藏组件会让动画内容消失。

我们要实现的效果是:停止播放但保持当前帧显示。

解决方案:扩展类设计

通过继承 TpLottieAnimation 并添加独立的暂停/恢复方法:

cpp 复制代码
class PausableLottieAnimation : public TpLottieAnimation
{
public:
    void pause() {
        if (!isPaused) {
            isPaused = true;
            TpLottieAnimation::setVisible(false);  // 停止定时器
            TpWidget::setVisible(true);             // 保持可见
        }
    }
    
    void resume() {
        if (isPaused) {
            isPaused = false;
            TpLottieAnimation::setVisible(true);   // 重启定时器
        }
    }
    
    void togglePause() {
        isPaused ? resume() : pause();
    }
};

核心技巧 :利用 setVisible() 的副作用来控制定时器,但通过分别调用父类方法来分离定时器控制和可见性控制。

完整示例:点击屏幕暂停/播放

1. 自定义主窗口类

通过重写 onMousePressEvent() 捕获点击事件:

cpp 复制代码
class AnimationControlWindow : public TpMainWindow
{
protected:
    virtual bool onMousePressEvent(TpMouseEvent *event) override {
        for (auto* anim : animations) {
            anim->togglePause();
        }
        statusLabel->setText(animations[0]->paused() ? 
            "状态: 已暂停(停在当前帧)" : "状态: 播放中");
        return true;
    }
};

2. 主程序实现

cpp 复制代码
int main(int argc, char *argv[])
{
    TpApp app(argc, argv);
    AnimationControlWindow *mainWindow = new AnimationControlWindow();
    
    // 创建状态标签
    TpLabel *statusLabel = new TpLabel(mainWindow);
    statusLabel->setText("状态: 播放中 (点击屏幕暂停/播放)");
    mainWindow->statusLabel = statusLabel;
    
    // 创建多个动画
    PausableLottieAnimation *anim1 = new PausableLottieAnimation(mainWindow);
    anim1->setRect(50, 50, 300, 300);
    anim1->load("/path/to/animation1.json");
    mainWindow->addAnimation(anim1);
    
    // ... 添加更多动画 ...
    
    mainWindow->show();
    return app.run();
}

应用场景

  • 加载动画: 在数据加载时显示 Lottie 动画,完成后暂停在最后一帧
  • 交互反馈: 点击按钮时播放动画,提供视觉反馈
  • 引导页: 多个动画组成的引导流程,支持暂停/继续

总结

通过扩展 TpLottieAnimation 类,我们实现了真正的暂停功能------停止播放但保持当前帧显示。这种设计模式可以应用到其他需要精确控制的动画场景中。

完整代码已在上文展示,您可以直接在 TinyPiXOS 项目中使用。

TinyPiXOS开发者联盟

源码级支持 + 真实项目:TinyPiXOS开发者联盟招募中​。
获取开发资料
技术手册
项目官网
B 站视频

感谢支持和关注,如果对项目感兴趣,请点赞、收藏和转发!

相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
weilx12345 天前
C++笔记-文件IO-<fcntl.h>
c++
未济5 天前
linux 配置环境变量
linux
傲世仙尊5 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
Smileyqp沛沛5 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
_艾伦 耶格尔.5 天前
进程间通信
linux
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
Liuqy-055 天前
Linux IO编程——静态库、动态库
linux
吞下星星的少年·-·5 天前
C++ 萌新语法入门篇
c++·算法比赛