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://baijiahao.baidu.com/s?id=1818316413515918000&wfr=spider&for=pc
2.线上签字软件有哪些线上签字APP推荐现在越来越多的合同都流行在网上签署,预约纸质版的合同签署区别有很大不同,最主要的是最后的签字环节不同。那么最后签字就需要找到一个可以线上签字的软件,线上签字软件有哪些呢?今天小编给大家推荐几款APP可以轻松实现这一需求。大家在线上签字的时候直接适用这些软件可以节省很多时间。 https://www.wandoujia.com/strategy/6086106346296303148.html
3.智云签署原笔迹签名APP签字小程序数字化签约,一站式解决纸质合同签署痛点 立即下载使用网页版 传统纸质签 签约效率低 打印合同,来回快递,审批盖章流程繁琐,耗时麻烦 签约成本高 快递费用、纸墨消耗、存档管理等资费成本高 签约风险高 假公章、假签名无法杜绝,公章遗失损坏、盗用私盖、篡改合同频发http://tuodait.cn/zyqs/
4.uni文章介绍了如何使用uni-app开发微信小程序中的电子签名功能,包括点击重写进入签名页面、书写签名并确认、以及图片的翻转显示过程。 摘要由CSDN通过智能技术生成 文章目录 1. 需求背景 2. 开始撸 2.1 点击 重写 进入签名页面(上图一) 2.2 书写签名,点击确认返回,及图片翻转显示(上图二,三) https://blog.csdn.net/qq_36410795/article/details/134734330
5.好签小程序手写签名组件/在线手写签批系统好签原笔迹手写技术可以在任何版式文档格式上进行手写与笔迹的展示,与文档类型无关,它是一款真正意义的跨文档格式的手写批示引擎,在常用的版式文件上都可以进行手写批示,如PDF、JGP、PNG、Html等。甚至可单独应用于手写记事本,手写记事本的背景图片、背景颜色可以随意定义。 https://www.jianshu.com/p/17f2f9086af5
6.微信线上签字小程序网上联名签字的小程序可以直接在手机上签字微信线上签字小程序 网上联名签字的小程序,多人电子签名小程序 不用见面如何实现多人签字签在一张纸上,集体签字的倡议书怎么在微信上写,多人集体签名小程序,近年来,随着数字化时代的到来,电子签名成为了商务活动中不可或缺的一环。而随着技术的不断发展,线上集体电子签名小程序应运而生,为我们提供了更加便捷高效http://www.xwykj.com/details/63596.html
7.@当事人,没时间参加庭审,异步“微法庭”10个锦囊为你解忧!你们的难处我都懂!开庭解忧小程序“微法庭”了解一下~ 什么是微法庭? 微法庭,也称异步庭审,是一种线上庭审方式。有别于传统线下实体法庭的开庭形式,异步庭审通过线上平台“微法庭”完成庭审活动。 较之于在线庭审须各方同时在线的开庭形式,参与微法庭的审判人员、当事人及其他诉讼参与人可以在规定期限内的不同时https://www.jfdaily.com/sgh/detail?id=902351
8.电子签名小程序有哪些(微信合同电子签名怎么弄)电子合同借助电子签名技术,用微信小程序在手机端即可签署有法律效力的合同,在线签约发展迅速,逐渐融入生活工作的方方面面。今天就来看看,电子签名小程序有哪些,微信合同电子签名怎么弄。 电子签名小程序有哪些 目前主流的电子签名小程序有【法大大】,法大大是正规的电子合同与电子签名服务平台,致力于为企业、政府和个人提供基于https://www.fadada.com/notice/detail-15630.html
9.钉钉小程序实现签名板为了对门店做规范管理,会进行巡店且输出巡店报告,此时就需要有一个老板签名的功能,证明老板认可且了解当前结果。由于我们巡店用到的是钉钉小程序,所以下面将会为大家展示如何在小程序中实现一个签名板功能。 阅读原文 xiaozi于2024-01-30 1411海报分享 关联话题:#古茗 https://tool.lu/index.php/article/5Wx/detail
10.公司注册程序流程图是怎样的?公司注册方法是什么注册问题通过登录“广州市开办企业一网通平台”或者“广州市开办企业一网通平台”的小程序,一表填报全部申办信息一次提交。 4、法人股东在广州一网通微信小程序签名 申请人,通过自己的个人微信,搜索“广州一网通企业开办”小程序,完成个人认证后,进入待签署文件。 5、审批(一个工作日)通过审核可以先制法人章 https://www.wen51.com/news/show/207098/
11.Fusion百度网盘下载HTCFusion百度网盘12.18.3免费下载3.上线哎呦宠物小程序,快来生成你的萌宠表情包4.照片回忆支持导出为视频,可以进行快捷分享5.视频投屏支持连续播放和切换下一集,观影更畅快~说明:需要投屏设备支持推送视频列表才能使用哦6.首页推荐最近卡片可以自动更新啦2024已至,祝您在新的一年里龙行龘龘,万事胜意!百度网盘 12.6.0 中的新功能春风送暖入屠苏,https://sj.zol.com.cn/htc/fusion/detail_24885.shtml
12.在线签名小程序制作,在线签名网站系统开发小程序案例在线签名小程序制作,在线签名网站系统开发 微信号:15663335999 添加小程序制作客服微信号,制作各类微信小程序,微网站制作,微信公众平台开发,APP开发,网站定制,H5设计,各类网络工程开发! 复制微信号 在线手签 用户后台添加合同或者直接上传word上传 1.根据需求自定义配置要求http://www.xiaochengxuzhizuo.cn/post/135401.html
13.微信小程序API用户数据的签名验证和加解密微信小程序作为一款轻量级的应用,其安全性也备受关注,为了保证数据的安全性,微信小程序提供了一套完整的API来对用户数据进行签名验证和加解密,本文将详细介绍微信小程序API中的用户数据签名验证和加解密技术。 用户数据的签名验证 1、1 为什么需要签名验证? https://www.kdun.com/ask/505821.html
14.“人民法院在线服务”小程序网上立案教程打开微信→点击发现→选择小程序→搜索“人民法院在线服务河北”可直接进入。 二、进行实名认证 1、进入“人民法院在线服务”页面,点击“未认证”或“已认证”,跳转到证件核验页面,可进行实名的注册认证或重新认证。 2、在“证件核验”页面,输入姓名、身份证号、手机号等信息,通过人脸识别,完成实名认证。 https://xtqdfy.hebeicourt.gov.cn/article/detail/2024/03/id/7856417.shtml
15.设计签名小程序制作软件(设计你的签名小程序篇)设计签名小程序制作软件是一款方便快捷的工具,可用于创建个性化的签名小程序。本文将从四个方面详细阐述设计签名小程序制作软件的特点和功能,包括界面设计、自定义选项、数据管理和云端部署。通过对这四个方面的介绍,读者可以了解到设计签名小程序制作软件的优势和应用场景,从而引起读者的兴趣。 https://www.ahbfapp.com/news/1985.html
16.微信电子签名小程序开发需求介绍个人签名:个人在社交平台上的签名也可以通过电子签名小程序进行创建和应用,增加个性化和艺术性。 总结 微信电子签名小程序的开发旨在为用户提供一种便捷、安全、可靠的电子签名解决方案。通过提供用户认证、电子签名创建、文件上传、安全保障、存储和管理等功能,该小程序适用于合同签署、表单填写、授权文件等多种使用场景,https://www.xhl8.cn/a/2917.html
17.在学证明电子成绩单都可以线上办理啦!学籍证明、电子成绩单都可以线上办理! 疫情当前,提倡无接触远程服务,闽江学院2007级(含)以后学生可线上办理电子学籍、成绩等证明文件。 请搜索微信小程序—“校务行”。 如今,在校生远程自助打印电子成绩单、电子在校证明等材料已不再是梦想,现将“校务行”小程序操作流程介绍如下: 一、https://jwc.mju.edu.cn/2023/0316/c397a145888/pagem.htm
18.微信小程序怎么实现电子签名功能问答要实现微信小程序的电子签名功能,可以按照以下步骤进行:1. 创建一个Canvas元素,用于绘制用户的签名。可以使用wx.createCanvasContext方法创建一个Canvas上下文对象。2. https://www.yisu.com/ask/20984671.html
19.手机怎么制作电子签名小程序怎么制作电子版电子签名接亲网签字完成后,手机会自动保存PDF格式并跳转到“已签文件”页面,此时呢,我们选中签署的文件可以通过微信、QQ等多种形式分享给第三方。 三、电子签名小程序有哪些 目前主流的电子签名小程序有【法大大】,法大大是正规的电子合同与电子签名服务平台,致力于为企业、政府和个人提供基于合法数字签名技术的电子合同和电子单据的https://www.jieqinwang.com/baike/detail_121626
20.奇安信攻防社区测试小程序的逻辑漏洞经常会遇到sign签名标识,若不知道sign的生成方式,只篡改参数的值无法修改sign的值,那么漏洞测试就很难进行下一步。本篇分享将围绕如何绕过小程序sign标识展开 漏洞前言: 测试小程序的逻辑漏洞经常会遇到sign签名标识,若不知道sign的生成方式,只篡改参数的值无法修改sign的值,那么漏洞测试就很难进行https://forum.butian.net/index.php/share/2342
21.2023免费设计艺术签名多种模式微信小程序源码带流量主某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主,喜欢的小伙伴可以玩玩! 搭建安装教程参考: 微信小程序搭建开发、修改调试、编译打包上线使用教程 程序演示图: THE END 微信小程序 喜欢就点个赞再走呗~ 6赞赏 说点什么抢沙发 说点正能量的内容吧 https://www.yizhanzzw.com/34447.html
22.签名算法小程序小程序 介绍 能力 开发 设计 数据 运营 社区 开发/服务端 OpenAPI/签名算法 更新时间 2024-05-21 10:58:41 我的收藏 遇到任何签名问题强烈建议请先通读本文,从历史经验看,平台当前遇到的 oncall 问题都可以从本文中找到答案,提 oncall 问题并得到解答的时间往往比通读本文自行解决要慢,因此强烈建议遇到签名问题https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/signature-algorithm/
23.android自动签名工具下载安卓签名在线生成最近由于需要对Android的app程序进行签名,就查了一下具体的操作,由于目前还是小白级别的于是就采用了第二种最简单的方法,但是这个方法只是生成了一个keystore文件和一个签名之后的apk,要想查到底生成的签名是什么还是得需要其他的工具来查看,我就发现了一个可以再Android机上查本机上的签名的小程序, https://blog.51cto.com/u_16213581/8465185