Flutter动画展示插件overlay_lottie的使用

Flutter动画展示插件overlay_lottie的使用

展示互动性在应用程序中非常重要,即使在执行阻塞任务(如登录)时也是如此。在这些期间,可以使用神奇的 Lottie Files 展示一个精美的动画。

虽然构建和展示动画很容易,但根据 StatefulWidget 的状态来构建它会更简单。而且如果不需要控制何时停止展示动画(例如,当动画结束、重复特定次数或任务完成时),那就更好了。

这个包提供了一个混入类,简化了在任意小部件上叠加 Lottie 动画的过程,以便在执行长时间任务时显示活动。

特性

这个混入类的基本特性包括:

  1. 从动画开始到结束展示一次(即 1 次循环)

  2. 从动画开始到结束展示多次(即多次循环)

  3. 在限定时间内展示动画(例如 2 秒)

  4. 在执行函数期间展示动画

开始使用

要开始使用此包,请将其添加到您的 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")
                )
            )
        );
    }
}

这将产生以下应用:

额外信息

有多种机制和选项可以控制如何以及何时显示覆盖层:通过编程隐藏动画(即 showLottieOverlayhideLottieOverlay)、在函数执行期间显示动画,或者在一段时间内显示动画。

构建覆盖层的函数接口如下:

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。如果没有提供 repetitionsanimationUrlonHide,则它们将默认为 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 函数。

如果没有提供 animationUrlonHide,则它们将默认为 buildWithLottieOverlay 调用中的值。

该函数返回 Future<bool>,在 callback 执行完毕(或中止)后解析。因此,可以使用 awaitthen 过程链式执行其他函数。此过程独立于 onHide 回调,因此两者都可能被调用并且 then 可能被执行。

结果为 true 表示动画已显示并隐藏。如果调用 showLottieOverlayWhile 时动画已经显示,则 future 的结果将被设置为 false

Future<bool> showLottieOverlayDuring(Duration period, {String? animationUrl, VoidCallback? onHide});

此函数在 period 时间内显示 Lottie 动画 animationUrl。如果没有提供 animationUrlonHide,则它们将默认为 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

1 回复

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


当然,下面是一个关于如何在Flutter中使用overlay_lottie插件来展示动画的示例代码。overlay_lottie插件允许你在Flutter应用中轻松集成Lottie动画,并且可以通过Overlay机制在屏幕上覆盖显示这些动画。

首先,确保你已经在pubspec.yaml文件中添加了overlay_lottielottie依赖项:

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();
  }
}

在这个示例中:

  1. 我们首先在pubspec.yaml中添加了overlay_lottielottie依赖项。
  2. MyApp中设置了基本的Material应用。
  3. MyHomePage中,我们创建了一个按钮,当点击按钮时,会通过Overlay显示Lottie动画。
  4. 使用LottieComposition.asset加载Lottie动画文件,并创建一个AnimationController来控制动画。
  5. 使用OverlayEntry将动画覆盖在当前页面上,并在动画播放完成后移除OverlayEntry

请确保将你的Lottie动画文件(例如animation.json)放在assets目录下,并在pubspec.yaml中正确声明资源:

flutter:
  assets:
    - assets/animation.json

这个示例展示了如何使用overlay_lottie插件在Flutter应用中覆盖显示Lottie动画。你可以根据需要调整动画的大小、位置和触发条件。

回到顶部