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.fadada.com/notice/detail-16731.html
2.在人民法院在线服务小程序进行立案操作,在线签名为何会失败?如果需要针对性解答,可以直接向我咨询并描述您的情况,本地专业律师将24小时在线解答。https://www.lawtime.cn/wenda/q_47944397.html
3.艺术字签名小程序源码在线签名小程序流量主广告激励视频游戏开发店主也搭建了很多小程序流量主的程序,也欢迎大家交流心得。 开通流量主后 会有横幅,激励视频, 只要要后端填写广告id, 一切的一切都自动化出现 关于流量主周边的问题,也基本可以处理,增值服务可帮你开流量主。 套餐一:拍1件 套餐二:安装 技术支撑,拍2件 https://www.songma.com/product/view193354.html
4.在线简易轻松艺术字体签名流量主小程序在线简易轻松艺术字体签名流量主小程序是基于腾讯云的服务,修改基础版生成次数限制,每日2000次限制 1.新增页面内分享 2.添加生成页面 2.新增格子广告 3.新增二十四小时保存次数到达后激励式视频播放 4.新增其他(可跳转其他小程序,H5,拨打电话)https://market.cloud.tencent.cn/products/21014
5.在线签合同/签名/信息认证(无插件依赖)分类专栏: 微信小程序 前端开发 uniapp 文章标签: uni-app javascript 前端 版权 最近项目接到一个新的需求,需要对接一个可以在线签合同的的功能,知道需要后马上开干,经过一番斗争,终于终于下班啦 开个玩笑,废话不多说,直接上代码,因为代码是直接项目中搬出来的,没有依赖其他插件纯手工,小伙伴们要看清除那些是https://blog.csdn.net/changshataofan/article/details/128183848
6.人民法院在线服务小程序上立案,网上签名失败人民法院在线服务小程序上立案,网上签名失败,为什么 律师解答共有3条 网上立案成功后,一般无需亲自前往法院,只需等待法官的通知即可。在起诉过程中,首要步骤是收集证据,如果双方有书面协议则最为理想;若无书面协议,仅有口头协议,则需设法获取相关证据,因为缺乏证据将难以进行查证。https://wap.findlaw.cn/wenda/q_45027469.html
7.钉钉小程序实现签名板为了对门店做规范管理,会进行巡店且输出巡店报告,此时就需要有一个老板签名的功能,证明老板认可且了解当前结果。由于我们巡店用到的是钉钉小程序,所以下面将会为大家展示如何在小程序中实现一个签名板功能。 阅读原文 xiaozi于2024-01-30 1411海报分享 关联话题:#古茗 https://tool.lu/index.php/article/5Wx/detail
8.线上签字软件有哪些线上签字APP推荐现在越来越多的合同都流行在网上签署,预约纸质版的合同签署区别有很大不同,最主要的是最后的签字环节不同。那么最后签字就需要找到一个可以线上签字的软件,线上签字软件有哪些呢?今天小编给大家推荐几款APP可以轻松实现这一需求。大家在线上签字的时候直接适用这些软件可以节省很多时间。 https://m.wandoujia.com/strategy/6086106346296303148.html
9.在线签名小程序制作,在线签名网站系统开发小程序案例在线签名小程序制作,在线签名网站系统开发 微信号:15663335999 添加小程序制作客服微信号,制作各类微信小程序,微网站制作,微信公众平台开发,APP开发,网站定制,H5设计,各类网络工程开发! 复制微信号 在线手签 用户后台添加合同或者直接上传word上传 1.根据需求自定义配置要求http://www.xiaochengxuzhizuo.cn/post/135401.html
10.微信小程序电子签名JavaScript随着移动办公的普及,电子签名需求日益增长。作为一种便捷、安全的电子签名解决方案,微信小程序电子签名受到了越来越多企业和个人的青睐。本文将为您介绍微信小程序电子签名的好处、应用场景以及如何优化微信小程序以提高搜索排名。 一、微信小程序电子签名的好处 https://www.yyzq.team/post/361294.html
11.抖音艺术签名微信小程序源码抖音艺术签名小程序源码 艺术签名设计小程序源码 字节跳动小程序开发 搭建安装教程参考: 微信小程序搭建开发、修改调试、编译打包上线使用教程 程序演示图: THE END 微信小程序 喜欢就点个赞再走呗~ 17赞赏 6月6日 金币10771 说点什么抢沙发 说点正能量的内容吧 https://www.yizhanzzw.com/36229.html
12.php+uniapp(微信小程序版)实现电子签名及合同生成想实现在线电子签名,及生成签名到合同文件 第一部分:uniapp小程序端 1.从插件市场导入手写签名canvas电子签名,按照操作步骤即可使用。我这里是调整了样式,修改了组件,根据自己实际UI调整 我的UI效果图: 2.通过组件的submit方法可以得到签名后的图片临时文件,将图片上传到后台得到服务器图片地址,保存下来 http://www.phpheidong.com/blog/article/292753/879176ea2d1b3492fdbe/
13.山东政务服务网济宁市目前,市场主体全程电子化登记可以应用电子营业执照实现电子签名。 使用流程:经办人使用手机下载安装山东市场监管电子签名平台→选择企业签章登录入口→系统自动启动进入电子营业执照微信小程序→选择对应企业名称→输入6位数“执照密码”→点击“确认”→点击“返回应用”,跳转回到电子签名平台界面→依据提示进行签名。 http://jiytzwfw.sd.gov.cn/jnzwdt/jnzwdt/pages/other/noticedetail.html?infoID=79826563-a8ca-4bee-8ce5-7c0172556c85
14.设计签名小程序制作软件(设计你的签名小程序篇)设计签名小程序制作软件是一款方便快捷的工具,可用于创建个性化的签名小程序。本文将从四个方面详细阐述设计签名小程序制作软件的特点和功能,包括界面设计、自定义选项、数据管理和云端部署。通过对这四个方面的介绍,读者可以了解到设计签名小程序制作软件的优势和应用场景,从而引起读者的兴趣。 https://www.ahbfapp.com/news/1985.html
15.签名算法小程序小程序 介绍 能力 开发 设计 数据 运营 社区 开发/服务端 OpenAPI/签名算法 更新时间 2024-05-21 10:58:41 我的收藏 遇到任何签名问题强烈建议请先通读本文,从历史经验看,平台当前遇到的 oncall 问题都可以从本文中找到答案,提 oncall 问题并得到解答的时间往往比通读本文自行解决要慢,因此强烈建议遇到签名问题https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/signature-algorithm/
16.艺术签名助手小程序二维码艺术签名助手小程序入口分类:系统 发布:2017-02-07 搜索词:艺术签名助手 提示:若暂无二维码,请复制搜索词在微信搜索。 微信扫一扫,使用小程序 请使用微信6.5.3以上的版本详情 相关 艺术签名助手小程序二维码是艺术签名助手微信公众账号当中的艺术签名助手小程序入口。艺术签名助手小程序简单好用,可以帮你快速的设计一个个性签名,想用就http://www.onlinedown.net/miniapp/361.htm
17.微信小程序实现手写签名的示例代码?目录1.效果图2.相关代码canvas代码js相关 在微信小程序上实现手写签名,获取canvascontext新版本和旧版本有点坑,新版本在获取canvas后如果页面有滑动,则签名坐标出现异常(在微信开发者工具上会出现2022-2-17),但是在真机上即使滑动也不会出现异常,为了防止出现问题,暂时使用旧版本获取canvascontext https://www.finclip.com/news/f/68852.html
18.小程序申请应用签名怎么弄?这是一个常见的问题,许多小程序的都会遇到。在本文中,我们将为您提供有价值的信息,以帮助您了解如何申请小程序应用签名。 一、什么是小程序应用签名? 小程序应用签名是小程序必须申请的一个证书,用于验证小程序的身份和安全性。在小程序发布前,必须先申请应用签名,否则无法通过审核。 https://www.guangli88.com/news/industry/142843.html
19.手机怎么制作电子签名小程序怎么制作电子版电子签名接亲网目前主流的电子签名小程序有【法大大】,法大大是正规的电子合同与电子签名服务平台,致力于为企业、政府和个人提供基于合法数字签名技术的电子合同和电子单据的签署及管理服务。2018年9月接入全球首个法院区块链平台,2021年3月,法大大获得腾讯领头的D轮投资,2021年7月,法大大发布中国首部电子劳动合同白皮书。 https://www.jieqinwang.com/baike/detail_121626
20.小程序中实现手写签名(9.149.18)本期主题:小程序中实现手写签名 前言:在小程序产品设计上,有许多对列表需要手写签名的情景,如:签收快递,签约合同或协议时,用户通过在小程序中操作来实现手写签名。一、效果预览 二、实现思路 整体思路就是监听画布的触摸操作,记录触摸时坐标,计算触摸实时移动坐标并计算移动距离,并将上次坐标通过划线的方式延伸https://open.alipay.com/portal/forum/post/14301013