Flutter绘图功能插件drawing_widget的使用

Flutter绘图功能插件drawing_widget的使用

轻松地为您的应用添加专业的绘图功能。以下是如何使用drawing_widget插件来实现这一目标。

特性

  • 绘制和显示模式。
  • 可以改变颜色。
  • 可以改变画笔宽度。
  • 自适应大小。

使用方法

通过更改绘制属性来开始绘制或显示绘制内容。

final _drawing = Drawing(
  strokeColor: Colors.black,
  strokeValue: 2,
  isDrawing: true,
);

DrawingWidget(
  drawing: _drawing,
  onUpdate: (value) {
    // 这里可以执行一些操作
  },
)

完整示例代码

以下是一个完整的示例代码,展示了如何使用drawing_widget插件。

import 'package:drawing_widget/drawing_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_colorpicker/flutter_colorpicker.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '绘图插件演示',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: '绘图插件演示'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  double drawingWidth = 200;
  double drawingHeight = 200;
  bool isDrawing = true;
  Drawing drawing = Drawing();
  bool clipRRect = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: SingleChildScrollView(
        child: Column(
          children: [
            SizedBox(
              width: 300,
              height: 300,
              child: DrawingWidget(
                drawing: drawing,
                isDrawing: isDrawing,
                width: drawingWidth,
                height: drawingHeight,
                removeSidesPadding: false,
                clipBehavior: clipRRect ? Clip.antiAlias : Clip.none,
                onUpdate: (drawingObject) {
                  // 在这里可以执行一些操作
                },
              ),
            ),
            // 参数调整控件
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Column(
                children: [
                  if (!isDrawing)
                    Row(
                      children: [
                        const Text('宽度 : '),
                        Expanded(
                          child: Slider(
                            value: drawingWidth,
                            min: 20,
                            max: 300,
                            onChanged: (value) {
                              setState(() {
                                drawingWidth = value;
                              });
                            },
                          ),
                        ),
                      ],
                    ),
                  if (!isDrawing)
                    Row(
                      children: [
                        const Text('高度 : '),
                        Expanded(
                          child: Slider(
                            value: drawingHeight,
                            min: 20,
                            max: 300,
                            onChanged: (value) {
                              setState(() {
                                drawingHeight = value;
                              });
                            },
                          ),
                        ),
                      ],
                    ),
                  Row(
                    children: [
                      const Text('画笔宽度 : '),
                      Expanded(
                        child: Slider(
                          value: drawing.stroke,
                          min: 1,
                          max: 100,
                          onChanged: (value) {
                            setState(() {
                              drawing.stroke = value;
                            });
                          },
                        ),
                      ),
                    ],
                  ),
                  Row(
                    children: [
                      const Text('颜色 : '),
                      Container(
                        height: 50,
                        alignment: Alignment.center,
                        child: InkWell(
                          onTap: () async {
                            final color = await _showColorDialogue(drawing.color);

                            setState(() {
                              drawing.color = color;
                            });
                          },
                          child: Container(
                            width: 20,
                            height: 20,
                            decoration: BoxDecoration(
                              color: drawing.color,
                              border: Border.all(
                                color: Colors.black,
                              ),
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                  Row(
                    children: [
                      const Text('剪裁 : '),
                      Switch(
                        value: clipRRect,
                        onChanged: (value) {
                          setState(() {
                            clipRRect = value;
                          });
                        },
                      ),
                    ],
                  ),
                ],
              ),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            if (isDrawing) {
              isDrawing = false;
            } else {
              drawing = Drawing();
              drawingWidth = 300;
              drawingHeight = 300;
              isDrawing = true;
            }
          });
        },
        child: Icon(
          isDrawing ? Icons.pause_rounded : Icons.play_arrow_rounded,
        ),
      ),
    );
  }

  Future<Color> _showColorDialogue(Color defaultColor) async {
    var c = defaultColor;

    await showDialog<Color>(
      context: context,
      barrierDismissible: true,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('选择一个颜色!'),
          content: SingleChildScrollView(
            child: ColorPicker(
              pickerColor: c,
              onColorChanged: (Color color) {
                c = color;
              },
              pickerAreaHeightPercent: 0.8,
            ),
          ),
          actions: [
            TextButton(
              child: const Text('确定'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );

    return c;
  }
}

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

1 回复

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


drawing_widget 是一个用于 Flutter 的插件,允许用户在应用程序中绘制自由形式的图形。它提供了一个画布,用户可以在上面使用手指或鼠标绘制线条、形状等。这个插件非常适合需要手写输入、绘图或签名的应用程序。

安装 drawing_widget

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

dependencies:
  flutter:
    sdk: flutter
  drawing_widget: ^1.0.0  # 请检查最新版本

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

基本用法

以下是一个简单的示例,展示了如何使用 drawing_widget 插件在 Flutter 应用程序中创建一个绘图区域。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DrawingScreen(),
    );
  }
}

class DrawingScreen extends StatefulWidget {
  @override
  _DrawingScreenState createState() => _DrawingScreenState();
}

class _DrawingScreenState extends State<DrawingScreen> {
  DrawingController _drawingController = DrawingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Drawing Widget Example'),
        actions: [
          IconButton(
            icon: Icon(Icons.undo),
            onPressed: () {
              _drawingController.undo();
            },
          ),
          IconButton(
            icon: Icon(Icons.clear),
            onPressed: () {
              _drawingController.clear();
            },
          ),
        ],
      ),
      body: Center(
        child: DrawingWidget(
          controller: _drawingController,
          width: MediaQuery.of(context).size.width,
          height: MediaQuery.of(context).size.height * 0.8,
        ),
      ),
    );
  }

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

主要功能

  1. DrawingController: 用于控制绘图行为。你可以使用它来撤销、重做、清除画布等操作。

    • undo(): 撤销最后一次绘制操作。
    • clear(): 清除整个画布。
    • dispose(): 释放资源。
  2. DrawingWidget: 这是主要的绘图区域。你可以设置它的宽度和高度来定义绘图区域的大小。

  3. 自定义画笔: 你可以通过 DrawingController 自定义画笔的颜色、粗细等属性。

_drawingController.paint = Paint()
  ..color = Colors.red
  ..strokeWidth = 5.0
  ..style = PaintingStyle.stroke;

保存绘图结果

你可以使用 DrawingControllertoImage() 方法将当前的绘图结果保存为图像。

Future<void> saveDrawing() async {
  final image = await _drawingController.toImage();
  // 你可以将图像保存到文件或显示在屏幕上
}
回到顶部