TaroReact小程序实现签名功能完整版本篇文章我们完整的实现一个签名功能,包括从绘制到显示的所有代码,使用T

在开始写码之前先简单介绍一下我这里的设计,一共分为三层:

咱们首先来实现最核心的canvas组件。

因为小程序的api很多还是回调形式的,Taro也不例外,所以先来把两个主要操作转换成图片和获取尺寸封装成async形式:

接下来看一下jsx部分:

index.module.less

.container{position:relative;overflow:hidden;//用于绘制签名的canvas占满全屏.signCanvas{width:100vw;height:100vh;overflow:hidden;}//把旋转内容的canvas藏起来.saveCanvas{position:absolute;top:-600px;left:0;z-index:-1;}}3、初始化canvas接下来完成初始化工作,简单来说就是把canvas的绘图上下文拿到手,然后配置一些线条颜色粗细等。如果你想添加一些默认的提示文字也可以在这里完成。

由于我的签名组件是全屏显示的,所以这里直接把SystemInfo的屏幕长宽赋值给canvas了,这里有一个很难缠的轨迹绘制偏移问题,下面会细讲。

ok,现在来搞一下绘制的核心逻辑,其实很简单,我们在上面的jsx里可以看到一共监听了两个方法:onTouchStart和onTouchMove,思路很简单:

说白了就是绘制一条折线,折线的圆润程度取决于onTouchMove的触发频率,对应代码如下:

//绘制轨迹信息constlineInfo=useRef({startX:0,startY:0});constcanvasStart=(e)=>{e.preventDefault();lineInfo.current.startX=e.changedTouches[0].clientXlineInfo.current.startY=e.changedTouches[0].clientYcontext.current.beginPath()}constcanvasMove=(e)=>{e.preventDefault();letx=e.changedTouches[0].clientXlety=e.changedTouches[0].clientYcontext.current.moveTo(lineInfo.current.startX,lineInfo.current.startY)context.current.lineTo(x,y)context.current.stroke()context.current.draw(true)lineInfo.current.startX=xlineInfo.current.startY=y}这里我们使用useRef保存上个坐标信息而不是useState,原因在于我们是直接和canvasapi交互的,没必要在react层面再添加一个高频的重渲染操作。

并且注意其中的e.preventDefault(),如果不阻止默认行为的话每次触摸开始都会有一个拖拽屏幕的效果。

至此,我们已经完成了核心的签名功能:

这个还不是固定偏移,而是越往右下角偏移的越大,所以很多人初见都会一脸懵逼。去网上搜了搜,按照教程里的做法设置了canvas长宽之后发现还是没解决,很难受。这里就来详细的说明一下。

导致这个问题的核心是:canvas的DPI和屏幕的DPI不同!

为了理解这个问题,我们先来做个小实验,首先回到上面的样式文件里,把canvas组件的长宽从全屏设置为四分之一屏:

.container{//...//用于绘制签名的canvas占满全屏.signCanvas{//把下面这俩从100改为50width:50vw;height:50vh;overflow:hidden;}//...}然后回到浏览器再试一下:

发现了么?绘制出来的笔迹恰好是我们实际触摸位置的四分之一!打开F12看一下:

这里可以看到Taro的Canvas组件由一个外层的html元素和内部的原生canvas构成,外层的taro-canvas-core容器负责监听touch事件,而内部的原生canvas负责绘制内容。还记得之前我们代码里初始化canvas时赋值的长宽么:

useReady(()=>{constquery=Taro.createSelectorQuery()query.select('#myCanvas').context(res=>{if(!res.context)return//————————————————注意这里————————————————const{windowWidth,windowHeight}=Taro.getSystemInfoSync()res.context.canvas.width=windowWidth;res.context.canvas.height=windowHeight;//...}).exec()})在这里我们把整个window的宽高赋值给了canvas,也就是说。在只有四分之一面积的情况下,canvas里塞下了和整个屏幕一样多的像素点!

这下就清晰了,touch事件传给我们基于屏幕的坐标,而canvas的分辨率和屏幕一样,但是尺寸只有屏幕的四分之一(即刚才提到的DPI不一致),所以绘制出来的线条就是我们实际触摸轨迹的四分之一等比映射。

明白了原因想解决就简单了,既然实际尺寸是四分之一,那我们把canvas的分辨率也设置为屏幕的四分之一,或者把touch事件的坐标放大为原来的两倍,保证canvas和屏幕的DPI是一致的就可以:

方法一:缩小canvas分辨率

useReady(()=>{constquery=Taro.createSelectorQuery()query.select('#myCanvas').context(res=>{if(!res.context)returnconst{windowWidth,windowHeight}=Taro.getSystemInfoSync()//把canvas分辨率也改为四分之一res.context.canvas.width=windowWidth/2;res.context.canvas.height=windowHeight/2;//...}).exec()})效果如下:

方法二:放大touch事件的坐标:

constcanvasStart=(e)=>{e.preventDefault();//——————————看后面的乘以2——————————lineInfo.current.startX=e.changedTouches[0].clientX*2lineInfo.current.startY=e.changedTouches[0].clientY*2context.current.beginPath()}constcanvasMove=(e)=>{e.preventDefault();//——————————这里也乘以2了——————————letx=e.changedTouches[0].clientX*2lety=e.changedTouches[0].clientY*2//...}效果如下:

可以看到,笔迹已经跟手了,并且我们还可以注意到,由于方法二的分辨率更高,所以他的笔迹更细腻一点。

这个笔迹偏移问题的核心在于canvas和屏幕的DPI不匹配,所以说我们单纯抄网上教程的配置是没什么用的,你需要根据自己的canvas宽高来配置,例如UI让你把签名区域设置为100%宽度,80%高度。你在css里写width:100vw;height:80vh;,那么在初始化canvasContext的时候你就需要canvas.height=windowHeight*0.8;

简单说就是style里的宽高比例要和canvas的实际像素比例相同。

现在基本的逻辑都完成了,再把一些交互的api封装好,通过forwardRef转发出去就可以了,组件完成代码如下,导出图片的逻辑在saveAsImage,有兴趣的同学可以读一下:

上面的签名canvas组件可以拿到其他小程序项目里用,而现在要做的这个组件就是用来实现本项目的UI需求的,这部分没什么难点,直接贴代码了:

src\pages\sign\index.tsx

.container{position:relative;.btns{position:absolute;top:0;left:0;width:100vh;transform-origin:00;//注意这里,手动把按钮组横了过来transform:rotateZ(90deg)translateY(-100%);display:flex;justify-content:center;padding:32px0px;.btn{margin:0px16px;width:20vh;}}}因为小程序内置的横屏会把标题也横过来,导致签名区域变窄,所以这里选择手写横屏而不是直接用小程序内置的横屏配置。

并且注意onSubmit中,从routerparams里读了一个type,然后把导出的签名图base64发射到名字为type的事件上。所以说,想要发起签名的页面需要在导航到本页前先通过Taro.eventCenter绑定一个事件,然后把事件名字通过routerparams(即type变量)告诉签名页,这样让双方可以进行签名图的传递。

最后,我们来实现如何发起签名和如何接受并显示得到的签名图:

这里需要注意的是,我用的是Taro内置的Image组件,而不是taro-vant的Image,因为这里有个小坑,taro-vant的Image没法直接显示base64图片,没找到原因,Taro的Image就可以。

THE END
1.打造个性化签名的网站设计平台,助您轻松创建独特风格个性化签名在数字化交流中扮演着重要角色,反映了个人风格和品牌形象。一个专注于打造个性化签名的网站设计平台能够帮助用户轻松创建独特风格,满足不同需求。 本文从六个方面详细探讨这一平台的构建,包括用户体验设计、技术实现、个性化功能、市场定位、用户反馈与改进以及未来发展方向。每个方面都深入分析了如何通过创新设计和https://www.163.com/dy/article/JF6S2VE405569BV4.html
2.邮件签名格式简介「职场必备」教你打造精美邮件签名格式!3、去除不必要的元素 现代职场,人们喜欢以简约高效的方式处理事务,因此,冗长的邮件签名是许多人避之不及的原因。所以,在设计邮件签名时,应该避免过冗余的信息。此外,不包含任何商业性质的个人信息,也应该从邮件签名中去除。 4、考虑邮件签名显示效果 除了设计好的邮件签名外,我们还应该考虑信件的显示效果,在不同的邮https://yun.a5.cn/news/8615f.html
3.中华人民共和国民法典(合同编)第四百九十三条【书面合同成立地点】当事人采用合同书形式订立合同的,最后签名、盖章或者按指印的地点为合同成立的地点,但是当事人另有约定的除外。 第四百九十四条【依国家订货任务、指令性任务订立合同及强制要约、强制承诺】国家根据抢险救灾、疫情防控或者其他需要下达国家订货任务、指令性任务的,有关民事主体之间应http://wlj.ordos.gov.cn/xwdt_138767/gzdt_138769/202212/t20221201_3311226.html
4.世界读书日活动策划(通用15篇)(5)准备部分小礼品或书签用于活动中有奖竞答环节.(宣传部) (8)电子海报、宣传单的设计与制作(素质拓展部) (9)以小组为单位进行扫楼前的培训,让扫楼人员先了解儿童读书日和本次活动,活动前两天进行扫楼宣传和收集爱心赠书。 (10)办公室在活动前一星期做好值班表的安排工作。 https://www.wenshubang.com/cehuashu/3737607.html
5.口腔门诊病例书写规范9篇(全文)简明设计方案。前提是取得患者或其监护人的同意。治疗设计合理,必要时附以图示。 正畸科治疗设计应详细记录患者或患儿家长要求、治疗目的;活动矫正器设计图示、日期、签名。 专科病历中详细记录治疗设计。 2、临床技术操作 详细记录治疗过程、治疗操作、用药及手术、(记录根管数目、部位、长度、牙髓状态及冠髓情况)。 https://www.99xueshu.com/w/filek8h48utd.html
6.如何设计个性签名:5步骤你想要一个大体上是什么样风格的签名?是想让它清楚地呈现在纸上,还是让它像印刷体一样随意地连接在一起? 你想呈现出什么样的品质?也许大写字母的风格、路径的大小、整个签名的角度都是非常重要的。查阅一些已被设计出的免费或收费的字体也许能带给你灵感。https://zh.wikihow.com/%C9%E8%BC%C6%B8%F6%D0%D4%C7%A9%C3%FB
7.三十二个签名设计技巧签名设计就是设计签名,一般人写名字只是通过一般的汉字规则,这样写出来的名字往往很一般,没有什么艺术性,而签名设计就是由签名设计师根据中国传统书法、美术构图及字与字之间的联系来进行设计的。经过设计以后是签名书写方便、造型奇特、潇洒大方。 ?出现背景 https://www.meipian.cn/56gg6y8s
8.电脑签名设计软件大全电脑签名设计软件免费下载电有人说字如其人,看一个人的字便能看出一个人的修养。而人们往往用到最多的字就是自己的名字,那么将自己的签名写的漂亮点就显的很重要了。那如何来设计自己的签名呢?或许你缺的就是一款电脑签名设计软件。这里小编就给大家带来了好用的签名设计软件推荐,这些电脑签名设计软件可以免费为我们设计出漂亮的名字。多多https://www.ddooo.com/zt/qmsjrj.htm
9.个性签名设计最火的微信签名个性签名唯美简短内涵宜城教育资源网www.ychedu.com个性签名设计_最火的微信签名_个性签名唯美简短内涵_连笔字签名设计给你最好的个性签名1、找点时间,单独呆会儿。2、学会忍受孤独,才会成熟起来。3、笑着面对人生,别有太多幻想。4、不要随意发脾气,谁都不欠你的。签名的魅力,在于方寸之间把个性大大的发挥,不仅营造风格迥异的中国文字http://qt.ychedu.com/QTZY/599365.html
10.怎么设计自己的签名签名怎么写最具风格→MAIGOO知识2、在设计签名时, 几个字要尽量靠拢 ,不能像平日写字那样字与字留有空隙。签名要尽量形成连绵一体的整体感,不能有字字完全断开的现象,横式签名要注意左右字之间的弥合,竖式签名要注意上下字之间的弥合,在视觉上不能给人字字断开的感觉,而应给人一种不分你我的整体感。这就要求字字之间要尽量紧紧依靠,使笔画https://m.maigoo.com/goomai/205723.html
11.个人网络信息安全论文(精选10篇)3.2 操作系统设计上的漏洞 当前网络协议下,不合法的技术人员很容易通过预设木马程序等实现对目标用户计算机信息的访问与窃取。网络操作系统作为网络协议与网络服务得以实现的载体,不仅要实现网络硬件设备接口封装,还要为网络通信的实现提供必要的各种协议以及服务程序。 https://biyelunwen.yjbys.com/fanwen/xinxianquan/727543.html
12.艺术签名艺术签名,又称“签名设计”,即对个人姓名的美化、艺术化。它不是今人的发明,古已有之,我们的前人称其为“花押”。类似于“花押”,另有“画押”、“签押”、“签字”、“署名”、“签名”、“署押”等多种称法,这些称法意思大同小异,它们都有表示认可、负责和示信于人的作用,于是就变得模糊起来,往往混用https://baike.sogou.com/v28778.htm
13.艺术签名纯手写个性签名商务书写明星字书法创意手写设计电子签名【不得不说的事】亲,本店所有签名均有中国国画院兰州分院院士青山亲自执笔设计书写而成。 亲,宝贝由于是定制品,小店不支持七天无理由退货。请亲定制时谨慎核对信息和内容,谢绝恶意拍或者退货者定制,请避开小店,以免造成不必要的麻烦。 本宝贝不参加红包和淘金币抵现活动,请亲慎拍!谢谢合作。 http://hami.witcp.com/shop/c42/tdda85d8b8ee.html
14.迟未末手把手教你如何设计签名,写得一手漂亮的好字!三、在设计签名时,几个字要尽量靠拢,不能隔得太远、太散。 不能像时写字那样,工整、字距均匀。签名是有个性的,要不一样。整个签名设计,看起来要有连绵一体的整体感,不能有字字完全断开的现象。 横式签名要注意左右字之间的弥合。 李明 竖式签名要注意上下字之间的弥合,在视觉上不能给人字字断开的感觉,而应https://www.jianshu.com/p/e39f802d8493
15.AppStore上的“签名设计自学版—轻松学习一笔艺术签名”艺术签名设计大师笔法通通有,签名大数据互联网软件展现了中华五千年文字书法艺术的魅力,并融合了各个时期的著名书法家的艺术风格,使每一个签名都充满了艺术表现力。 艺术签名,很有必要。一键图片展示签名字体,轻松拥有学习签名。 新内容 2019年6月3日 版本1.1.4 https://apps.apple.com/cn/app/id1185792505
16.倪妮创意手写名字签名字体艺术字平面设计素材下载可商用中文字体 AI造字 英文字体 Logo设计 字体转换器 专栏文章登陆/注册 微信登录 账户登录 请使用微信扫一扫,关注公众号后完成登录 登录 在线授权 常见问题 商务合作 字体格式 字体预览 词语欣赏 法律声明 字体打包 关于我们 联系我们 行业网址 新浪微博 图形字体 授权查询 AI造字 专栏文章https://www.zitijia.com/cs/item/11215
17.二审改判!设计图纸上签名不当然构成著作权法意义的署名行为二、建艺公司及员工在图纸上签字盖章的行为系出于报审、验收的需要,属于履行设计单位职责的行为,并非著作权法意义上表明作者身份的署名行为,建艺公司主观上没有侵权故意,客观上没有侵权行为,不应当被认定为侵权。三、退一步讲,即便认定签章签名构成著作权法意义上的署名,一审法院认定承担责任主体时,也存在法律适用错误https://county.beijingip.cn/my/websiteArticle/detailArticle.do?id=401fe2c2890686ce018b6594041f0941