Flutter SVG动画播放插件flutter_svgaplayer3的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter SVG动画播放插件flutter_svgaplayer3的使用

简介

flutter_svgaplayer3 是一个扩展的轻量级动画渲染器 SVGAPlayer-Flutter。你可以使用工具从 Adobe Animate CCAdobe After Effects 导出 svga 文件,然后在移动应用程序中使用 SVGAPlayer 渲染动画。

SVGAPlayer-Flutter 原生通过 Flutter 的 CustomPainter 渲染动画,为你带来高性能且低成本的动画体验。

如果想了解更多详细信息,请访问此 网站

  • SVGAPlayer-Flutter 只支持 2.0 格式(原作者已停止维护)。
  • flutter_svgaplayer3 仅支持 3.0 格式。

使用方法

这里将介绍如何使用 flutter_svgaplayer3。如果你想知道如何导出文件,请点击 这里

添加依赖

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_svgaplayer3: ^0.0.1  # 最新版本

定位文件

SVGAPlayer 可以从 Flutter 的本地 assets 目录或远程服务器加载 svga 文件。请自行将文件添加到 pubspec.yaml 中。

超简单的使用方法

渲染动画最简单的方法是使用 SVGASimpleImage 组件。

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: SVGASimpleImage(
        resUrl: "https://github.com/yyued/SVGA-Samples/blob/master/angel.svga?raw=true",
      ),
    );
  }
}

动画会循环播放。如果你想获得更强的动画控制能力,请使用代码。

使用代码控制动画

要控制动画的渲染,你需要创建一个 SVGAAnimationController 实例,就像使用 Flutter 的常规动画一样。将其分配给 SVGAImage,使用 SVGAParser 加载并解码资源,然后使用 SVGAAnimationController 执行你想要的操作。

import 'package:flutter/material.dart';
import 'package:flutter_svgaplayer3/parser.dart';
import 'package:flutter_svgaplayer3/player.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  SVGAAnimationController animationController;

  @override
  void initState() {
    this.animationController = SVGAAnimationController(vsync: this);
    this.loadAnimation();
    super.initState();
  }

  @override
  void dispose() {
    this.animationController.dispose();
    super.dispose();
  }

  void loadAnimation() async {
    final videoItem = await SVGAParser.shared.decodeFromURL(
        "https://github.com/yyued/SVGA-Samples/blob/master/angel.svga?raw=true");
    this.animationController.videoItem = videoItem;
    this
        .animationController
        .repeat() // 尝试使用 .forward() 或 .reverse()
        .whenComplete(() => this.animationController.videoItem = null);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SVGAImage(this.animationController),
    );
  }
}

重用 MovieEntity

MovieEntityAnimationController 销毁或 AnimationController::videoItem 重置后会被销毁。

销毁后,MovieEntity 无法被重用。

如果你希望重用 MovieEntity,可以将 MovieEntity::autorelease 设置为 false

final videoItem = await SVGAParser.shared.decodeFromURL(
        "https://github.com/yyued/SVGA-Samples/blob/master/angel.svga?raw=true");
videoItem.autorelease = false;

更多关于Flutter SVG动画播放插件flutter_svgaplayer3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter SVG动画播放插件flutter_svgaplayer3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_svgaplayer3 是一个用于在 Flutter 应用中播放 SVG 动画的插件。它基于 SVGA 格式,这是一种专为动画设计的矢量图形格式,能够高效地播放复杂的动画效果。

安装

首先,你需要在 pubspec.yaml 文件中添加 flutter_svgaplayer3 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_svgaplayer3: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

  1. 导入包

    在你的 Dart 文件中导入 flutter_svgaplayer3 包:

    import 'package:flutter_svgaplayer3/flutter_svgaplayer3.dart';
  2. 使用 SVGAImage 组件

    SVGAImageflutter_svgaplayer3 提供的一个组件,用于播放 SVG 动画。你可以通过 assetnetwork 来加载动画文件。

    • 从本地资源加载动画

      SVGAImage.asset(
        'assets/animations/sample.svga',
        width: 200,
        height: 200,
      )
    • 从网络加载动画

      SVGAImage.network(
        'https://example.com/path/to/sample.svga',
        width: 200,
        height: 200,
      )
  3. 控制动画播放

    SVGAImage 组件提供了一些方法来控制动画的播放,例如 start()pause()stop() 等。

    class MyAnimationWidget extends StatefulWidget {
      [@override](/user/override)
      _MyAnimationWidgetState createState() => _MyAnimationWidgetState();
    }
    
    class _MyAnimationWidgetState extends State<MyAnimationWidget> {
      SVGAAnimationController? _controller;
    
      [@override](/user/override)
      void initState() {
        super.initState();
        _controller = SVGAAnimationController();
      }
    
      [@override](/user/override)
      void dispose() {
        _controller?.dispose();
        super.dispose();
      }
    
      [@override](/user/override)
      Widget build(BuildContext context) {
        return Column(
          children: [
            SVGAImage.asset(
              'assets/animations/sample.svga',
              width: 200,
              height: 200,
              controller: _controller,
            ),
            ElevatedButton(
              onPressed: () {
                _controller?.start();
              },
              child: Text('Start'),
            ),
            ElevatedButton(
              onPressed: () {
                _controller?.pause();
              },
              child: Text('Pause'),
            ),
            ElevatedButton(
              onPressed: () {
                _controller?.stop();
              },
              child: Text('Stop'),
            ),
          ],
        );
      }
    }
  4. 监听动画状态

    你可以通过 SVGAAnimationController 来监听动画的状态,例如动画是否完成。

    _controller?.addListener(() {
      if (_controller?.isCompleted ?? false) {
        print('Animation completed');
      }
    });

高级用法

  • 循环播放

    你可以设置动画循环播放:

    _controller?.repeat();
  • 设置播放速度

    你可以通过 speed 属性来调整动画的播放速度:

    _controller?.speed = 2.0;  // 2倍速播放
  • 自定义动画回调

    你可以通过 onCompleted 回调来处理动画完成后的逻辑:

    SVGAImage.asset(
      'assets/animations/sample.svga',
      width: 200,
      height: 200,
      onCompleted: () {
        print('Animation completed');
      },
    )

注意事项

  • SVGA 文件需要从设计工具(如 Adobe Animate、After Effects 等)导出,并转换为 .svga 格式。
  • 确保动画文件的路径正确,并且文件已经添加到 pubspec.yamlassets 部分。

示例

以下是一个完整的示例,展示了如何使用 flutter_svgaplayer3 播放 SVG 动画:

import 'package:flutter/material.dart';
import 'package:flutter_svgaplayer3/flutter_svgaplayer3.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SVGA Animation Example'),
        ),
        body: Center(
          child: MyAnimationWidget(),
        ),
      ),
    );
  }
}

class MyAnimationWidget extends StatefulWidget {
  [@override](/user/override)
  _MyAnimationWidgetState createState() => _MyAnimationWidgetState();
}

class _MyAnimationWidgetState extends State<MyAnimationWidget> {
  SVGAAnimationController? _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = SVGAAnimationController();
  }

  [@override](/user/override)
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        SVGAImage.asset(
          'assets/animations/sample.svga',
          width: 200,
          height: 200,
          controller: _controller,
          onCompleted: () {
            print('Animation completed');
          },
        ),
        SizedBox(height: 20),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                _controller?.start();
              },
              child: Text('Start'),
            ),
            SizedBox(width: 10),
            ElevatedButton(
              onPressed: () {
                _controller?.pause();
              },
              child: Text('Pause'),
            ),
            SizedBox(width: 10),
            ElevatedButton(
              onPressed: () {
                _controller?.stop();
              },
              child: Text('Stop'),
            ),
          ],
        ),
      ],
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!