Flutter 手写板 签名
代码如下:
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 手写板 签名相关推荐
- uniapp 小程序 APP 实现手写板 签名 画图 canvas 保存为图片格式
文章目录 uniapp 小程序 APP 实现手写板 签名 画图 canvas 保存为图片格式 一.手写板 1.H5代码 2.JS代码 总结 uniapp 小程序 APP 实现手写板 签名 画图 can ...
- 小程序实现手写板签名
小程序实现手写板签名 1.wxss代码 page {background: #F8F8F8; } /* 签名 */ .qianming {background: #fff;padding: 20rpx ...
- flutter 应用签名 Mac
在微信开放平台创建移动应用时上图大家都遇到过,这里的应用签名是什么呢? 这里介绍说可以通过签名生成工具在已安装当前应用的手机中获取,(待会获取测试一下)我们先搞明白它是什么,这里提到了该应用签名由开发 ...
- Flutter Android 签名打包
文章目录 查看APP包的签名 Flutter 配置Android 签名 创建 keystore 引用应用程序中的keystore gradle中配置签名 构建一个发布版apk(打包) 在设备上安装发行 ...
- 小程序实现手写板签名功能
小程序原生实现手写签名并生成图片上传,根据公司业务功能做了部分调整 <view class="wrapper"> <view class="handBt ...
- HTML5 手写板签名
为什么80%的码农都做不了架构师?>>> Git地址:jSignature 转载于:https://my.oschina.net/linx/blog/535047
- java 实现电子签名_java swing实现手写板电子签名系统 | 学步园
java swing实现手写板电子签名系统 支持 手写板 ,触摸屏电脑,支持压强 压感效果......................... 部分代码 MyLeftPanel.java public ...
- java swing实现手写板电子签名系统
java swing实现手写板电子签名系统 支持 手写板 ,触摸屏电脑,支持压强 压感效果......................... 部分代码 MyLeftPanel.java public ...
- Flutter面试题——面试题1
一 面试题知识点 Flutter种Widget视图的生命周期 Flutter中的三棵树 Flutter动画 Flutter中手势操作 Flutter绘制(签名/画笔) 有无做过手绘相关的项目 Flut ...
最新文章
- JAVA String之contains方法使用
- 19.12 添加自定义监控项目 19.13/19.14 配置邮件告警 19.15 测试告警 19.16 不发邮件的问题处理...
- php swiper 下拉刷新,SwipeRefreshLayout的使用(下拉刷新)
- boost::container实现显式实例map的测试程序
- 2021年8月Web服务器排行榜:Nginx牛市上升
- idea2021部署maven+javaweb项目到jboss(diy)
- [Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了
- 计算机网络(七)-物理层设备
- SQLServer 联合查询
- 软件工程敏捷开发01
- OpenJudge NOI 1.7 32:行程长度编码
- 蓝桥杯 基础练习 回形取数
- Gym 101246G	Revolutionary Roads
- [case29]JDK11的ZGC小试牛刀
- 怎样把DataSet转换成ArrayList
- 计算机语言语法语义,程序设计语言语义
- 【高等数学】微分与全微分的几何意义的不同
- 【毕业设计】深度学习YOLO安检管制物品识别与检测 - python opencv
- Python9--面向对象编程
- 谈谈面试题之为什么用线程池?解释下线程池参数?