Flutter矢量图绘制插件vector_drawable的使用

Flutter矢量图绘制插件vector_drawable的使用

简介

vector_drawable 是一个用于在 Flutter 中使用 VectorDrawablesAnimatedVectorDrawables 的插件。它允许开发者直接在应用中渲染复杂的矢量图形。

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 vector_drawable 插件来绘制矢量图。

import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:vector_drawable/vector_drawable.dart';
import 'package:xml/xml.dart';
import 'package:vector_drawable/src/visiting/codegen.dart';
import 'package:vector_drawable/src/visiting/async_resolver.dart';
import 'generated_resources.dart' as drawable;
import 'part.dart' as drawable;

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

class _MyApp extends StatelessWidget {
  const _MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) => MaterialApp(
        theme: ThemeData.dark(),
        home: Material(
            color: Colors.black,
            child: Center(
              child: _TestVectorWidget(),
            )),
      );
}

class _TestVectorWidget extends StatefulWidget {
  const _TestVectorWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  State<_TestVectorWidget> createState() => TestVectorWidgetState();
}

class TestVectorWidgetState extends State<_TestVectorWidget> {
  final animatedVectorKey = GlobalKey<AnimatedVectorState>();
  int _drawableIndex = 6;
  bool _animated = true;

  // 重置动画
  void _reset() => animatedVectorKey.currentState!.reset();

  // 开始动画
  void _start() => animatedVectorKey.currentState!.start();

  // 停止动画
  void _stop() => animatedVectorKey.currentState!.stop();

  // 切换到下一个矢量图
  void _next() => setState(() => _drawableIndex++);

  // 切换动画状态
  void _toggleAnimated() => setState(() => _animated = !_animated);

  [@override](/user/override)
  Widget build(BuildContext context) {
    final drawables = [
      drawable.avd_tab_alarm_white_24dp.body,
      drawable.avd_tab_bedtime_white_24dp.body,
      drawable.avd_tab_clock_white_24dp.body,
      drawable.avd_tab_stopwatch_white_24dp.body,
      drawable.avd_tab_timer_white_24dp.body,
      drawable.avd_bedtime_onboarding_graphic.body,
      drawable.avd_bedtime_onboarding_graphic_colored_background.body,
      drawable.drawable.body,
    ];

    return Scaffold(
      appBar: AppBar(
        title: Text('Vector sample'),
      ),
      body: Stack(
        children: [
          Center(
            child: Material(
              color: Theme.of(context).colorScheme.primary,
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Transform.scale(
                  scale: 1,
                  child: _animated
                      ? AnimatedVectorWidget(
                          key: animatedVectorKey,
                          animatedVector: drawables[_drawableIndex % drawables.length],
                        )
                      : VectorWidget(
                          vector: drawables[_drawableIndex % drawables.length].drawable.resource!.body,
                        ),
                ),
              ),
            ),
          ),
          Positioned(
            left: 0,
            bottom: 0,
            right: 0,
            child: Wrap(
              spacing: 4.0,
              runSpacing: 4.0,
              verticalDirection: VerticalDirection.up,
              children: [
                TextButton(
                  onPressed: _animated ? _start : null,
                  child: Text('start'),
                ),
                TextButton(
                  onPressed: _animated ? _stop : null,
                  child: Text('stop'),
                ),
                TextButton(
                  onPressed: _animated ? _reset : null,
                  child: Text('reset'),
                ),
                TextButton(
                  onPressed: _next,
                  child: Text('next'),
                ),
                TextButton(
                  onPressed: _toggleAnimated,
                  child: Text('toggle animated'),
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

更多关于Flutter矢量图绘制插件vector_drawable的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


vector_drawable 是一个 Flutter 插件,用于在 Flutter 应用中渲染 Android 的矢量图 (VectorDrawable)。矢量图是一种基于 XML 的图形格式,可以缩放而不会失去清晰度,非常适合用于不同分辨率的设备。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  vector_drawable: ^1.0.0

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你需要使用矢量图的 Dart 文件中,导入 vector_drawable 插件:

import 'package:vector_drawable/vector_drawable.dart';

3. 加载矢量图

你可以通过 VectorDrawable 类来加载和渲染矢量图。以下是一个简单的例子,展示如何加载并显示一个矢量图:

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

class VectorDrawableExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('VectorDrawable Example'),
      ),
      body: Center(
        child: VectorDrawable(
          assetName: 'assets/your_vector_drawable.xml',
          width: 100,
          height: 100,
          color: Colors.blue,
        ),
      ),
    );
  }
}

4. 矢量图资源

确保你的矢量图文件已经放置在 assets 目录下,并在 pubspec.yaml 文件中正确配置:

flutter:
  assets:
    - assets/your_vector_drawable.xml

5. 矢量图文件

矢量图文件是一个 XML 文件,通常以 .xml 为扩展名。以下是一个简单的矢量图示例:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5z"/>
</vector>

6. 自定义矢量图

你可以通过 VectorDrawablecolor 属性来改变矢量图的颜色,或者通过 widthheight 属性来调整大小。

VectorDrawable(
  assetName: 'assets/your_vector_drawable.xml',
  width: 200,
  height: 200,
  color: Colors.red,
),
回到顶部