Flutter手指绘图插件finger_painter的使用

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

Flutter手指绘图插件 finger_painter 的使用

finger_painter 是一个允许用户通过手指在屏幕上绘制不同类型的笔触,并支持多种混合模式的Flutter插件。绘制的结果可以作为位图或点列表读取,例如用于地图标注。

主要特性

  • 三种类型的画笔(铅笔、画笔1、画笔2)
  • 支持设置最小和最大笔触宽度
  • 获取最后绘制的图像和绘制点
  • 设置背景小部件(如Google Map)
  • 设置背景颜色
  • 使用图像混合模式进行绘制

开始使用

首先,在您的项目中添加 finger_painter 插件:

dependencies:
  finger_painter: ^latest_version

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

初始化 PainterController

initState() 方法中初始化 PainterController

[@override](/user/override)
void initState() {
  super.initState();
  painterController = PainterController()
    ..setPenType(PenType.pencil)
    ..setStrokeColor(Colors.black)
    ..setMinStrokeWidth(3)
    ..setMaxStrokeWidth(10)
    ..setBlurSigma(0.0)
    ..setBlendMode(ui.BlendMode.srcOver);
}

在Widget树中插入Painter

Painter 小部件插入到您的Widget树中:

Painter(
  controller: painterController,
  backgroundColor: Colors.green.withOpacity(0.4),
  size: const Size(300, 300),
  child: Image.asset('assets/your_image.png'),
  onDrawingEnded: (Uint8List bytes) async {
    // 处理绘制结束后的逻辑
  },
),

完整示例Demo

下面是一个完整的示例代码,展示了如何使用 finger_painter 进行手指绘图:

import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:finger_painter/finger_painter.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late PainterController painterController;

  [@override](/user/override)
  void initState() {
    super.initState();
    painterController = PainterController()
      ..setStrokeColor(Colors.black)
      ..setMinStrokeWidth(3)
      ..setMaxStrokeWidth(15)
      ..setBlurSigma(0.0)
      ..setPenType(PenType.paintbrush2)
      ..setBlendMode(ui.BlendMode.srcOver);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Finger Painter Demo')),
        body: Column(
          children: [
            const SizedBox(height: 30),
            Expanded(
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Painter(
                  controller: painterController,
                  backgroundColor: const Color(0xFFF0F0F0),
                  onDrawingEnded: (bytes) async {
                    print('${painterController.getPoints()?.length} drawn points');
                  },
                  size: const Size(double.infinity, 250),
                ),
              ),
            ),
            Controls(pc: painterController),
          ],
        ),
      ),
    );
  }
}

class Controls extends StatelessWidget {
  final PainterController pc;

  const Controls({Key? key, required this.pc}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            for (int i = 0; i < PenType.values.length; i++)
              OutlinedButton(
                child: Text(PenType.values[i].name),
                style: ButtonStyle(
                  backgroundColor: pc.getState()?.penType.index == i
                      ? MaterialStateProperty.all(Colors.greenAccent.withOpacity(0.5))
                      : MaterialStateProperty.all(Colors.transparent),
                ),
                onPressed: () {
                  pc.setPenType(PenType.values[i]);
                },
              ),
          ],
        ),
        const SizedBox(height: 20),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            FloatingActionButton(
              backgroundColor: Colors.red,
              onPressed: () => pc.setStrokeColor(Colors.red),
            ),
            FloatingActionButton(
              backgroundColor: Colors.yellowAccent,
              onPressed: () => pc.setStrokeColor(Colors.yellowAccent),
            ),
            FloatingActionButton(
              backgroundColor: Colors.black,
              onPressed: () => pc.setStrokeColor(Colors.black),
            ),
            FloatingActionButton(
              backgroundColor: Colors.green,
              onPressed: () => pc.setStrokeColor(Colors.green),
            ),
            FloatingActionButton(
              backgroundColor: Colors.blue,
              child: const Icon(Icons.image),
              onPressed: () async {
                // 加载背景图片
                Uint8List image = await rootBundle.load('assets/dash.png').then((data) => data.buffer.asUint8List());
                pc.setBackgroundImage(image);
              },
            ),
            FloatingActionButton(
              backgroundColor: Colors.red,
              child: const Icon(Icons.delete_outline),
              onPressed: () => pc.clearContent(clearColor: const Color(0xfff0f0ff)),
            ),
          ],
        ),
      ],
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用finger_painter插件来实现手指绘图功能的代码示例。finger_painter是一个允许用户在Flutter应用中自由绘图的插件。

首先,确保你的Flutter项目已经创建,并且你已经在pubspec.yaml文件中添加了finger_painter依赖项:

dependencies:
  flutter:
    sdk: flutter
  finger_painter: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤实现手指绘图功能:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:finger_painter/finger_painter.dart';
  1. 创建绘图页面
class DrawingPage extends StatefulWidget {
  @override
  _DrawingPageState createState() => _DrawingPageState();
}

class _DrawingPageState extends State<DrawingPage> {
  late FingerPainterController _controller;

  @override
  void initState() {
    super.initState();
    _controller = FingerPainterController();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Finger Painter Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Expanded(
              child: FingerPainter(
                controller: _controller,
                backgroundColor: Colors.white,
                strokeColor: Colors.black,
                strokeWidth: 5.0,
              ),
            ),
            ElevatedButton(
              onPressed: () {
                // 清除画布
                _controller.clear();
              },
              child: Text('Clear'),
            ),
            ElevatedButton(
              onPressed: () async {
                // 导出图像为文件
                final Uint8List? imageBytes = await _controller.exportAsImageBytes();
                if (imageBytes != null) {
                  // 这里你可以保存imageBytes到设备或进行其他处理
                  // 例如,使用share_plus插件分享图片
                  // Share.shareFiles([File.fromRawPath(imageBytes)]);
                  print('Image exported successfully');
                }
              },
              child: Text('Export Image'),
            ),
          ],
        ),
      ),
    );
  }
}
  1. 在你的主应用中使用绘图页面
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Finger Painter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DrawingPage(),
    );
  }
}

这个示例展示了如何创建一个简单的Flutter应用,用户可以在其中用手指绘图。页面包含了一个FingerPainter小部件,用于显示绘图区域,以及两个按钮:一个用于清除画布,另一个用于导出绘制的图像为字节数组(你可以进一步处理这个字节数组,比如保存到设备或分享)。

确保你已经按照finger_painter插件的文档正确设置了所有必要的权限(比如存储权限,如果你打算保存图像到设备)。这个插件的具体用法和功能可能会随着版本的更新而有所变化,所以请参考插件的官方文档获取最新的信息和最佳实践。

回到顶部