Flutter SVG动画播放插件flutter_svgaplayer3的使用
Flutter SVG动画播放插件flutter_svgaplayer3的使用
简介
flutter_svgaplayer3
是一个扩展的轻量级动画渲染器 SVGAPlayer-Flutter
。你可以使用工具从 Adobe Animate CC
或 Adobe 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
MovieEntity
在 AnimationController
销毁或 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
更多关于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
来安装依赖。
基本用法
-
导入包
在你的 Dart 文件中导入
flutter_svgaplayer3
包:import 'package:flutter_svgaplayer3/flutter_svgaplayer3.dart';
-
使用
SVGAImage
组件SVGAImage
是flutter_svgaplayer3
提供的一个组件,用于播放 SVG 动画。你可以通过asset
或network
来加载动画文件。-
从本地资源加载动画
SVGAImage.asset( 'assets/animations/sample.svga', width: 200, height: 200, )
-
从网络加载动画
SVGAImage.network( 'https://example.com/path/to/sample.svga', width: 200, height: 200, )
-
-
控制动画播放
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'), ), ], ); } }
-
监听动画状态
你可以通过
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.yaml
的assets
部分。
示例
以下是一个完整的示例,展示了如何使用 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'),
),
],
),
],
);
}
}