Flutter动画渲染插件lottie_native的使用

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

Flutter动画渲染插件lottie_native的使用

lottie_native 是一个用于在Flutter应用中渲染Lottie动画的插件,它利用了原生平台的库来实现动画渲染。

使用的原生平台库

  • iOS: lottie-ios
  • Android: lottie-android

这个插件是从 flutter_lottie 分叉而来的。

示例代码

以下是一个完整的示例demo,展示了如何使用 lottie_native 插件来加载和控制Lottie动画。

完整示例代码

import 'dart:async';

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

// 假设PageDragger是自定义的拖动页面组件
import 'page_dragger.dart';

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

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

class _MyAppState extends State<MyApp> {
  LottieController? controller;
  LottieController? controller2;
  late StreamController<double> newProgressStream;

  // 构造函数初始化StreamController
  _MyAppState() {
    newProgressStream = new StreamController<double>();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PageDragger(
        stream: this.newProgressStream,
        child: Scaffold(
          appBar: AppBar(
            title: const Text('Lottie'),
          ),
          body: Center(
            child: Column(
              children: <Widget>[
                SizedBox(
                  width: 150,
                  height: 150,
                  child: LottieView.fromURL(
                    url:
                        'https://raw.githubusercontent.com/airbnb/lottie-ios/master/Tests/Samples/Watermelon.json',
                    autoPlay: true, // 自动播放
                    loop: true, // 循环播放
                    reverse: true, // 反向播放
                    onViewCreated: onViewCreated, // 视图创建完成后的回调
                  ),
                ),
                TextButton(
                  child: Text("Play"),
                  onPressed: () {
                    controller?.play(); // 播放动画
                  },
                ),
                TextButton(
                  child: Text("Stop"),
                  onPressed: () {
                    controller?.stop(); // 停止动画
                  },
                ),
                TextButton(
                  child: Text("Pause"),
                  onPressed: () {
                    controller?.pause(); // 暂停动画
                  },
                ),
                TextButton(
                  child: Text("Resume"),
                  onPressed: () {
                    controller?.resume(); // 继续播放动画
                  },
                ),
                Text("From File"), // 从文件加载动画
                Container(
                  child: SizedBox(
                    width: 150,
                    height: 150,
                    child: LottieView.fromAsset(
                      filePath: "animations/newAnimation.json", // 文件路径
                      autoPlay: true, // 自动播放
                      loop: true, // 循环播放
                      reverse: true, // 反向播放
                      onViewCreated: onViewCreatedFile, // 视图创建完成后的回调
                    ),
                  ),
                ),
                TextButton(
                  child: Text("Change Color"), // 改变颜色
                  onPressed: () {
                    // 设置KeyPath的颜色
                    this.controller2?.setValue(
                          value: LOTColorValue.fromColor(
                            color: Color.fromRGBO(0, 0, 255, 1),
                          ),
                          keyPath: "body Konturen.Gruppe 1.Fläche 1",
                        );
                    // 设置KeyPath的透明度
                    this.controller2?.setValue(
                          value: LOTOpacityValue(opacity: .1),
                          keyPath: "body Konturen.Gruppe 1.Fläche 1",
                        );
                  },
                ),
                Text("Drag anywhere to change animation progress"), // 拖动以改变动画进度
              ],
            ),
          ),
        ),
      ),
    );
  }

  void onViewCreated(LottieController controller) {
    this.controller = controller;

    // 监听播放完成事件
    controller.onPlayFinished.listen((bool animationFinished) {
      print("Playback complete. Was Animation Finished? $animationFinished");
    });
  }

  void onViewCreatedFile(LottieController controller) {
    this.controller2 = controller;
    newProgressStream.stream.listen((double progress) {
      this.controller2?.setAnimationProgress(progress); // 设置动画进度
    });
  }

  void dispose() {
    super.dispose();
    newProgressStream.close(); // 关闭StreamController
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用lottie_native插件来渲染Lottie动画的示例代码。lottie_native是一个性能优化的Lottie动画渲染插件,适用于Flutter。

首先,确保你已经将lottie_native添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  lottie_native: ^x.y.z  # 请替换为最新版本号

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

使用Lottie动画

  1. 准备Lottie动画文件

    你需要一个.json格式的Lottie动画文件。这个文件可以从LottieFiles或其他资源网站下载。

  2. 创建Flutter项目并导入Lottie动画

    在你的Flutter项目中,创建一个新的Dart文件(例如main.dart),然后按照以下代码来加载和显示Lottie动画:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Lottie Native Example'),
        ),
        body: Center(
          child: LottieNativeView(
            // 指定Lottie动画文件的路径(本地文件路径或网络URL)
            filenameOrUrl: 'assets/animation.json', // 确保你的.json文件已放在assets目录下
            // 可选参数:动画循环次数,默认为1(播放一次)
            loopCount: LottieLoopCount.infinite, // 无限循环
            // 可选参数:动画速度,默认为1.0(正常速度)
            speed: 1.0,
            // 可选参数:动画的初始帧,默认为0
            initialFrame: 0,
            // 可选参数:动画是否自动播放,默认为true
            autoPlay: true,
            // 可选参数:动画尺寸,可以设置为具体尺寸或BoxFit模式
            size: Size(300, 300), // 例如设置为300x300
            // 可选参数:动画加载完成回调
            onLoad: (composition) {
              print('Lottie animation loaded');
            },
            // 可选参数:动画播放完成回调
            onAnimationFinish: () {
              print('Lottie animation finished');
            },
            // 可选参数:动画播放帧回调
            onAnimationFrame: (frameInfo) {
              // frameInfo.currentFrame: 当前帧
              // frameInfo.totalFrames: 总帧数
              print('Current frame: ${frameInfo.currentFrame}, Total frames: ${frameInfo.totalFrames}');
            },
          ),
        ),
      ),
    );
  }
}
  1. 添加Lottie动画文件到assets

    确保你的.json文件已放在assets文件夹中,并在pubspec.yaml文件中声明它:

flutter:
  assets:
    - assets/animation.json
  1. 运行项目

    现在你可以运行你的Flutter项目,你应该能够看到你的Lottie动画在屏幕上播放。

注意事项

  • lottie_native插件的性能通常比lottie-flutter更优,特别是在处理复杂动画时。
  • 确保你的Lottie动画文件是有效的.json格式。
  • 你可以根据需要调整动画的加载、播放和回调参数。

以上就是在Flutter项目中使用lottie_native插件来渲染Lottie动画的基本步骤和示例代码。希望对你有所帮助!

回到顶部