Flutter动画展示插件overlay_lottie的使用
Flutter动画展示插件overlay_lottie的使用
展示互动性在应用程序中非常重要,即使在执行阻塞任务(如登录)时也是如此。在这些期间,可以使用神奇的 Lottie Files 展示一个精美的动画。
虽然构建和展示动画很容易,但根据 StatefulWidget 的状态来构建它会更简单。而且如果不需要控制何时停止展示动画(例如,当动画结束、重复特定次数或任务完成时),那就更好了。
这个包提供了一个混入类,简化了在任意小部件上叠加 Lottie 动画的过程,以便在执行长时间任务时显示活动。
特性
这个混入类的基本特性包括:
-
从动画开始到结束展示一次(即 1 次循环)
-
从动画开始到结束展示多次(即多次循环)
-
在限定时间内展示动画(例如 2 秒)
-
在执行函数期间展示动画
开始使用
要开始使用此包,请将其添加到您的 pubspec.yaml
文件中:
dependencies:
overlay_lottie:
然后获取依赖项(例如 flutter pub get
),并在应用中导入它们:
import 'package:overlay_lottie/overlay_lottie.dart';
使用方法
您需要将混入类添加到您的 StatefulWidget
中,并且与 TickerProviderStateMixin
混入一起使用。然后在 build
方法中使用 buildWithLottieOverlay
函数:
class _LottieOverlayHomeState extends State<LottieOverlayHome> with TickerProviderStateMixin, OverlayLottie {
Widget build(BuildContext context) {
return Scaffold(
appBar: null,
body: buildWithLottieOverlay(
animationUrl: "https://assets6.lottiefiles.com/packages/lf20_fj8rlma5.json",
),
child: Center(
child: ElevatedButton(
onPressed: () => showLottieOverlay(repetitions: 1),
child: const Text("show Lottie")
)
)
);
}
}
这将产生以下应用:
额外信息
有多种机制和选项可以控制如何以及何时显示覆盖层:通过编程隐藏动画(即 showLottieOverlay
… hideLottieOverlay
)、在函数执行期间显示动画,或者在一段时间内显示动画。
构建覆盖层的函数接口如下:
Widget buildWithLottieOverlay({
required Widget child,
String? animationUrl,
Duration? durationPerRepetition,
int defaultNumberOfRepetitions = 1,
bool blurContent = false,
double opacity = 0.8,
VoidCallback? onHide,
fadeIn = true
})
该函数定义了过程的默认值,但其中一些值可以在展示动画时被覆盖。
child
:显示在覆盖层下的内容。animationUrl
:指向 Lottie 文件的字符串。如果以https://
或http://
开头,将使用Lottie.network
创建。否则,将被视为资源文件并使用Lottie.asset
创建。durationPerRepetition
:每次循环的持续时间。如果您有一个(例如 4 秒)的动画,但想让它在 2 秒内运行。defaultNumberOfRepetitions
(默认为 1):使用showLottieOverlay
展示动画时,动画需要循环的次数才能自动关闭。如果希望动画不自动关闭并继续重复直到调用hideLottieOverlay
,请设置此值为double.maxFinite.toInt()
。blurContent
(默认为 false):如果设置为true
,子部件将被模糊(以产生非交互的感觉)。opacity
(默认为 0.8):如果设置为 1 以外的值,子部件将通过此因子设置为半透明。onHide
:动画隐藏时调用的回调(无论是自动关闭还是使用hideLottieOverlay
函数关闭)。fadeIn
:是否在显示动画时添加淡入效果(true 淡入;false 跳过淡入)。
显示覆盖层
有多重函数用于显示覆盖层:
Future<bool> showLottieOverlay({
bool? force,
int? repetitions,
String? animationUrl,
VoidCallback? onHide
})
这是基本函数,用于展示动画 animationUrl
,循环 repetitions
次,并在动画隐藏时调用函数 onHide
。如果没有提供 repetitions
、animationUrl
或 onHide
,则它们将默认为 buildWithLottieOverlay
调用中的值。
如果动画已经正在显示,则小部件的状态不会改变,并且不会调用 onHide
。除非参数 force
设置为 true
。
该函数返回 Future<bool>
以启用函数链式执行(例如使用 then
)。未来的结果指的是动画是否已显示(即 true
)或已经显示(即 false
)。
void hideLottieOverlay([bool force = false])
此函数隐藏覆盖层并重新启用子部件。该函数旨在在调用 showLottieOverlay
后使用,但建议使用自动关闭功能(例如运行动画几次循环,或在执行函数期间)。
如果动画已经隐藏,则小部件的状态不会改变,除非参数 force
设置为 true
。
Future<bool> showLottieOverlayWhile(
Function callback,
{String? animationUrl, Duration? timeout, Function? onTimeout, VoidCallback? onHide}
)
此函数在执行 callback
期间显示 Lottie 动画 animationUrl
。可以设置 timeout
用于执行。如果执行时间超过该时间,callback
的执行将被中止,并调用 onTimeout
函数。
如果没有提供 animationUrl
或 onHide
,则它们将默认为 buildWithLottieOverlay
调用中的值。
该函数返回 Future<bool>
,在 callback
执行完毕(或中止)后解析。因此,可以使用 await
或 then
过程链式执行其他函数。此过程独立于 onHide
回调,因此两者都可能被调用并且 then
可能被执行。
结果为 true
表示动画已显示并隐藏。如果调用 showLottieOverlayWhile
时动画已经显示,则 future
的结果将被设置为 false
。
Future<bool> showLottieOverlayDuring(Duration period, {String? animationUrl, VoidCallback? onHide});
此函数在 period
时间内显示 Lottie 动画 animationUrl
。如果没有提供 animationUrl
或 onHide
,则它们将默认为 buildWithLottieOverlay
调用中的值。
实际上,这是 return showLottieOverlayWhile(() async => await Future.delayed(period), onHide: onHide, animationUrl: animationUrl)
的快捷方式。
示例代码
import 'package:flutter/material.dart';
import 'package:overlay_lottie/overlay_lottie.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Overlay Lottie Demo',
home: LottieOverlayHome(),
);
}
}
class LottieOverlayHome extends StatefulWidget {
const LottieOverlayHome({super.key});
[@override](/user/override)
State<LottieOverlayHome> createState() => _LottieOverlayHomeState();
}
class _LottieOverlayHomeState extends State<LottieOverlayHome>
with TickerProviderStateMixin, OverlayLottie {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: null,
body: buildWithLottieOverlay(
animationUrl:
"https://assets6.lottiefiles.com/packages/lf20_fj8rlma5.json",
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => showLottieOverlay(repetitions: 3),
child: const Text("show Lottie")),
ElevatedButton(
onPressed: () {
showLottieOverlayWhile(
() async {
await Future.delayed(const Duration(seconds: 3));
},
animationUrl:
"https://assets6.lottiefiles.com/packages/lf20_z3pnisgt.json",
).then((value) {
showLottieOverlay(
animationUrl:
"https://assets8.lottiefiles.com/packages/lf20_slGFhN.json");
});
},
child: const Text("simulate login")),
],
),
)),
);
}
}
更多关于Flutter动画展示插件overlay_lottie的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画展示插件overlay_lottie的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用overlay_lottie
插件来展示动画的示例代码。overlay_lottie
插件允许你在Flutter应用中轻松集成Lottie动画,并且可以通过Overlay机制在屏幕上覆盖显示这些动画。
首先,确保你已经在pubspec.yaml
文件中添加了overlay_lottie
和lottie
依赖项:
dependencies:
flutter:
sdk: flutter
overlay_lottie: ^0.4.0 # 请检查最新版本号
lottie: ^1.2.1 # 请检查最新版本号
然后,运行flutter pub get
来安装这些依赖项。
接下来,创建一个Flutter应用并展示Lottie动画。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:overlay_lottie/overlay_lottie.dart';
import 'package:lottie/lottie.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Overlay Lottie Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
OverlayEntry? _overlayEntry;
final LottieComposition? _composition;
_MyHomePageState()
: _composition = LottieComposition.asset('assets/animation.json'); // 确保你有一个Lottie动画文件在assets目录下
@override
void initState() {
super.initState();
_composition?.load().then((_) {
// 预加载动画,可以在需要时立即显示
});
}
void _showLottieOverlay() {
if (_overlayEntry != null) return;
_composition?.createAnimationController(vsync: this)!
..addStatusListener((status) {
if (status == AnimationStatus.completed) {
_overlayEntry?.remove();
_overlayEntry = null;
}
});
final renderBox = context.findRenderObject() as RenderBox;
final overlayState = Overlay.of(context)!;
_overlayEntry = OverlayEntry(
builder: (context) => Positioned(
width: renderBox.size.width * 0.8, // 自定义宽度
height: renderBox.size.height * 0.8, // 自定义高度
left: (renderBox.size.width - (renderBox.size.width * 0.8)) / 2, // 居中
top: (renderBox.size.height - (renderBox.size.height * 0.8)) / 2, // 居中
child: LottieBuilder.asset(
'assets/animation.json',
controller: _composition?.createAnimationController(vsync: this),
onLoaded: (composition) {
composition.play();
},
),
),
);
overlayState.insert(_overlayEntry!);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Overlay Lottie Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: _showLottieOverlay,
child: Text('Show Lottie Animation'),
),
),
);
}
@override
void dispose() {
_composition?.dispose();
_overlayEntry?.remove();
super.dispose();
}
}
在这个示例中:
- 我们首先在
pubspec.yaml
中添加了overlay_lottie
和lottie
依赖项。 - 在
MyApp
中设置了基本的Material应用。 - 在
MyHomePage
中,我们创建了一个按钮,当点击按钮时,会通过Overlay
显示Lottie动画。 - 使用
LottieComposition.asset
加载Lottie动画文件,并创建一个AnimationController
来控制动画。 - 使用
OverlayEntry
将动画覆盖在当前页面上,并在动画播放完成后移除OverlayEntry
。
请确保将你的Lottie动画文件(例如animation.json
)放在assets
目录下,并在pubspec.yaml
中正确声明资源:
flutter:
assets:
- assets/animation.json
这个示例展示了如何使用overlay_lottie
插件在Flutter应用中覆盖显示Lottie动画。你可以根据需要调整动画的大小、位置和触发条件。