1920 字
10 分钟
flutter 动画实现方式
2025-10-17

TL;DR 选型建议(按场景)#

  • UI 微交互 / 可响应输入的动效(按钮、切换、角色状态)Rive(State Machine + 事件最顺手,体积小、性能稳)。(help.rive.app)
  • 来自 After Effects 的品牌级/营销动效,要求高还原PAG(libpag)(对 AE 特性覆盖更广,跨端原生渲染),AE 高阶效果不支持时也有官方“能力矩阵/替代策略”。(GitHub)
  • 轻量装饰动画(空态、引导、Icon/Logo 小动画),团队已用 AE 工作流Lottie(生态成熟、上手快,但 AE 特性有明确限制清单)。(Dart packages)
  • 炫酷过渡/滤镜/像素级特效(波纹、模糊、扭曲、粒子、转场)Fragment ShadersFragmentProgram / flutter_shaders,GPU 友好、极致性能)。(Flutter Documentation)
  • 高帧率序列帧/游戏化动效、粒子Flame 引擎的 Sprite 动画(或自建序列帧播放器)。(docs.flame-engine.org)
  • 纯 UI 过渡/入场、滚动联动Flutter 内建动画 + flutter_animate(声明式链式 API,快速产出)。(Flutter Documentation)
  • 超复杂、设计定稿的视频式动效短视频/动图(Animated WebP/APNG/GIF/视频),权衡体积与清晰度。(Flutter API Docs)

注:从 Flutter 3.x 以后,Impeller 在 Android(API 29+)/iOS 上默认启用,GPU 管线更稳定,配合 Shader/Rive/PAG 的效果与帧率普遍更好。(Flutter Documentation)


方案对比(工程视角)#

1) Shaders(片元着色器)#

  • 定位:像素级特效/转场/滤镜的终极方案;自定义程度最高。

  • 实现FragmentProgram 加载编译好的着色器(搭配 flutter_shaders 更顺手)。(Flutter Documentation)

  • 优点

    • 纯 GPU,性能/能耗比最佳,适合高帧率。
    • 可做 UI 里很难实现的“物理感/液态/扭曲/光效”。
  • 局限

    • 成本在 算法与维护;设计到工程需紧密协作。
    • 主要是 视觉特效不擅长时序/骨骼/逻辑状态管理(可与 Flutter/Rive 状态机拼装)。
  • 最佳实践:Impeller 默认开启(Android 29+),移动端 GPU 兼容性更稳。(Flutter Documentation)


2) PAG(libpag)#

  • 定位AE → 运行时的高还原路线,适合品牌动画/复杂合成。

  • 实现:用 PAG 导出的 .pag 资源 + Flutter 插件(官方 demo/社区插件)。(GitHub)

  • 优点

    • 支持平台广(Android/iOS/桌面/Web/小程序等),定位就是“把 AE 动画原生渲染到多端”。(pag.io)
    • 对 AE 特性覆盖 相对 Lottie 更广;官方提供“支持特性/降级(BMP 合成)”的说明与优化建议。(pag.io)
  • 局限

    • 生态体量 < Lottie/Rive;Flutter 侧 API 与编辑器联动相对少。
    • 交互(基于输入事件的状态逻辑)仍需你在 Flutter 管理。
  • 适用设计已定稿且要求 AE 高还原;营销级/品牌调性动画优先。


3) Lottie#

  • 定位轻量、广泛的 AE → JSON 动效;适合 UI 装饰与小动效。

  • 实现lottie Dart 包,Android/iOS/桌面/Web 都能跑。(Dart packages)

  • 优点

    • 资产/素材生态最成熟,设计→开发路径短。
    • 可做简单的 参数化(如颜色替换等),方便主题化。
  • 局限

    • AE 支持有限(大量效果/表达式/遮罩等不支持,官方有“支持特性清单”)。(LottieFiles)
    • 复杂动画容易 掉帧/吃 CPU(解析 JSON + 逐帧矢量绘制)。
  • 适用Icon/空态/Loading/引导 等轻量动效;复杂度高就考虑 PAG/Rive/视频。


4) Rive#

  • 定位实时矢量动画 + 状态机,天生为“交互式动效”设计(按钮/角色/UI 反馈)。

  • 实现.riv 资源 + Flutter runtime;编辑器内建 State Machine。(help.rive.app)

  • 优点

    • State Machine 让“输入→动画过渡”极顺手;微交互开发效率高。(help.rive.app)
    • 文件小、GPU 友好,跨端一致性好。
  • 局限

    • 不是 AE 工作流;需要设计直接用 Rive 编辑器制作或做迁移。
    • 超复杂合成/效果(AE 那种)不适合。
  • 适用交互/响应式动效(按钮、切换、手势反馈、角色状态、图标联动)。


5) 其它常用/可组合的落地方案#

  • Flutter 内建动画 + flutter_animate

    • UI 过渡、入场、滚动联动、形变/模糊/抖动等“工程侧快速动效”。
    • 声明式链式 API,上手快,可与 Shader/Rive/Lottie 组合。(Flutter Documentation)
  • Flame(Sprite 动画/粒子/游戏化特效)

    • 高帧率序列帧、粒子、碰撞、物理联动;适合 卡片翻转、战斗飘字、特效叠加 等。(docs.flame-engine.org)
  • 矢量资源编译(vector_graphics

    • 将 SVG 编译期预处理为二进制,显著降低解析开销;在你自写动画/过渡时很有用。(Code With Andrea)
  • 动图/视频(Animated WebP/APNG/GIF/短视频/VAP):

    • 极复杂效果的“所见即所得”,但体积与清晰度要权衡;Flutter 原生支持 Animated WebP/APNG/GIF。(Flutter API Docs)
    • 国内常见的 VAP(视频动效)也有 Flutter 封装,可用硬解,适合“炫酷大动效”。(Dart packages)

综合对比表(精简版)#

方案工作流/素材交互能力性能特征跨端一致性典型用法主要限制/坑
Shaders自研 Shader(GLSL → FragmentProgram)通过 uniform/输入自行管理GPU 最强,帧率/能耗优秀极好(Impeller 默认)转场/滤镜/液态/扭曲维护门槛高;不擅长状态/时序管理。(Flutter Documentation)
PAGAE → .pag需在 Flutter 管理原生渲染,复杂 AE 动画也稳很好品牌级合成/营销动画生态小于 Lottie;交互侧需自管;少量 AE 特性仍需降级。(GitHub)
LottieAE → JSON(Bodymovin)可做简单参数化/进度控制轻量为主,复杂时 CPU 压力上升Icon/Loading/空态AE 支持有限,有官方清单;复杂合成建议别硬上。(Dart packages)
RiveRive 编辑器 → .riv强(内建 State Machine)实时矢量、GPU 友好很好按钮/手势/状态机微交互不走 AE;超复杂合成不适合。(help.rive.app)
Flame/Sprite序列帧/粒子/贴图强(你掌控)高帧率,偏“游戏范”游戏化特效/序列帧资源体积、内存带宽要控。(docs.flame-engine.org)
Animated WebP/APNG/GIF/视频素材直放一般(进度/循环)解码为主;视频可硬解炫酷 DEMO/背景动效体积/清晰度权衡;透明通道与叠加要评估。(Flutter API Docs)

关键工程建议(避免踩坑)#

  1. 确认渲染后端:Android API 29+ 与 iOS 默认 Impeller,复杂动效/Shader 更稳;低版本会自动回退 OpenGL。(Flutter Documentation)

  2. AE 工作流选择

    • 轻量 → Lottie,但严格对照“支持特性清单”,对不支持的效果改方案或前置烘焙。(LottieFiles)
    • 高还原 → PAG,遇到不支持项看官方给的“能力矩阵/BMP 合成降级”建议。(pag.io)
  3. 交互优先的 UI:直接用 Rive State Machine,减少你在 Flutter 里写状态切换/插值的工作量。(help.rive.app)

  4. 性能优先

    • 复杂矢量/多层滤镜 → 优先 Shader视频化
    • 大量 SVG → 用 vector_graphics 编译期处理,降低解析开销。(Code With Andrea)
  5. 资源与首帧:预热/缓存(Lottie 的 composition、Rive 的 artboard、PAG 的实例)能显著降低首帧抖动。

  6. 组合思路:Rive 负责交互状态,Shader 做转场/滤镜,底层用 flutter_animate 管控整体入场/滚动联动,复杂品牌页用 PAG/Lottie 作为“装饰块”。


什么时候该选谁?(简明决策)#

  • “要可交互/有状态机”Rive
  • “要 AE 高还原、复杂视觉”PAG(不行再视频化)
  • “要轻量/通用 AE 工作流”Lottie
  • “要极致性能/独特视觉特效”Shaders
  • “要序列帧/粒子/游戏化”Flame/Sprite
  • “要所见即所得,不追交互”Animated WebP/APNG/视频

参考与进一步阅读#


flutter 动画实现方式
https://blog.lpkt.cn/posts/flutter-anim-approach/
作者
lollipopkit
发布于
2025-10-17
许可协议
CC BY-NC-SA 4.0