Flutter SVG动画绘制插件svg_drawing_animation的使用

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

Flutter SVG动画绘制插件 svg_drawing_animation 的使用

svg_drawing_animation 是一个用于在Flutter中实现SVG路径动画绘制的插件。它支持从多种来源加载SVG文件,并提供了丰富的自定义选项,如持续时间、曲线、重复等。

主要功能

  • 支持从字符串、网络、资源文件或本地文件加载SVG。
  • 支持设置动画的持续时间(Duration)和速度(Speed)。
  • 支持自定义动画曲线(Curve)。
  • 支持自定义加载状态和错误处理。
  • 支持自定义“笔”渲染效果。

示例Demo

以下是完整的示例代码,演示如何使用 svg_drawing_animation 插件进行SVG动画绘制。

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

// 假设kanjiSvg是一个包含SVG字符串的变量
const String kanjiSvg = '''
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  <path d="M10 10 H 90 V 90 H 10 Z" stroke="black" fill="none"/>
</svg>
''';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(title: const Text('SVG Drawing Animation Example')),
        body: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Card(
                  child: SizedBox(
                    width: 100,
                    height: 100,
                    child: SvgDrawingAnimation(
                      SvgProvider.string(kanjiSvg),
                      duration: const Duration(seconds: 4),
                      repeats: true,
                    ),
                  ),
                ),
                const SizedBox(height: 16),
                const Text('Draw the Pen'),
                Card(
                  child: SizedBox(
                    width: 100,
                    height: 100,
                    child: SvgDrawingAnimation(
                      SvgProvider.string(kanjiSvg),
                      duration: const Duration(seconds: 4),
                      repeats: true,
                      penRenderer: CirclePenRenderer(
                        radius: 15,
                        paint: Paint()
                          ..color = Colors.redAccent.withAlpha(128),
                      ),
                    ),
                  ),
                ),
                const SizedBox(height: 16),
                const Text('Load SVG from URL'),
                Card(
                  child: SizedBox(
                    width: 300,
                    height: 300,
                    child: SvgDrawingAnimation(
                      SvgProvider.network(
                        'https://upload.wikimedia.org/wikipedia/commons/4/4a/African_Elephant_SVG.svg',
                      ),
                      duration: const Duration(seconds: 10),
                    ),
                  ),
                ),
                const SizedBox(height: 16),
                const Text('Custom controller: tap to replay'),
                const ReplayableCard(),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class ReplayableCard extends StatefulWidget {
  const ReplayableCard({super.key});

  @override
  State<ReplayableCard> createState() => _ReplayableCardState();
}

class _ReplayableCardState extends State<ReplayableCard>
    with SingleTickerProviderStateMixin {
  late AnimationController controller;

  @override
  void initState() {
    controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 5),
    );
    controller.forward();
    super.initState();
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        controller.reset();
        controller.forward();
      },
      child: Card(
        child: SizedBox(
          width: 100,
          height: 100,
          child: SvgDrawingAnimation(
            SvgProvider.string(kanjiSvg),
            animation: controller,
          ),
        ),
      ),
    );
  }
}

基本用法

加载并绘制SVG动画的基本用法如下:

SvgDrawingAnimation(
  SvgProvider.network(
    'https://upload.wikimedia.org/wikipedia/commons/4/4a/African_Elephant_SVG.svg',
  ),
  duration: const Duration(seconds: 10),
)

在容器中适配大小

可以通过 SizedBox 来限制SVG动画的显示区域:

SizedBox(
  width: 300,
  height: 300,
  child: SvgDrawingAnimation(
    SvgProvider.network(
      'https://upload.wikimedia.org/wikipedia/commons/4/4a/African_Elephant_SVG.svg',
    ),
    duration: const Duration(seconds: 10),
  ),
)

使用曲线和重复动画

你可以为动画添加曲线效果,并设置是否重复:

SvgDrawingAnimation(
  SvgProvider.network(
    'https://upload.wikimedia.org/wikipedia/commons/4/4a/African_Elephant_SVG.svg',
  ),
  duration: const Duration(seconds: 10),
  curve: Curves.decelerate,
  repeats: true,
)

自定义动画控制器

你还可以使用自己的 AnimationController 来控制动画:

class ReplayableCard extends StatefulWidget {
  const ReplayableCard({super.key});

  @override
  State<ReplayableCard> createState() => _ReplayableCardState();
}

class _ReplayableCardState extends State<ReplayableCard>
    with SingleTickerProviderStateMixin {
  late AnimationController controller;

  @override
  void initState() {
    controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 5),
    );
    controller.forward();
    super.initState();
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        controller.reset();
        controller.forward();
      },
      child: Card(
        child: SizedBox(
          width: 100,
          height: 100,
          child: SvgDrawingAnimation(
            SvgProvider.string(kanjiSvg),
            animation: controller,
          ),
        ),
      ),
    );
  }
}

自定义加载和错误处理

你可以自定义加载和错误状态的显示:

SvgDrawingAnimation(
  SvgProvider.network(
    'https://upload.wikimedia.org/wikipedia/commons/4/4a/African_Elephant_SVG.svg',
  ),
  duration: const Duration(seconds: 4),
  loadingWidgetBuilder: (context) => Center(child: LinearProgressIndicator()),
  errorWidgetBuilder: (context) => Text('Oops! Something went wrong.'),
)

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

1 回复

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


当然,以下是一个关于如何使用 svg_drawing_animation 插件在 Flutter 中绘制 SVG 动画的示例代码。svg_drawing_animation 是一个允许你在 Flutter 应用中播放 SVG 动画的插件。

首先,你需要在 pubspec.yaml 文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  svg_drawing_animation: ^0.1.0  # 请检查最新版本号

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

接下来,下面是一个完整的 Flutter 应用示例,它展示了如何使用 svg_drawing_animation 插件来播放 SVG 动画。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SVG Animation Example'),
        ),
        body: Center(
          child: SvgDrawingAnimation.asset(
            'assets/your_animation.svg',  // 确保你的 SVG 文件放在 assets 文件夹中
            width: 300,
            height: 300,
            animationController: AnimationController(
              duration: const Duration(seconds: 2),
              vsync: const VerticalDirectionality(),
            )..repeat(),  // 设置动画时长并循环播放
          ),
        ),
      ),
    );
  }
}

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

  1. 导入必要的包:我们导入了 flutter/material.dartsvg_drawing_animation/svg_drawing_animation.dart
  2. 设置应用的主入口:在 main 函数中,我们创建了 MyApp 类的实例。
  3. 创建主应用小部件:在 MyApp 类中,我们构建了一个 MaterialApp,它的首页是一个 Scaffold,包含一个 AppBar 和一个居中的 SvgDrawingAnimation 小部件。
  4. 加载 SVG 动画:我们使用 SvgDrawingAnimation.asset 方法从 assets 文件夹中加载 SVG 动画文件。你可以根据需要调整动画的宽度和高度。
  5. 设置动画控制器:我们创建了一个 AnimationController,设置动画的时长为 2 秒,并使用 vsync: const VerticalDirectionality()(在 Flutter 2.x 中,你可能需要使用 vsync: BouncingScrollSimulation() 或其他合适的 vsync 提供者)。然后,我们调用 repeat() 方法使动画循环播放。

请确保你的 SVG 文件是支持动画的,并且已经被放置在 assets 文件夹中,同时在 pubspec.yaml 中正确声明了 assets:

flutter:
  assets:
    - assets/your_animation.svg

这样,当你运行应用时,你应该能看到 SVG 动画在屏幕上播放。如果你有任何进一步的问题或需要更多自定义,请查阅 svg_drawing_animation 的官方文档。

回到顶部