news 2026/9/12 7:15:28

Flutter 实现手写签名效果

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter 实现手写签名效果

如何使用Flutter实现手写签名的效果

思路

  • 需要监听用户触摸的起始点和结束点,并记录途经点,这里我使用了StreamController
  • 将途经点从起始位置到结束位置绘制出来,这里用到CustomPainter

绘制流程

  1. 获取触摸点作为画笔的起始点
  2. 手机途经点
  3. 绘制途径路线
  4. 结束触摸点重置画笔

具体实现

需要一个Listener用来监听用户行为,并将这些行为的点添加到StreamController中, 两个变量

final List _points = []; //承载对应的点
final StreamController _controller = StreamController(); //数据通信

Widget _buildWriteWidget() { return Stack( children: [ Listener( //用来监听用户的触摸行为 child: Container( color: Colors.transparent, ), onPointerDown: (PointerDownEvent event) { _points.add(event.localPosition); _controller.sink.add([_points]); //起始点的记录 }, onPointerMove: (PointerMoveEvent event) { _points.add(event.localPosition); _controller.sink.add([_points]); //添加途经点 }, onPointerUp: (PointerUpEvent event) { _points.add(Offset.zero); //结束的标记 }, ), StreamBuilder( stream: _controller.stream, builder: (BuildContext context, AsyncSnapshot snapshot) { return snapshot.hasData ? CustomPaint(painter: LinePainter(snapshot.data)) //关联数据到Painter : const SizedBox(); }), Positioned( bottom: 50, right: 50, child: FloatingActionButton( onPressed: () { _clear(); }, child: const Icon(Icons.cleaning_services), )) ], ); }

清除StreamController的内容,重置数据

void _clear() { _points.clear(); _controller.add(null); }

dispose时释放StreamController

@override void dispose() { _controller.close(); super.dispose(); }

画笔Painter

class LinePainter extends CustomPainter { final List<List<Offset>> lines; final Color paintColor = Colors.black; final Paint _paint = Paint(); LinePainter(this.lines); @override void paint(Canvas canvas, Size size) { _paint.strokeCap = StrokeCap.round; _paint.strokeWidth = 5.0; if (lines.isEmpty) { canvas.drawPoints(PointMode.polygon, [Offset.zero, Offset.zero], _paint); } else { for (int i = 0; i < lines.length; i++) { for (int j = 0; j < lines[i].length - 1; j++) { if (lines[i][j] != Offset.zero && lines[i][j + 1] != Offset.zero) { canvas.drawLine(lines[i][j], lines[i][j + 1], _paint); //绘制相应的点 } } } } } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => true; }

作者:Jerry815
链接:https://juejin.cn/post/7180186082489663547

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

二、源码解析合集


三、开源框架合集


欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 21:58:48

2022最终版Android中高级开发面试神册,进大厂拿高薪必备

2022最终版Android中高级开发面试神册&#xff0c;进大厂拿高薪必备&#xff01; 进大厂、拿高薪一直是程序员的梦想&#xff0c;和津津乐道的话题。想进大厂&#xff0c;就必须要过面试关&#xff01; 通常情况下&#xff0c;面试官都会基于你的简历&#xff0c;由基础到原理&…

作者头像 李华
网站建设 2026/8/31 5:18:45

数学建模竞赛动态仿真实战:从SIR模型到智能体建模

1. 项目概述&#xff1a;从“动态仿真”到数学建模的实战桥梁每年数学建模竞赛的A题&#xff0c;往往都是最硬核、最考验综合能力的那个。2022年的A题&#xff0c;核心关键词就是“动态仿真”。很多同学一看到这四个字&#xff0c;尤其是和数学建模联系在一起&#xff0c;第一反…

作者头像 李华
网站建设 2026/8/31 5:00:20

35岁被裁后,我用4个月转Agent开发上岸了!

直接说了吧&#xff0c;去年11月我被裁了。 35岁&#xff0c;7年Java后端&#xff0c;HR一句业务调整就把我打发了。 那之后一个半月投了60份简历&#xff0c;回复不到10家。有两家直说年龄不合适。有一家面了一个小时&#xff0c;后来我在脉脉上看到招了个27岁的。 那段时间我…

作者头像 李华
网站建设 2026/8/30 3:08:40

MATLAB微分方程建模与可视化:从Lotka-Volterra模型到生物动力学分析

1. 项目概述&#xff1a;从方程到图形的桥梁搭建 在生物数学建模的实战中&#xff0c;我们常常会面对一堆由微分方程构成的数学模型。这些方程描述了种群增长、疾病传播、化学反应动力学等生物过程的动态规律。然而&#xff0c;方程本身是抽象的&#xff0c;一堆符号和导数关系…

作者头像 李华
网站建设 2026/9/2 4:56:13

【研发类-API开发Skills】auth-implementation-patterns 技能

使用行业标准模式和现代最佳实践构建安全、可扩展的认证和授权系统。 技能概述 auth-implementation-patterns 技能专注于帮助开发者构建安全、可扩展的认证和授权系统&#xff0c;使用行业标准模式和现代最佳实践。 下载地址&#xff1a;https://github.com/sickn33/antigr…

作者头像 李华