代码如下:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:ui' as UI;class HandWrittenBoard extends StatefulWidget {///手写笔颜色final Color? color;///手写笔宽度final double? width;///手写笔控制器final HandWrittenBoardController boardController;const HandWrittenBoard({Key? key, this.color, this.width, required this.boardController}): super(key: key);@override_HandWrittenBoardState createState() => _HandWrittenBoardState();
}class HandWrittenBoardController extends ChangeNotifier {late BuildContext _context;late List<Offset?> points = [];void bindContext(BuildContext context) {_context = context;}void refPoints(List<Offset?> newValue) {if (points != newValue) {points = newValue;notifyListeners();}}Future<UI.Image>? get uiImage {UI.PictureRecorder recorder = UI.PictureRecorder();Canvas canvas = Canvas(recorder);HandWrittenBoardPainter painter = HandWrittenBoardPainter(points);Size size = _context.size!;painter.paint(canvas, size);return recorder.endRecording().toImage(size.width.floor(), size.height.floor());}void clearBoard() {points.clear();notifyListeners();}
}class _HandWrittenBoardState extends State<HandWrittenBoard> {late ValueNotifier<List<Offset?>> _offsets = ValueNotifier([]);@overridevoid initState() {super.initState();widget.boardController.bindContext(context);}void _onUpdate(DragUpdateDetails details) {RenderBox? _object = context.findRenderObject() as RenderBox;Offset _locationPoints = _object.globalToLocal(details.globalPosition);_offsets.value = new List.from(_offsets.value)..add(_locationPoints);_refPoints();}void _onEnd(DragEndDetails details) {_offsets.value.add(null);_refPoints();}void _refPoints() {widget.boardController.refPoints(_offsets.value);}@overrideWidget build(BuildContext context) {return GestureDetector(onPanUpdate: _onUpdate,onPanEnd: _onEnd,child: ValueListenableBuilder(valueListenable: _offsets,builder: (BuildContext context, List<Offset?> value, Widget? child) {return CustomPaint(painter: HandWrittenBoardPainter(value,color: widget.color, width: widget.width),size: Size.infinite,);},),);}
}class HandWrittenBoardPainter extends CustomPainter {HandWrittenBoardPainter(this.points, {this.color, this.width});final List<Offset?> points;final Color? color;final double? width;@overridevoid paint(Canvas canvas, Size size) {var paint = Paint()..color = color ?? Colors.black..strokeCap = StrokeCap.square..strokeWidth = width ?? 5.0;for (int i = 0; i < points.length - 1; i++) {if (points[i] != null && points[i + 1] != null) {canvas.drawLine(points[i]!, points[i + 1]!, paint);}}}@overridebool shouldRepaint(CustomPainter oldDelegate) {return true;}
}

boardController 提供监听 以及获取图片 清除手写版方法
去玩吧

Flutter 手写板 签名相关推荐

  1. uniapp 小程序 APP 实现手写板 签名 画图 canvas 保存为图片格式

    文章目录 uniapp 小程序 APP 实现手写板 签名 画图 canvas 保存为图片格式 一.手写板 1.H5代码 2.JS代码 总结 uniapp 小程序 APP 实现手写板 签名 画图 can ...

  2. 小程序实现手写板签名

    小程序实现手写板签名 1.wxss代码 page {background: #F8F8F8; } /* 签名 */ .qianming {background: #fff;padding: 20rpx ...

  3. flutter 应用签名 Mac

    在微信开放平台创建移动应用时上图大家都遇到过,这里的应用签名是什么呢? 这里介绍说可以通过签名生成工具在已安装当前应用的手机中获取,(待会获取测试一下)我们先搞明白它是什么,这里提到了该应用签名由开发 ...

  4. Flutter Android 签名打包

    文章目录 查看APP包的签名 Flutter 配置Android 签名 创建 keystore 引用应用程序中的keystore gradle中配置签名 构建一个发布版apk(打包) 在设备上安装发行 ...

  5. 小程序实现手写板签名功能

    小程序原生实现手写签名并生成图片上传,根据公司业务功能做了部分调整 <view class="wrapper"> <view class="handBt ...

  6. HTML5 手写板签名

    为什么80%的码农都做不了架构师?>>>    Git地址:jSignature‍ 转载于:https://my.oschina.net/linx/blog/535047

  7. java 实现电子签名_java swing实现手写板电子签名系统 | 学步园

    java swing实现手写板电子签名系统 支持 手写板 ,触摸屏电脑,支持压强 压感效果......................... 部分代码  MyLeftPanel.java public ...

  8. java swing实现手写板电子签名系统

    java swing实现手写板电子签名系统 支持 手写板 ,触摸屏电脑,支持压强 压感效果......................... 部分代码  MyLeftPanel.java public ...

  9. Flutter面试题——面试题1

    一 面试题知识点 Flutter种Widget视图的生命周期 Flutter中的三棵树 Flutter动画 Flutter中手势操作 Flutter绘制(签名/画笔) 有无做过手绘相关的项目 Flut ...

最新文章

  1. JAVA String之contains方法使用
  2. 19.12 添加自定义监控项目 19.13/19.14 配置邮件告警 19.15 测试告警 19.16 不发邮件的问题处理...
  3. php swiper 下拉刷新,SwipeRefreshLayout的使用(下拉刷新)
  4. boost::container实现显式实例map的测试程序
  5. 2021年8月Web服务器排行榜:Nginx牛市上升
  6. idea2021部署maven+javaweb项目到jboss(diy)
  7. [Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了
  8. 计算机网络(七)-物理层设备
  9. SQLServer 联合查询
  10. 软件工程敏捷开发01
  11. OpenJudge NOI 1.7 32:行程长度编码
  12. 蓝桥杯 基础练习 回形取数
  13. Gym 101246G Revolutionary Roads
  14. [case29]JDK11的ZGC小试牛刀
  15. 怎样把DataSet转换成ArrayList
  16. 计算机语言语法语义,程序设计语言语义
  17. 【高等数学】微分与全微分的几何意义的不同
  18. 【毕业设计】深度学习YOLO安检管制物品识别与检测 - python opencv
  19. Python9--面向对象编程
  20. 谈谈面试题之为什么用线程池?解释下线程池参数?

热门文章

  1. java开源验证框架OVAL
  2. 牛客练习赛54(A,B,C(ATCG相同的分在一起 暴力加巧妙差分))
  3. Gradle自定义AAR文件名称
  4. Doxygen简介及使用说明
  5. 表示表元的背景的html,表示表元的背景色彩的HTML 是()
  6. 软件工程的先驱 女软件工程师Margaret Hamilton
  7. VMware 15 上Mac虚拟机不能全屏问题的解决
  8. 安卓中QQ登陆源代码
  9. 计算机组成原理7-主存储器—存储器与CPU的连接
  10. 微信公众号网页授权产生 错误代码:40029 真正解决