继上一篇的《丝滑流畅的手写签名功能》博文才过去没多久,我才发现 canvas 2d 无法在 PC 的小程序中使用,真实白费了我的优化了,还好之前的代码没删掉,原本以为直接简单改改就能用,发现还不是,下面看看吧。

先看看效果图


鼠标用起来效果不怎么样,但是还是挺流畅的。

看看代码

主要就看看 Page.js 的代码吧,也就这个不一样,当然 HTML 内的 canvas 标签记得加上 canvas-id,把 type = ‘2d’ 给去掉。

// pages/mine/signature/drawCanvas/drawCanvas.js
var app = getApp()Page({data: {context: null,index: 0,height: 0,width: 0,// 前 一点preX: 0,preY: 0,preCenterX: 0,preCenterY: 0},onShow: function () {let query = wx.createSelectorQuery();const that = this;query.select('#firstCanvas').boundingClientRect();query.exec(function (rect) {let width = rect[0].width;let height = rect[0].height;that.setData({width,height});const context = wx.createCanvasContext('firstCanvas')that.setData({context: context})context.setStrokeStyle('#000000')context.setLineWidth(2)context.setFontSize(20)});},/**记录开始点 */bindtouchstart: function (e) {let context = this.data.contextlet curX = e.changedTouches[0].xlet curY = e.changedTouches[0].ycontext.beginPath()context.moveTo(curX, curY)this.data.preX = curXthis.data.preY = curYthis.data.preCenterX = curXthis.data.preCenterY = curY},/**记录移动点,刷新绘制 */bindtouchmove: function (e) {let context = this.data.contextlet preX = this.data.preXlet preY = this.data.preYlet preCenterX = this.data.preCenterXlet preCenterY = this.data.preCenterYlet curX = e.changedTouches[0].xlet curY = e.changedTouches[0].ylet deltaX = Math.abs(preX - curX)let deltaY = Math.abs(preY - curY)// 相差大于3像素的时候作二阶贝塞尔曲线if (deltaX >= 3 || deltaY >= 3) {// 前后两点中心点let centerX = (preX + curX) / 2let centerY = (preY + curY) / 2//这里以前一点作为控制点,中心点作为终点,起始点为上一次的中点,很流畅啊!context.moveTo(preCenterX, preCenterY)context.quadraticCurveTo(preX, preY, centerX, centerY);context.stroke();context.draw(true);this.data.preX = curXthis.data.preY = curYthis.data.preCenterX = centerXthis.data.preCenterY = centerY}},/**清空画布 */clear: function () {let context = this.data.contextcontext.clearRect(0, 0, this.data.width, this.data.height);context.draw();context.setStrokeStyle('#000000')context.setLineWidth(2)context.setFontSize(20)},/**导出图片 */export: function () {const that = this;this.data.context.draw(false, wx.canvasToTempFilePath({x: 0,y: 0,width: that.data.width,height: that.data.height,destWidth: that.data.width,destHeight: that.data.height,fileType: 'png',canvasId: 'firstCanvas',success(res) {app.log("tempFilePath:" + res.tempFilePath);// 你的代码},fail() {wx.showToast({title: '提交失败',icon: 'none',duration: 2000})}}))},
})

下面仔细讲讲不同点

  • 获取canvas方式不一样

这里因为使用的是旧版本的 canvas,所以用的还是原来的方式获取 canvas 的。

  • 属性值多加了 preCenterX 和 preCenterY

这个就很奇怪哦,可能是因为 canvas 的用法不一样,导致使用贝塞尔曲线的时候无法正确的定位到前一点位置,也可能是里面的前一点位置就是 canvas 内移动时一系列点中前一个点的位置,放在就不对,如果按前一篇博客的方式做,出来的就是下面的效果:


这里记得在手指初次落下的时候,初始化这两个值,并在移动后重新赋值。

  • 导出图片方式不一样

这里就是网上一大堆的办法,没什么好说的。

判别是否是PC版本

这里涉及一个判别是否是 pc 版本的小程序的问题,看下面代码

wx.getSystemInfo({success:function(res){that.setData({systemInfo:res,})if(res.platform == "devtools"){//开发者工具}else if(res.platform == "ios"){//IOS}else if(res.platform == "android"){//android}else {//电脑了吧}}})

在使用的地方合理选择正确的手写签名页面就可以,这里建议分别做两个页面,别把功能耦合在一起。

注意事项

  1. 真机调试有问题,真机调试 SelectorQuery.exec 方法不执行回调,太坑了。要查看的话使用预览吧,预览是没问题的。

  2. 还有就是横竖屏问题,我这设置的横屏实际显示的竖屏,可以在全局设置窗口改变吧,我就不动了。

  3. 最后就是样式问题,为什么我的图标不行了?这里注意下 rpx 值的变化,这里是竖屏,在横屏情况下值更大,看起来效果好。

结语

试了下没问题!而且调试器也是电脑版本,很奇怪为什么它可以使用 canvas 2d,而微信PC版本就不可以,开发者论坛很多人反馈也不解决。

end
完美撒花

丝滑流畅的手写签名 PC适配版相关推荐

  1. 丝滑流畅的手写签名 canvas 2d

    在最近的小程序项目中,设计师又给我出难题了,需要在小程序里面实现一个手写签名功能,完成后将签名生成文件,上传的服务端去.手写签名不难,难在居然要我生成 svg,还有将签名功能搞得和画板一样,我是不能忍 ...

  2. asp手写签名代码2021版提供源码控件

    今天接了一个小事,一个朋友想实现货物在线签收,要收货人在线签名,并保存入库,让我帮忙写一个asp的手写签名功能,忙活一下午实现了,估计会有很多人有这种需求,放网上吧 function lineCanv ...

  3. 【uni-app】使用写字板,实现手写签名----直接使用版

    需求 用户需在APP或小程序使用手写的方式签字或签名 效果图片 实现方式 封装成组件调用(推荐),如需了解使用可点击前往-[封装组件版] 使用的页面内直接使用,目前的教程就是直接使用的,未封装成组件 ...

  4. 微信小程序---手写签名(签字版)

    公司近期有个需要用户签名的功能,就用小程序canvas写了个, wxml <view class="sign"><view class="paper&q ...

  5. php手写签名保存,PHP+JS实现PC端+移动端PDF手写签名合并

    PHP+JS实现PC端+移动端PDF手写签名合并 1年前 阅读 3029 评论 0 喜欢 0 前端插件:`jSignature.js` PHP插件:`FPDF+FPDI` `index.html`代码 ...

  6. C# winform 手写签名,流畅不卡顿,在触摸屏上也可以完美使用,自动保存签名至本地(附源码下载)

    源码下载地址 可以自定义画笔的属性,包括透明度.颜色.宽度等信息. //记录直线或者曲线的对象private System.Drawing.Drawing2D.GraphicsPath mousePa ...

  7. android 手写 流畅,Android手写优化-更为平滑的签名效果实现

    前言 这是一篇翻译至squareup的文章,这是原文,之前有人在TIEYE上翻译过这篇文章,但现在链接已经失效,手写效率问题是一直是Android平台上一个比较棘手的问题,所以有必要将这篇文章带给An ...

  8. canvas 插件_基于Angular的Canvas手写签名插件

    灵感来源 之前, 在轻流的业务中遇到了一个需求, 是能够让客户使用手写签名的功能. 签名演示 问题来了, 这...我不会啊! 这得是Canvas了吧. 正所谓, 插件用的好, 下班走的早. 于是我就开 ...

  9. html5 移动端手写签名,H5移动端项目实现手写签名功能 vue实现手写签名

    vue 移动端实现手写签名效果,功能很完美,保存时保存为base64格式. 刚好项目用到此功能,就网上找了一下,清理了无用代码,简单方便,因为项目中多个地方需要使用,所以我将它整理为组件,通过ref和 ...

  10. 手写签名插件—jSignature使用心得

    最近需要做一个移动端手写签名的功能,上网搜了一下基本都是jSignature这个插件,几乎没得第二选择,于是照着网上的各个版本copy测试,在PC端测试是没什么问题的,很easy. 问题1::在移动端 ...

最新文章

  1. 调用其他脚本上方法的方法
  2. 【学习笔记】mongoDB初步(一)MongoDB的安装和增删改查基本语法,使用和命令
  3. 正则提取字符串-python
  4. XPE下关闭自动播放功能的方法
  5. FastJson/spring boot: json输出
  6. 本地搭建Dubbo监控中心的安装步骤
  7. WPF 从 .net core 3.1 到 .net 5.0
  8. Java Formatter locale()方法与示例
  9. android 开启dlna音乐服务_新品丨数字流媒体新宠——Stack Audio Link USB音乐播放器...
  10. python 学习笔记7(装饰器)
  11. 重装XP后无法启动LINUX的解决方案
  12. gmp php study,[技术干货] USP中文翻译连载 | 产品生命周期的包装密封性检查 (1、2之3)...
  13. JobTracker作业启动过程分析
  14. ubuntu 14.04 安装搜狗拼音输入法
  15. 对称加密算法 Blowfish 和 Twofish
  16. 沈阳理工大学计算机考研资料汇总
  17. Redis的一些知识
  18. PhpMyAdmin漏洞介绍
  19. esm_info_trans_flag之APN研究
  20. envi添加国内坐标系

热门文章

  1. stm32毕业设计 单片机指纹识别考勤系统
  2. 读nandflash---根据数据手册K9GAG08U0D
  3. 白盒测试-判定条件覆盖
  4. FIORI静态磁贴配置
  5. 深度学习目标检测模型汇总(论文,源码,数据集,推荐收藏)
  6. Android 复杂的列表视图新写法 MultiType (v3.1.0 修订版)
  7. PS4常用DNS一览 PSN下载速度慢登录失败解决办法
  8. 我的Java传承名单(不知为何以前的又没有了,幸亏有备份才可以又贴出来)
  9. luogu P1069 细胞分裂
  10. 高位十字星收盘什么意思?高位十字星缩量是什么?