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.十大签名软件推荐电子签名软件哪个好好用的签字软件有哪些→艺术签名设计(小刀万维科技) 十大电子签名软件榜单中,MAIGoo小编主要筛选了相对热门的手机端书法类电子签名软件,商业行为中具有法律效应的电子签名仅作为补充,依据其普及度、用户推荐量,并参考蝉大师App store,以及七麦数据应用宝、豌豆荚、华为、小米、VIVO等应用商店下载量,和互联网相关名单综合总结而来。榜单仅供参考,https://www.maigoo.com/top/419818.html
2.可以签名的软件有哪些APP推荐可以签名的软件有哪些下载签名,签名大全,设计签名,艺术签名设计,个性签名,心情签名,商务签名?海量签名字体应有尽有. 《私人定制签名》是一款专家在线设计艺术签名的签名软件,专业打造个性签名,中国签名设计行业协会鼎力支持,知名签名设计大师手工进行艺术签名设计,让您的签名彰显您的身份和个性! 【订制签名】 中国签名设计行业协会首席设计师、https://www.wandoujia.com/bangdan/396468/
3.设计签名小程序制作软件(设计你的签名小程序篇)设计签名小程序制作软件是一款方便快捷的工具,可用于创建个性化的签名小程序。本文将从四个方面详细阐述设计签名小程序制作软件的特点和功能,包括界面设计、自定义选项、数据管理和云端部署。通过对这四个方面的介绍,读者可以了解到设计签名小程序制作软件的优势和应用场景,从而引起读者的兴趣。 https://www.ahbfapp.com/news/1985.html
4.定制你的个性艺术签名个性签名签名设计艺术签名签名小程序00:00/00:00 定制你的个性艺术签名 个性签名 签名设计 艺术签名 签名小程序 拳击那点事发布于:江西省2023.06.23 00:00 分享到https://www.sohu.com/a/689516330_100114195
5.无聊写的小玩意,签名设计小程序1.0版本,发出来给大伙玩玩楼主用的应该是这个网站的效果图:http://m.uustv.com/ 其实随便搜索,有很多免费在线签名设计 https://www.52pojie.cn/thread-1336451-1-1.html
6.最新字节跳动小程序抖音艺术签名小程序源码艺术签名设计小程序最新字节跳动小程序抖音艺术签名小程序源码/艺术签名设计小程序源码 这个小程序是一个非常有用的工具,可以帮助您创建各种各样的艺术签名,以便在社交媒体平台上展示您的个性和创意。 该小程序具有许多功能,例如: 支持各种字体和颜色:您可以根据自己的喜好选择不同的字体和颜色来创建独特的签名。 内置模板:如果您没有创https://download.csdn.net/download/m0_66047725/87941898
7.某站卖500块钱的艺术签名设计小程序程序员阿鑫某站卖500块钱的艺术签名设计小程序 某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主 文件下载: 您需要登录/注册后才能查看相关资源https://www.cxyax.com/?post=1350
8.精美的签名设计软件.强!!!精美的签名设计软件2011-01-06 上传大小:500KB 所需:9积分/C币 艺术签名微信小程序源码.rar 这个小程序是一个非常有用的工具,可以帮助您创建各种各样的艺术签名,以便在社交媒体平台上展示您的个性和创意。 该小程序具有许多功能,例如: 支持各种字体和颜色:您可以根据自己的喜好选择不同的字体和颜色来创建独特的https://www.iteye.com/resource/zhangab6672-2965018
9.小程序登录java怎么验签在小程序登录过程中,为了保证请求的合法性和安全性,需要对请求进行验证。本方案将介绍如何在Java后端实现小程序登录验证的过程。 2. 方案设计2.1 生成签名 在小程序端,用户需要使用登录凭证code向服务器发起登录请求。服务器端接到请求后,需要先生成签名验证请求。 https://www.tulingxueyuan.cn/tlzx/jsp/5303.html
10.2023免费设计艺术签名多种模式微信小程序源码带流量主某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主,喜欢的小伙伴可以玩玩! 搭建安装教程参考: 微信小程序搭建开发、修改调试、编译打包上线使用教程 程序演示图: THE END 微信小程序 喜欢就点个赞再走呗~ 6赞赏 说点什么抢沙发 说点正能量的内容吧 https://www.yizhanzzw.com/34447.html
11.钉钉小程序实现签名板古茗目前已经有近万家门店了,为了对门店做规范管理,会进行巡店且输出巡店报告,此时就需要有一个老板签名的功能,证明老板认可且了解当前结果。由于我们巡店用到的是钉钉小程序,所以下面将会为大家展示如何在小程序中实现一个签名板功能。 设计实现 为了实现签名功能,需要用到 canvas,我们翻阅钉钉 api 文档,发现支持Canvahttps://www.pipipi.net/36779.html
12.微信小程序实现电子签名功能的方法创新互联这篇文章主要讲解了微信小程序实现电子签名功能的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。成都创新互联是一家专业提供原阳企业网站建设,专注与成都网站制作、成都做网站、H5场景定制、小程序制作等业务。10年已为原阳众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中http://chengdu.cdxwcx.cn/article/doiiid.html
13.抖音小程序个性签名L小MT抖音小程序-个性签名 l小mt 广州 / ui设计师 / 4年前 / 65 浏览 版权 私信 关注 抖音小程序-个性签名 l小mt 关注 可能感兴趣的人 下次默认收起 小脑府设计团队 深圳 | ui设计师 创作 87 粉丝 40716 关注 kng98 深圳 | ui设计师 创作 9 粉丝 11284 关注 黑脸包公 北京 | ui设计师 创作 33 粉丝 https://www.zcool.com.cn/work/ZNDc1NzYzMTY=.html
14.配音在线生成免费人工智能名片在线制作免费生成?3、在搜索下拉框会出现多种可以创建微信小程序名片的小程序,这时候我们只需要选择第一个“名片”或者你喜欢的小程序即可创建属于自己的微信小程序名片。 4、选择了人工智能名片小程序后,然后点击进去创建名片,依次填写相应资料,随后即可创建到一张微信小程序名片。 https://tool.a5.cn/article/show/72608.html
15.9款好用到爆的微信小程序,光速提升你的工作效率!日常工作中,有哪些小程序给你的工作带来了很多便利呢?今天我要跟大家分享9个光速提升工作效率的微信小程序,每一个都爱不释手!看完你一定会忍不住偷偷收藏的。 1.好签 好签 这个小程序,让你告别打印快递签名文件,在线就可以签名。 这是一款原笔迹签名小程序,导入需要签字的文件,然后小程序里手写自己的签名,调整https://www.360doc.cn/article/4310958_960014897.html
16.艺术签名助手小程序二维码艺术签名助手小程序入口分类:系统 发布:2017-02-07 搜索词:艺术签名助手 提示:若暂无二维码,请复制搜索词在微信搜索。 微信扫一扫,使用小程序 请使用微信6.5.3以上的版本详情 相关 艺术签名助手小程序二维码是艺术签名助手微信公众账号当中的艺术签名助手小程序入口。艺术签名助手小程序简单好用,可以帮你快速的设计一个个性签名,想用就http://www.onlinedown.net/miniapp/361.htm
17.微信小程序电子签名JavaScript用户体验优化:提升小程序的加载速度、界面设计和交互体验,提高用户满意度。 用户行为优化:增加用户停留时间、访问深度和互动数据,提高用户体验。 内容质量优化:提供优质内容,吸引用户,提高用户留存率。 微信小程序电子签名以其便捷、安全、高效的特点,成为移动办公的新选择。通过SEO优化,提高微信小程序的搜索排名,有助于https://www.yyzq.team/post/361294.html
18.APP开发网站定制小程序定制魁网云商是一家拥有自主研发能力以小程序开发、软件开发、APP开发、网络营销、SEO、网站建设、VI设计、LOGO设计、商标注册、知识产权服务、网络安全为一体的综合性服务公司。 公司成立至今,凭借经验丰富的营销团队和强大的技术研发团队,帮助客户解决互联网难题,为企业拓https://www.kui.net/dingzhikaifa/
19.php+uniapp(微信小程序版)实现电子签名及合同生成第一部分:uniapp小程序端 1.从插件市场导入手写签名canvas电子签名,按照操作步骤即可使用。我这里是调整了样式,修改了组件,根据自己实际UI调整 我的UI效果图: 2.通过组件的submit方法可以得到签名后的图片临时文件,将图片上传到后台得到服务器图片地址,保存下来 http://www.phpheidong.com/blog/article/292753/879176ea2d1b3492fdbe/
20.微信小程序canvas实现个人签名,并保存为图片微信小程序---canvas实现刮刮乐效果 效果图 设计流程 设计思路 canvas设置背景图,作为中奖图片; 在canvas上绘制刮的灰色涂层; 通过绑定的事件,清除对应区域的涂层; 最后判断涂层清除区域是否超过设置的可见百分比,如果超过则全部涂层清除,否则不清楚。 1、全局常量 获取用户传入的canvas的ID,设置的canvas的宽高,canvashttps://www.pianshen.com/article/9623356180/
21.个性签名生成器#免费签名设计#小程序,免费设计名字生成器个性签名生成器#免费签名设计 #小程序 - ?蒲公英于20211117发布在抖音,已经收获了15.0万个喜欢,来抖音,记录美好生活!https://www.douyin.com/video/7031455858643012897
22.签名设计个人签名设计签名设计公司威客牛网签名设计频道汇集了众多专业的签名设计公司.提供最优质的签名设计服务,足不出户解决签名设计问题,找签名设计就上威客牛网.https://www.winvk.com/qianming/
23.签名设计教程签名设计要求签名设计说明一品威客签名设计学习频道,为大家提供丰富的签名设计教程,签名设计要求,签名设计说明等覆盖签名设计指南、入门、基础,轻松掌握签名设计理念,制定出签名设计方案,成为签名设计大师。https://www.epwk.com/qianmingsj/meijie/
24.微信小程序实现手写签名的示例代码?目录1.效果图2.相关代码canvas代码js相关 在微信小程序上实现手写签名,获取canvascontext新版本和旧版本有点坑,新版本在获取canvas后如果页面有滑动,则签名坐标出现异常(在微信开发者工具上会出现2022-2-17),但是在真机上即使滑动也不会出现异常,为了防止出现问题,暂时使用旧版本获取canvascontext https://www.finclip.com/news/f/68852.html
25.应用签名app签名软件开发源码搭建APP制作网站开发小程序开发微信作为太和县郭庙刘龙家庭农场的推广员,我向您推荐一款juejia的应用签名软件开发源码!这款软件不仅可以帮助您搭建自己的APP制作网站,还可以进行小程序开发、微信公众号游戏开发等多种功能。相信它将成为您实现商业目标的得力助手。 这款应用签名app签名软件开发源码的价格仅为99元/件,真是性价比超高!它提供了许多令人https://product.11467.com/info/23773349.htm
26.在线签合同的小程序(文档在线签名怎么弄)电子合同电子签名小程序可以让用户在微信内直接完成合同文件签名操作,提高合同签署的效率和便捷性,在线签合同已经融入人们日常工作生活的方方面面。那么,在线签合同的小程序?文档在线签名怎么弄? 在线签合同的小程序 目前比较流行的在线签合同的小程序有【法大大】,法大大是正规的电子合同与电子签名服务平台,致力于为企业、政府https://www.fadada.com/notice/detail-16731.html
27.小程序申请应用签名怎么弄?这是一个常见的问题,许多小程序的都会遇到。在本文中,我们将为您提供有价值的信息,以帮助您了解如何申请小程序应用签名。 一、什么是小程序应用签名? 小程序应用签名是小程序必须申请的一个证书,用于验证小程序的身份和安全性。在小程序发布前,必须先申请应用签名,否则无法通过审核。 https://www.guangli88.com/news/industry/142843.html
28.微信小程序API用户数据的签名验证和加解密微信小程序作为一款轻量级的应用,其安全性也备受关注,为了保证数据的安全性,微信小程序提供了一套完整的API来对用户数据进行签名验证和加解密,本文将详细介绍微信小程序API中的用户数据签名验证和加解密技术。 用户数据的签名验证 1、1 为什么需要签名验证? https://www.kdun.com/ask/505821.html