Flutter绘图插件sketch_widget的使用

Flutter绘图插件sketch_widget的使用

概述

sketch_widget 是一个用于在 Flutter 中绘制和操作小部件的插件。它允许用户对小部件进行平移、缩放、旋转、锁定和隐藏等操作。以下是该插件的一些主要功能:

  • 平移
  • 缩放
  • 旋转
  • 隐藏
  • 锁定

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 sketch_widget 的依赖:

dependencies:
  sketch_widget: ^1.2.1

然后运行以下命令以获取依赖:

flutter pub get

2. 初始化插件

在 Flutter 应用中初始化 sketch_widget 插件。以下是一个完整的示例代码,展示了如何使用该插件。

完整示例代码

import 'dart:math';

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const MyHomePage(title: 'Sketch Widget Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 控制是否锁定宽高比
  final _lockRatio = ValueNotifier<bool>(true);

  // 控制是否允许旋转
  final _rotate = ValueNotifier<bool>(false);

  // 小部件的状态映射
  var _sketch = {
    2: {
      Component.position: const Rect.fromLTWH(100, 100, 100, 100),
      Component.widget: const ColoredBox(color: Colors.red),
      Component.angle: pi / 2,
    },
    1: {
      Component.position: const Rect.fromLTWH(150, 150, 200, 200),
      Component.widget: Image.asset('images/ending_dash.png'),
      Component.angle: pi / 4,
    },
    3: {
      Component.position: const Rect.fromLTWH(200, 200, 50, 50),
      Component.widget: const ColoredBox(color: Colors.blue),
      Component.lock: true,
    },
    4: {
      Component.position: const Rect.fromLTWH(250, 250, 50, 50),
      Component.widget: const ColoredBox(color: Colors.yellow),
      Component.visibility: false,
    },
  };

  // 当前聚焦的小部件 ID
  final _focus = ValueNotifier<int>(noPosition);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          // 切换宽高比锁定按钮
          IconButton(
            onPressed: () => _lockRatio.value ^= true,
            icon: ValueListenableBuilder<bool>(
              valueListenable: _lockRatio,
              builder: (_, lockRatio, __) {
                return Icon(
                  Icons.aspect_ratio,
                  color: lockRatio ? Colors.black : Colors.grey,
                );
              },
            ),
          ),
          // 切换旋转按钮
          IconButton(
            onPressed: () => _rotate.value ^= true,
            icon: ValueListenableBuilder<bool>(
              valueListenable: _rotate,
              builder: (_, rotate, __) {
                return Icon(
                  Icons.rotate_left,
                  color: rotate ? Colors.black : Colors.grey,
                );
              },
            ),
          ),
        ],
      ),
      body: Row(
        children: [
          // 左侧绘图区域
          Flexible(
            flex: 9,
            child: SketchWidget(
              focusState: _focus,
              lockRatio: _lockRatio,
              sketch: _sketch,
              rotate: _rotate,
              onTransform: (id, rect, angle) {
                setState(() {
                  _sketch = _sketch.map((key, value) =>
                      MapEntry(
                          key,
                          key == id
                              ? Map.fromEntries({
                                  ...value.entries,
                                  MapEntry(Component.position, rect),
                                  MapEntry(Component.angle, angle),
                                })
                              : value));
                });
              },
            ),
          ),
          // 右侧控制面板
          Container(
            width: 160,
            color: Colors.white,
            child: ListView.builder(
              itemBuilder: (_, index) {
                final entry = _sketch.entries.elementAt(index);
                final visibility = entry.value[Component.visibility] as bool? ?? true;
                final lock = entry.value[Component.lock] as bool? ?? false;
                return ListTile(
                  leading: IconButton(
                    icon: Icon(lock ? Icons.lock : Icons.lock_open),
                    onPressed: () {
                      setState(() {
                        _sketch = _sketch.map((id, widget) =>
                            MapEntry(
                                id,
                                id == entry.key
                                    ? Map.fromEntries({
                                        ...widget.entries,
                                        MapEntry(Component.lock, !lock)
                                      })
                                    : widget));
                      });
                    },
                  ),
                  title: Text('${entry.key}'),
                  trailing: IconButton(
                    icon: Icon(
                        visibility ? Icons.visibility : Icons.visibility_off),
                    onPressed: () {
                      setState(() {
                        _sketch = _sketch.map((id, widget) =>
                            MapEntry(
                                id,
                                id == entry.key
                                    ? Map.fromEntries({
                                        ...widget.entries,
                                        MapEntry(Component.visibility, !visibility)
                                      })
                                    : widget));
                      });
                    },
                  ),
                );
              },
              itemCount: _sketch.length,
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


sketch_widget 是一个用于在 Flutter 应用中实现绘图功能的插件。它允许用户在应用中进行手绘、涂鸦等操作,并且可以保存绘制的图像。以下是如何在 Flutter 项目中使用 sketch_widget 的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sketch_widget: ^1.0.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 sketch_widget 包:

import 'package:sketch_widget/sketch_widget.dart';

3. 使用 SketchWidget

SketchWidget 是一个可以直接使用的 Widget,你可以在你的 UI 中嵌入它。以下是一个简单的示例:

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

class SketchPage extends StatefulWidget {
  @override
  _SketchPageState createState() => _SketchPageState();
}

class _SketchPageState extends State<SketchPage> {
  final GlobalKey<SketchState> _sketchKey = GlobalKey<SketchState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sketch Widget Example'),
        actions: [
          IconButton(
            icon: Icon(Icons.save),
            onPressed: () async {
              // 保存绘制的图像
              final image = await _sketchKey.currentState?.toImage();
              if (image != null) {
                // 处理保存的图像,例如保存到文件或显示在UI中
                // 这里只是简单打印图像信息
                print('Image saved: $image');
              }
            },
          ),
          IconButton(
            icon: Icon(Icons.clear),
            onPressed: () {
              // 清除画布
              _sketchKey.currentState?.clear();
            },
          ),
        ],
      ),
      body: Center(
        child: SketchWidget(
          key: _sketchKey,
          width: 300,
          height: 300,
          color: Colors.white,
          strokeColor: Colors.black,
          strokeWidth: 5.0,
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行你的 Flutter 应用,并在 SketchWidget 中进行绘图操作。你可以使用 toImage() 方法将绘制的图像保存为 ui.Image 对象,然后进一步处理它,例如保存到文件或显示在 UI 中。

5. 自定义选项

SketchWidget 提供了多个可自定义的选项,例如:

  • widthheight: 设置画布的宽度和高度。
  • color: 设置画布的背景颜色。
  • strokeColor: 设置画笔的颜色。
  • strokeWidth: 设置画笔的宽度。

你可以根据你的需求调整这些参数。

6. 保存和清除

你可以通过 toImage() 方法将绘制的图像保存为 ui.Image 对象,然后进一步处理它。你还可以使用 clear() 方法清除画布上的所有内容。

7. 其他功能

sketch_widget 还支持其他功能,例如撤销和重做操作。你可以通过 SketchState 对象来访问这些功能。

_sketchKey.currentState?.undo();  // 撤销
_sketchKey.currentState?.redo();  // 重做
回到顶部