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,
)

widthheight 是可选的,如果没有指定,则会根据父容器的大小或 Lottie 动画的固有大小来决定。

自定义加载

Lottie 小部件提供了几个方便的构造函数(Lottie.assetLottie.networkLottie.memory),可以自动加载、解析和缓存 JSON 文件。

有时您可能希望对文件的加载过程拥有完全控制权。可以使用 AssetLottie(或 NetworkLottieMemoryLottie)从 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

1 回复

更多关于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'),
        ),
      ],
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml中添加lottie_tgs依赖。
  2. assets文件夹中放置一个名为animation.json的Lottie动画文件,并在pubspec.yaml中声明它作为资产。
  3. 创建一个LottieAnimationExample小部件,用于显示和控制Lottie动画。
  4. 使用LottieController来控制动画的播放,包括循环播放、自动反转等。
  5. 使用LottieBuilder.asset来加载和显示动画,并提供加载完成和加载错误的回调。
  6. 添加一个按钮来控制动画的播放和暂停。

请确保你已经将Lottie动画文件(例如animation.json)放置在项目的assets文件夹中,并在pubspec.yaml中正确声明它:

flutter:
  assets:
    - assets/animation.json

这样,你就可以在Flutter应用中成功播放和控制Lottie动画了。

回到顶部