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.一笔签名设计免费版在线生成潇洒实用的顶尖手写艺术签名设计,完全免费,在线生成,让您受益终生! 在线生成后一笔签名拥有的清晰度很高:780*520像素,请直接输入您的姓名,接着免费在线设计即可。 特别提醒:一笔签和连笔签字库齐全,已经更新了姓名中的偏僻汉字,请放心设计。http://www.yishuzi.com/b/25.htm?1567350129
2.手写签名设计手写签名在线生成器签名预览/点图片快速生成 龚帆手写体 李国夫董事长手写体 漫语手写体 奶布儿细手写 品如手写体 青叶手写体 在线设计说明: 在线手写签名设计生成器是利用手写字体在线完成签名设计的快捷设计,六种不同的手写字体在线自动生成你的名字,希望你喜欢。http://www.uustv.com/sx/
3.在线手写签名签名设计免费在线手写电子签名设计,签名丝滑且带笔锋效果,使其签名效果更高仿逼真。同时你也可以直接选择指定签名字体直接生成签名,后面将陆续上线多种手写字体供选择。https://tools.kalvinbg.cn/txt/sign
4.签名设计免费版app排行榜前十名偏玩手游盒子分享十大签名设计免费版app排行榜前十名手机应用,编辑为您推荐手机签名设计免费版app排行榜第一名到前5名到前十名的应用。找签名设计免费版app有哪些、签名设计免费版app哪个好用,上偏玩手游盒子https://m.pianwan.com/s/zj-106413
5.在线签名生成器免费,rpa,机器人,自动化艺术字网一笔签名设计免费版在线 艺术字2024年5月18日?·?一笔签名设计免费版在线,艺术字网出品,极品连笔艺术字签名转换器。 一笔签名设计转换器:一笔签,即签署姓名时飘逸潇洒,一气呵成,给人以酣畅淋漓的视觉冲击。更多内容请查看http://www.yishuzi.com/b/13.htm https://www.wdlinux.cn/html/email/20241211/23845.html
6.微信小程序做电子签名功能微信小程序做电子签名功能 文章目录 最近需求要做就记录一下。 人狠话不多,直接上功能: 直接搂代码吧,复制过去就可以用,有其他需求自己改吧改吧。 signature.wxml <!-- 电子签名页面 --><custom-navbartitle="电子签名"show-home="{{false}}"/><viewclass="signature-page"><!-- 顶部操作栏 --><viewhttps://blog.csdn.net/weixin_43106777/article/details/144391534
7.名字简化签字签名免费生成名字简化签字在线预览转换关键词列表>名字简化签字 预览签名 小可爱生成签名 贤墨楷生成签名 古籍体生成签名 重岸体生成签名 创意体生成签名 AI签名体生成签名https://www.qianming.cn/keywords/672227
8.配音在线生成免费人工智能名片在线制作免费生成?免费个性签名设计在线生成 在数字化的时代,个性化已经成为人们生活的一部分。人们追求独特和与众不同的方式来展示自己的个性。个性签名设计成为了一种非常流行的表达个性的方式。如果您正在寻找一种免费的个性签名设计在线生成工具,那么您来对地方了! 我们的免费个性签名设计在线生成工具可以帮助您创建一个与众不同的签名https://tool.a5.cn/article/show/72608.html
9.签名设计免费版在线生成素材网站图片免费下载共有1174041个签名设计免费版在线生成相关内容为您呈现 吴杨峰 GO互动 如何设计一张海报?GO互动支持在线免费一键制作 94 GO互动 GO互动海报设计赏析_一键生成海报设计_在线免费制作 188 GO互动 CC_Gc 沙僧SEA uBrand品牌小助手 年终狂欢亚马逊云服务器免费用 1 年!还有 100 多款云产品免费试用,注册立抢!广告https://www.zcool.com.cn/tag/ZNjY2MDQ3Mg==.html
10.无聊写的小玩意,签名设计小程序1.0版本,发出来给大伙玩玩楼主用的应该是这个网站的效果图:http://m.uustv.com/ 其实随便搜索,有很多免费在线签名设计 https://www.52pojie.cn/thread-1336451-1-1.html
11.2023免费设计艺术签名多种模式微信小程序源码带流量主某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主,喜欢的小伙伴可以玩玩! 搭建安装教程参考: 微信小程序搭建开发、修改调试、编译打包上线使用教程 程序演示图: THE END 微信小程序 喜欢就点个赞再走呗~ 6赞赏 说点什么抢沙发 说点正能量的内容吧 https://www.yizhanzzw.com/34447.html
12.才签爱手写(手写签名设计)是一个关注手写相关的设计师交流以及变现的原创设计平台,包括手写签名、手写logo、手写文案等方面的纯原创类型的网站。欢迎相关设计师入住,一起共赢。免费提交姓名有机会获得高端签名。https://www.aishouxie.cn/
13.2021年新媒体运营必备的28大类工具!2.0排版效率高、界面简洁、支持全文编辑,实时预览、一键样式、原创样式设计、一键添加签名。 网址:ipaiban.com 新榜编辑器 丰富的样式和模板、海量的在线图片搜索,一键同步多平台,还有大量爆文供你参考。 网址:edit.newrank.cn 微场景(H5制作) 易企秀 免费H5微场景、海报、长图、表单、视频、互动游戏、建站、小程序等https://www.niaogebiji.com/article-33180-1.html
14.1年时间这家“企业微信”好友从200破100万,“私域”变现破亿!实战关于签名,这里有3种方式给你参考: 1.24 自定义信息展示 企业微信还有一个功能就是自定义信息展示,可以插上小程序链接、放上邮箱地址等。 我们也建议啄木鸟插入一个自助下单的小程序链接,但出于用户的下单习惯和阶段性部署的考虑,“啄木鸟家庭维修” 小程序商城上线企业微信的动作,将会安排在开年后。 https://maimai.cn/article/detail?fid=1630901163&efid=iIeWiLdOTtFsdJ9aMaO48Q
15.某站卖500块钱的艺术签名设计小程序程序员阿鑫某站卖500块钱的艺术签名设计小程序 某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主 文件下载: 您需要登录/注册后才能查看相关资源https://www.cxyax.com/?post=1350
16.艺术签名设计免费版小程序脚本工具4048 次浏览2 条评论 超牛逼工具箱之艺术签名免费在线设计,快来设计漂亮霸气的签名 签名本身就是一门艺术,签名是“美”的,更需要我们赋予它外在的美,漂亮的艺术签名,会让你更加的有气质,但是求人设计 查看全文 脚本工具1020 次浏览4 条评论 https://mznzd.com/tag/%E8%89%BA%E6%9C%AF%E7%AD%BE%E5%90%8D%E8%AE%BE%E8%AE%A1%E5%85%8D%E8%B4%B9%E7%89%88
17.腾讯文档登录入口:https://docs.qq.com/(使用指南)登录电脑版或腾讯文档App后,点击新建--导入本地文件即可导入 2)导入微信文档 微信里搜索腾讯文档小程序打开——登录后点击底部「+」——「导入微信文件」——选择文档导入即可。 3)导入QQ文件 QQ里搜索腾讯文档小程序打开——登录后点击底部「+」——「导入QQ文件」——选择文档导入即可。 https://www.dongrv.com/a/15770/
18.在线百家姓字体艺术签名设计生成器——打造独特姓氏头像与签名设计在数字化浪潮的推动下个性化和创意设计成为当下潮流。传统的姓氏签名已经无法满足人们对个性表达的追求。为此一款集创新与实用于一身的“在线百家姓字体艺术签名设计生成器”应运而生它不仅能让客户轻松打造独一无二的姓氏头像与签名设计更能彰显个人风格传递独有韵味。 https://www.yanggu.tv/webgov/aitong/61882.html
19.Java抖音小程序下单生成签名抖音小程序编写Java抖音小程序下单生成签名 抖音小程序编写 文章目录 前言 第一步:创建项目 1、创建windows窗体应用程序 2、更改项目名称和储存位置 3、选择合适的.NET框架 4、项目创建完成 第二步:设计窗体 1、添加控件 2、更改属性 3、更改窗体属性 第三步:添加事件https://blog.51cto.com/u_16099326/10986467
20.基于微信小程序的校园二手交易平台的设计与实现想预览更多内容,点击免费在线预览全文 免费在线预览全文 基于微信小程序的校园二手交易平台的设计与实现 【摘要】本文主要详细介绍了基于微信小程序的校园二手交易平台。本平台前端使用微信原生技术,后端采用Java语言开发。前台客户端主要功能包括发布商品,浏览商品,交易商品,论坛交流功能;后台管理端主要功能包 https://max.book118.com/html/2024/0308/6235102154010055.shtm
21.白姐一吗期期中特(2024已更新微信/小程序)签名设计大师是一款签名设计的软件,为用户快速设计个人艺术签名。内设上百种签名字体,包含商务签名、大师签名、一笔签名、总裁签名、防伪签名、英文签名、长横白姐一吗期期中特签名、明星签名、楷签名、长横签名、蝴蝶签名、连笔签名、花体签名、爱心签名、等全市白姐一吗期期中特场签名字体类型。 https://www.gfan.com/gftcpavleurct.html
22.表格制作在线签名(简笔签名设计在线生成)微信在线表格电子签名怎么弄 点击小程序。 点击小程序,打开小程序后,点击右上角的放大镜,输入好签会签审批手写签名,点击确定新建即可。 微信WeChat是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,由张小龙所带领的腾讯广州研发中心产品团队打造。 https://www.huoban.com/news/post/124220.html
23.连笔签名设计生成工具签名设计软件分享腾讯云开发者社区SignNow是一款专注于电子签名领域的应用程序。它不仅提供了在线手写签名的功能,还可以将已有的签名图片导入并进行编辑。用户可以使用鼠标、触摸屏或笔来创建电子签名,并可以随时调整签名的大小和位置。 4.HelloSign HelloSign是一款全面的电子签名解决方案,它提供了电子签名的创建、发送和管理功能。除了设计生成连笔签名外,https://cloud.tencent.com/developer/news/1187689
24.设计签名小程序制作软件(设计你的签名小程序篇)设计签名小程序制作软件是一款方便快捷的工具,可用于创建个性化的签名小程序。本文将从四个方面详细阐述设计签名小程序制作软件的特点和功能,包括界面设计、自定义选项、数据管理和云端部署。通过对这四个方面的介绍,读者可以了解到设计签名小程序制作软件的优势和应用场景,从而引起读者的兴趣。 https://www.ahbfapp.com/news/1985.html
25.签名设计,免费签名设计,手写LOGO设计,手写招牌设计,手写文字设计手写仔是一个关注手写相关的设计师交流以及变现的原创设计平台,包括手写签名、手写logo、手写文案等方面的纯原创类型的网站。欢迎相关设计师入住,一起共赢。免费提交姓名有机会获得高端签名。https://shouxiezai.com/
26.装修预约小程序app下载装修预约app最新版下载v2.7装修预约app是一款最新版本的装修预约软件,为用户打造了多样化的装修方案,有装修需求。或者是正在装修的用户都能下载这个软件在线选择适合自己的装修方案,还有专属的设计师。有什么问题都可以和设计师进行沟通,提供的服务都是免费的,用户随时随地都能进行咨询。 https://www.juxia.com/sjwy/ruanjian-651215.html