Flutter动画播放插件lottie_tgs的使用
Flutter 动画播放插件 lottie_tgs 的使用
Lottie 是一个适用于 Android 和 iOS 的移动库,它可以解析使用 Bodymovin 导出为 JSON 格式的 Adobe After Effects 动画,并在移动设备上进行原生渲染!
支持 Telegram 贴纸(tgs)格式
此存储库是 Lottie-android 库的非官方 Dart 版本。
它支持 Android、iOS、macOS、Linux、Windows 和 Web 平台。
使用方式
简单动画
以下示例展示了如何以最简单的方式显示 Lottie 动画。Lottie 小部件将加载 JSON 文件并无限循环播放动画。
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView(
children: [
// 从您的资源中加载 Lottie 文件
Lottie.asset('assets/LottieLogo1.json'),
// 从远程 URL 加载 Lottie 文件
Lottie.network(
'https://raw.githubusercontent.com/xvrh/lottie-flutter/master/example/assets/Mobilo/A.json'),
// 从 zip 文件加载动画及其图像
Lottie.asset('assets/lottiefiles/angel.zip'),
],
),
),
);
}
}
指定自定义 AnimationController
此示例展示了如何通过提供自己的 AnimationController 来完全控制动画。通过自定义的 AnimationController,您可以使用丰富的 API 控制动画的播放方式:按需开始和停止动画,正向或反向播放,循环到特定点等。
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
void main() => runApp(const MyApp());
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
late final AnimationController _controller;
[@override](/user/override)
void initState() {
super.initState();
_controller = AnimationController(vsync: this);
}
[@override](/user/override)
void dispose() {
_controller.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView(
children: [
Lottie.asset(
'assets/LottieLogo1.json',
controller: _controller,
onLoaded: (composition) {
// 配置 AnimationController 的持续时间,并开始动画。
_controller
..duration = composition.duration
..forward();
},
),
],
),
),
);
}
}
控制小部件的大小
Lottie 小部件在控制其大小方面与 Image 小部件具有相同的参数和行为。
Lottie.asset(
'assets/LottieLogo1.json',
width: 200,
height: 200,
fit: BoxFit.fill,
)
width 和 height 是可选的,如果没有指定,则会根据父容器的大小或 Lottie 动画的固有大小来决定。
自定义加载
Lottie 小部件提供了几个方便的构造函数(Lottie.asset、Lottie.network、Lottie.memory),可以自动加载、解析和缓存 JSON 文件。
有时您可能希望对文件的加载过程拥有完全控制权。可以使用 AssetLottie(或 NetworkLottie、MemoryLottie)从 JSON 文件加载 Lottie 组合。
此示例展示了如何从 JSON 文件加载和解析 Lottie 组合。
class MyWidget extends StatefulWidget {
const MyWidget({super.key});
[@override](/user/override)
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late final Future<LottieComposition> _composition;
[@override](/user/override)
void initState() {
super.initState();
_composition = AssetLottie('assets/LottieLogo1.json').load();
}
[@override](/user/override)
Widget build(BuildContext context) {
return FutureBuilder<LottieComposition>(
future: _composition,
builder: (context, snapshot) {
var composition = snapshot.data;
if (composition != null) {
return Lottie(composition: composition);
} else {
return const Center(child: CircularProgressIndicator());
}
},
);
}
}
自定义绘制
此示例深入底层,展示如何在特定帧、特定位置和大小的自定义画布上绘制 LottieComposition。
class CustomDrawer extends StatelessWidget {
final LottieComposition composition;
const CustomDrawer(this.composition, {super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return CustomPaint(
painter: _Painter(composition),
size: const Size(400, 400),
);
}
}
class _Painter extends CustomPainter {
final LottieDrawable drawable;
_Painter(LottieComposition composition)
: drawable = LottieDrawable(composition);
[@override](/user/override)
void paint(Canvas canvas, Size size) {
var frameCount = 40;
var columns = 10;
for (var i = 0; i < frameCount; i++) {
var destRect = Offset(i % columns * 50.0, i ~/ 10 * 80.0) & (size / 5);
drawable
..setProgress(i / frameCount)
..draw(canvas, destRect);
}
}
[@override](/user/override)
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
在运行时修改属性
此示例展示了如何在运行时修改动画的一些属性。这里我们更改了一些图层的文本、颜色、不透明度和位置。对于每个 ValueDelegate,我们可以提供静态的 value 或计算每个帧值的 callback。
class _Animation extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Lottie.asset(
'assets/Tests/Shapes.json',
delegates: LottieDelegates(
text: (initialText) => '**$initialText**',
values: [
ValueDelegate.color(
const ['Shape Layer 1', 'Rectangle', 'Fill 1'],
value: Colors.red,
),
ValueDelegate.opacity(
const ['Shape Layer 1', 'Rectangle'],
callback: (frameInfo) => (frameInfo.overallProgress * 100).round(),
),
ValueDelegate.position(
const ['Shape Layer 1', 'Rectangle', '**'],
relative: const Offset(100, 200),
),
],
),
);
}
}
更多关于Flutter动画播放插件lottie_tgs的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画播放插件lottie_tgs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用lottie_tgs插件来播放Lottie动画的一个示例。lottie_tgs是一个用于在Flutter应用中播放Lottie动画的插件,它支持从JSON文件或URL加载动画。
首先,确保你已经在pubspec.yaml文件中添加了lottie_tgs依赖:
dependencies:
flutter:
sdk: flutter
lottie_tgs: ^0.1.0 # 请注意版本号可能有所不同,使用最新的稳定版本
然后,运行flutter pub get来安装依赖。
接下来,你可以在你的Flutter应用中使用LottieBuilder来加载和播放Lottie动画。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:lottie_tgs/lottie_tgs.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Lottie Animation Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Lottie Animation Example'),
),
body: Center(
child: LottieAnimationExample(),
),
),
);
}
}
class LottieAnimationExample extends StatefulWidget {
@override
_LottieAnimationExampleState createState() => _LottieAnimationExampleState();
}
class _LottieAnimationExampleState extends State<LottieAnimationExample> with SingleTickerProviderStateMixin {
LottieController? _controller;
@override
void initState() {
super.initState();
// 初始化LottieController
_controller = LottieController(
animationData: AssetLottieData.fromJson(await rootBundle.loadString('assets/animation.json')),
repeat: true,
autoreverse: true,
);
}
@override
void dispose() {
// 释放LottieController资源
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: Center(
child: LottieBuilder.asset(
'assets/animation.json',
controller: _controller!,
onLoaded: (composition) {
// 动画加载完成后的回调,可以获取动画的Composition对象
print('Animation loaded');
},
onError: (error) {
// 动画加载错误时的回调
print('Error loading animation: $error');
},
),
),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 控制动画播放
if (_controller!.isPlaying) {
_controller!.pause();
} else {
_controller!.play();
}
},
child: Text(_controller!.isPlaying ? 'Pause' : 'Play'),
),
],
);
}
}
在这个示例中,我们做了以下几件事:
- 在
pubspec.yaml中添加lottie_tgs依赖。 - 在
assets文件夹中放置一个名为animation.json的Lottie动画文件,并在pubspec.yaml中声明它作为资产。 - 创建一个
LottieAnimationExample小部件,用于显示和控制Lottie动画。 - 使用
LottieController来控制动画的播放,包括循环播放、自动反转等。 - 使用
LottieBuilder.asset来加载和显示动画,并提供加载完成和加载错误的回调。 - 添加一个按钮来控制动画的播放和暂停。
请确保你已经将Lottie动画文件(例如animation.json)放置在项目的assets文件夹中,并在pubspec.yaml中正确声明它:
flutter:
assets:
- assets/animation.json
这样,你就可以在Flutter应用中成功播放和控制Lottie动画了。

