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.在线艺术字设计在线艺术签名设计器艺术字体在线生成器艺术字01、一笔签名设计免费版在线 TRUE LOVE签名图 教程链接:http://www.yishuzi.com/b/m24.htm 02、一笔签名设计免费版在线生成-顶尖手写艺术签名设计图 教程链接:http://www.yishuzi.com/b/m25.htm 03、连笔签名设计免费版在线生成-顶尖手写艺术签名设计网 http://www.yishuzi.com/b/index.html
2.在线签名设计免费版在线艺术签名设计这款在线艺术签名设计软件融入了多种字体风格,通过我们对字体的重新优化设计与组合,让它达到对签名设计需求的更高要求,比如笔画连接更自然,笔锋更精细,字体文件大小优化让生成更快,用户体验更好等,如果你觉得设计出来的签名效果很满意就赶紧收藏哦。 更多款式:签名设计http://www.uustv.com/
3.艺术签名设计免费版艺术签名在线生成艺术签名设计免费版提供整整四十五款的艺术签名风格供您在线生成,每一款都是精品,让您可以随心所欲的进行在线签名设计。适合签名使用的各种场合,适合每一个年龄层次,从大人到小孩子,从商务合同上的签字需求到校园作业本上的名字写作都能完全满足您的设计要求,楷书、行书等非常适合正式签字场合以及小朋友们的签名需求,它http://www.akuziti.com/cs/lbqm.php
4.设计师签名免费签名设计生成器在线签名生成转换设计师签名网是中国领先的艺术签名制作平台,免费签名生成转换器支持硬笔签、时尚签、立体签、行楷签等效果,集成草体签、瘦金签、板书签、童体签等功能智能实现在线签名设计,可生成png,svg,pdf格式,请牢记设计师签名 www.ssjjss.comhttp://www.ssjjss.com/
5.手写签名我们来看看这个手写签名,基本上是用潇洒简笔的手写去下,比较适合商务合同类别,签名设计也是很不错的选择。 如果大家希望写出好看的手写签名,需要教程学习的话,可以去小编介绍的-曦之签名网-看看,都是专业的艺术个性签名。签名没有二话,曦之签都是品牌书法家定制出来的。学习签名还可以关注抖音,在网站左上角,点击https://www.xizhiqm.cn/article/Py1n1iMEZ6QUowEjHEFZ
6.在线签名生成器免费,rpa,机器人,自动化艺术字网一笔签名设计免费版在线 艺术字2024年5月18日?·?一笔签名设计免费版在线,艺术字网出品,极品连笔艺术字签名转换器。 一笔签名设计转换器:一笔签,即签署姓名时飘逸潇洒,一气呵成,给人以酣畅淋漓的视觉冲击。更多内容请查看http://www.yishuzi.com/b/13.htm https://www.wdlinux.cn/html/email/20241211/23845.html
7.签名设计,个性艺术签名!其中这件短袖的设计也是非常经典了,配上文字,有那feel了~ 睡醒了8 今天有点?上衣:m5is 黑色人像印花短袖T恤?裤子:guuka 撞色拼接抽绳束脚休闲裤?球鞋:椰子350黑天使 keshiw 得物er-U8P9H9L2 放学别走c 关注 签名设计,个性艺术签名! 让你名字呈现出不一样的美是我们的https://m.dewu.com/note/trend/details?id=254005218
8.有趣的签名最新,新鲜有趣签名盘点透视盘点随着社交媒体的普及,个性签名已经成为人们展示自我、表达个性的一种方式。2024年,签名界的潮流又有哪些新变化呢?让我们一起来看看吧! 二、趣味签名大盘点,笑点十足 “我的梦想是成为一名作家,可惜我现在连自己的名字都写不好。”这句签名幽默地揭示了很多人心中的痛点,同时也表达了对于梦想的追求。 https://blog.dreamassets.cn/post/12551.html
9.免费设计签名免费个性艺术签名免费设计名字在线设计个性您可以将此代码发给您的亲朋好友,或者发到贴吧、论坛、博客、主页、邮箱等地方,每访问一次这个网址,系统自动将为您加一分(必须是不同ip地址访问)。您的积分累计达到300分,我们将免费为您设计个性手机签名。 活动说明: 1、积分达到300分,我们免费为您设计2款个性手机签名。查看手机签名>>>http://www.yzqm.com/tg/help.html
10.网上免费设计艺术个性签名的网站急切网急切网列表[免费]在线艺术签名设计[非主流]爱情正在下载中推广内容网上免费设计艺术个性签名的网站 字体背景 颜色 选择急切字体,我们提供艺术、行草、连笔、公务4种签名方案。这是网上第一家免费设计艺术个性签名的网站,请大家帮忙宣传! 签名的魅力,在于方寸之间把个性大大的发挥,不仅营造风格迥异的中国文字艺术,http://www.t.zhenbi.com/e/5.htm
11.个性签名设计个人签名设计在线签名设计网上签名设计个性签名设计_个人签名设计_在线签名设计_网上签名设计成功案例欣赏 -分类浏览-K68威客网https://www.k68.cn/cate/%B8%F6%D0%D4%C7%A9%C3%FB%C9%E8%BC%C6.html
12.网上免费签名设计专题模板网上免费签名设计图片素材下载我图网网上免费签名设计专题为您整理了167个原创高质量网上免费签名设计图片素材供您在线下载,PSD/JPG/PNG格式网上免费签名设计模板下载、高清网上免费签名设计图片大全等,下载图片素材就上我图网。https://so.ooopic.com/sousuo/47738/
13.安卓签名工具网上签名设计免费版连笔签名设计免费版在线生成网上签名设计免费版-连笔签名设计免费版在线生成 地址:www.mgs2s.com(复制到浏览器打开)工具集成签名设计免费版下载,签名设计免费版在线立即生成,简单签名设计免费版。方便设计公文签名设计免费版。 1.公司有限技术企业推出一款提供拥有比较丰富明星款式的艺术签名在线生成器大全,电脑设计师可根据商家艺术签名设计品牌策划以https://blog.csdn.net/weixin_39576294/article/details/111133123
14.网上免费的艺术签名设计工具推荐软件技巧下面给大家推荐几款好用的免费的艺术签名设计软件,有需要的小伙伴们来了解一下。1. 龙飞签名设计软件 2.0签名设计软https://xiazai.zol.com.cn/jiqiao/58444.html
15.7款免费又好用的艺术签名设计软件推荐名字签名是我们在日常工作与生活中经常需要使用到的,因此很多网友都会通过下载一些艺术签名设计软件来练习自己的名字签名。不过,目前网上的一些艺术签名设计软件有的是收费的,有的又生成不了图片供我们进行练习。所以,今天小编就为大家推荐几款好用又免费的艺术签名设计软件,希望大家喜欢! https://tech.wmzhe.com/article/3031.html
16.艺术签名设计(艺术签名软件)V3.0绿色版下载艺术签名设计(艺术签名软件)绿色版是收费的签名设计软件,签名设计收费版,想要一手漂亮的签名么?想要你的签名和明星一样漂亮么?只要输入姓名,点一下鼠标,多描写几遍,就可以设计出和专业设计相媲美的签名了。本软件搜集了网上漂亮的签名字库,一定能给你一个惊喜。https://www.xiazaiba.com/html/27347.html
17.艺术签名设计,你来留名,我来写王璐婷 王璐婷 曹玉吟 叶耀棠 池朝辉 王管明 以上签名均为本人原创设计,一个名字可以有很多不同的设计,根据名字的自然结构可以设计成不同的款式,一般辨识度较高的也是较为实用的签名,整体结构比较收敛朴实,稍…https://zhuanlan.zhihu.com/p/237564780?utm_id=0
18.名字签名免费设计英文个性签名设计A smile, a beautiful memories下面是unjs整理的关于免费设计的英文个性签名,欢迎阅读!个微笑,一个最美的回忆No woman can "take" a man from you, unless he's willing to leave!没有人能带走你的 免费取名字大全男孩 根据男孩儿取名的习俗,将男孩儿取名的一般思路和起名方法概括如下,供https://www.unjs.com/h/b/180954.html
19.签名设计,一个暴利偏门项目,另辟蹊径,月入6万+!当我们通过引流,获取单子之后,就将客户的需求发送给上线商家,最后将签名交到客户手上,从中赚取差价,可以说是零成本,空手套白狼了。 3、网上有很多可以自动生成签名的软件以及网站,设计一个签名,贵一点的也就几块钱。 其次,我们来解决推广问题。 因为某宝已经被很多人占领了,所以就直接打消这个念头。 https://www.jianshu.com/p/36e5bac4ccbb
20.个性签名设计网上生成生成字体分类发现字体标签: 生成 最后更新: 2024-11-23 共 7个字体 简介: 个性签名设计网上生成 Fruge-Regular语言:英文 Anglez Script语言:英文 Default Lingo语言:英文 ProjectSans-Thin语言:英文 Chattsworth Regular语言:英文 Lemon Tree Regular语言:英文 SANZOMBIE语言:英文http://www.qiuziti.com/fontlist2?id=1043779
21.网上能否免费设计自己的艺术签名,谁帮我设计一下我来回答 最佳答案 本回答由达人推荐 焚尽指间的想 2009.08.04 回答 抢首赞 评论 其他回答(3)你想知道的这里都有 已解决问题:264,038,814 新手帮助 如何提问 如何回答 权威合作 企业合作 在线咨询 投诉建议 举报不良信息 未成年举报入口 搜狗问问小程序 企业推广 –输入法 –浏览器 –隐私政策 –免责声明 https://wenwen.soso.com/z/q147580709.htm