【微信小程序canvas】实现小程序手写板用户签名(附代码)

工作中公司业务需要的微信小程序用户签字功能

先看效果图:

demo

wxml

重写

完成

bindtouchend="uploadScaleEnd" bindtap="mouseDown" canvas-id="handWriting">

手写板

js

datapage({

data: {

canvasName: 'handWriting',

ctx: '',

canvasWidth: 0,

canvasHeight: 0,

transparent: 1, // 透明度

selectColor: 'black',

lineColor: '#1A1A1A', // 颜色

lineSize: 1.5,  // 笔记倍数

lineMin: 0.5,   // 最小笔画半径

lineMax: 4,     // 最大笔画半径

pressure: 1,     // 默认压力

smoothness: 60,  //顺滑度,用60的距离来计算速度

currentPoint: {},

currentLine: [],  // 当前线条

firstTouch: true, // 第一次触发

radius: 1, //画圆的半径

cutArea: { top: 0, right: 0, bottom: 0, left: 0 }, //裁剪区域

bethelPoint: [],  //保存所有线条 生成的贝塞尔点;

lastPoint: 0,

chirography: [], //笔迹

currentChirography: {}, //当前笔迹

linePrack: [], //划线轨迹 , 生成线条的实际点

}

})

初始化page({

onLoad () {    let canvasName = this.data.canvasName    let ctx = wx.createCanvasContext(canvasName)    this.setData({      ctx: ctx

})    var query = wx.createSelectorQuery();

query.select('.handCenter').boundingClientRect(rect => {query.select('.handCenter').boundingClientRect(rect => {          this.setData({this.setData({            canvasWidth: rect.width,canvasWidth: rect.width,            canvasHeight: rect.heightcanvasHeight: rect.height

})})

}).exec(); }).exec();

}, },

})

事件函数

笔迹开始// 笔迹开始

uploadScaleStart (e) {    if (e.type != 'touchstart') return false;    let ctx = this.data.ctx;

ctx.setFillStyle(this.data.lineColor);  // 初始线条设置颜色

ctx.setGlobalAlpha(this.data.transparent);  // 设置半透明

let currentPoint = {      x: e.touches[0].x,      y: e.touches[0].y

}    let currentLine = this.data.currentLine;

currentLine.unshift({      time: new Date().getTime(),      dis: 0,      x: currentPoint.x,      y: currentPoint.y

})    this.setData({

currentPoint,      // currentLine

})    if (this.data.firstTouch) {      this.setData({        cutArea: { top: currentPoint.y, right: currentPoint.x, bottom: currentPoint.y, left: currentPoint.x },        firstTouch: false

})

}    this.pointToLine(currentLine);

},

笔迹移动// 笔迹移动

uploadScaleMove (e) {    if (e.type != 'touchmove') return false;    if (e.cancelable) {      // 判断默认行为是否已经被禁用

if (!e.defaultPrevented) {

e.preventDefault();

}

}    let point = {      x: e.touches[0].x,      y: e.touches[0].y

}    //测试裁剪

if (point.y

}    if (point.y  this.data.cutArea.right) {      this.data.cutArea.right = point.x;

}    if (this.data.canvasWidth - point.x <= 0) {      this.data.cutArea.right = this.data.canvasWidth;

}    if (point.y > this.data.cutArea.bottom) {      this.data.cutArea.bottom = point.y;

}    if (this.data.canvasHeight - point.y <= 0) {      this.data.cutArea.bottom = this.data.canvasHeight;

}    if (point.x

}    if (point.x

})    let currentLine = this.data.currentLine

currentLine.unshift({      time: new Date().getTime(),      dis: this.distance(this.data.currentPoint, this.data.lastPoint),      x: point.x,      y: point.y

})    // this.setData({

//   currentLine

// })

this.pointToLine(currentLine);

},

笔迹结束// 笔迹结束

uploadScaleEnd (e) {    if (e.type != 'touchend') return 0;    let point = {      x: e.changedTouches[0].x,      y: e.changedTouches[0].y

}    this.setData({      lastPoint: this.data.currentPoint,      currentPoint: point

})    let currentLine = this.data.currentLine

currentLine.unshift({      time: new Date().getTime(),      dis: this.distance(this.data.currentPoint, this.data.lastPoint),      x: point.x,      y: point.y

})    // this.setData({

//   currentLine

// })

if (currentLine.length > 2) {      var info = (currentLine[0].time - currentLine[currentLine.length - 1].time) / currentLine.length;      //$("#info").text(info.toFixed(2));

}    //一笔结束,保存笔迹的坐标点,清空,当前笔迹

//增加判断是否在手写区域;

this.pointToLine(currentLine);    var currentChirography = {      lineSize: this.data.lineSize,      lineColor: this.data.lineColor

};    var chirography = this.data.chirography

chirography.unshift(currentChirography);    this.setData({

chirography

})    var linePrack = this.data.linePrack

linePrack.unshift(this.data.currentLine);    this.setData({

linePrack,      currentLine: []

})

},

wxsspage {  background: #fbfbfb;  height: auto;  overflow: hidden;

}.wrapper {  width: 100%;  height: 95vh;  margin: 30rpx 0;  overflow: hidden;  display: flex;  align-content: center;  flex-direction: row;  justify-content: center;  font-size: 28rpx;

}.handWriting {  background: #fff;  width: 100%;  height: 95vh;

}.handRight {  display: inline-flex;  align-items: center;

}.handCenter {  border: 4rpx dashed #e9e9e9;  flex: 5;  overflow: hidden;  box-sizing: border-box;

}.handTitle {  transform: rotate(90deg);  flex: 1;  color: #666;

}.handBtn button {  font-size: 28rpx;

}.handBtn {  height: 95vh;  display: inline-flex;  flex-direction: column;  justify-content: space-between;  align-content: space-between;  flex: 1;

}.delBtn {  position: absolute;  top: 550rpx;  left: 0rpx;  transform: rotate(90deg);  color: #666;

}.delBtn image {  position: absolute;  top: 13rpx;  left: 25rpx;

}

结语

详细项目代码handwriting-weapp(微信小程序原生canvas用户签字手写板,后续更新计划组件化、优化渲染逻辑、增加功能,欢迎start 和 PR)

作者:老夫很性感

链接:https://www.jianshu.com/p/84dcc0adfe44

微信小程序 手写签名_【微信小程序canvas】实现小程序手写板用户签名(附代码)...相关推荐

  1. 微信小程序手写饼状图,非wx-echarts库,简洁易懂,不占代码体积!!!

    写在前面:小程序也有echarts组件库,但是我觉得太占代码量了,本来小程序的体积只有2m.在下载个组件库.那就没多少了.索性就手写一个. 实现效果: 布局 <view class=" ...

  2. 微信小程序 手写签名_你竟然还不知道在微信上就可以手写签名、签文件了~

    原标题:你竟然还不知道在微信上就可以手写签名.签文件了~ 你是否遇到以下问题: 正在休假却收到公司的夺命连环call,说有重要文件需要你签字确认? 正在上班,却有孩子学校.小区.甚至居委会各种需要通知 ...

  3. 【微信小程序canvas】实现小程序手写板用户签名(附代码)测试有效

    工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml: <view class="wrapper"><view class="handBt ...

  4. 【微信小程序canvas】实现小程序手写板用户签名(附代码)

    [微信小程序canvas]实现小程序手写板用户签名(附代码) 工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml <view class="wrapper"& ...

  5. 机器学习之KNN结合微信机器人实现手写数字识别终极API

    机器学习之KNN结合微信机器人实现手写数字识别终极API 手写数字识别 功能概述 实现步骤 结果展示 改进之处和TIPS 手写数字识别 功能概述 微信机器人接收到的手写数字图片,传送给已经经过机器学习 ...

  6. java文字手写识别_【手写文字识别】-JavaAPI示例代码

    手写文字识别-JavaAPI示例代码 不知不觉手写文字识别百度已经开始邀测了.需要的小伙伴去申请了哦.申请方式加入文字识别群找PM.或者工单提交申请.都要说明自己的APPID哦. 接口地址:https ...

  7. 微信小程序 手写签名_微信小程序实现电子签名功能

    本文实例为大家分享了微信小程序实现电子签名的具体代码,供大家参考,具体内容如下 // XXXX.wxml bindtouchmove="canvasMove" bindtouche ...

  8. 微信小程序 手写签名_小程序手写签名(wepy)

    对于手写签名组件组件晚上有很多种写法,我选择了一种进行了wepy的框架的改造.如果使用wepy框架做手写签名的话可以直接复制下面的代码. 这里需要提醒的是:安卓手机和苹果手机有适配性的问题,苹果手机在 ...

  9. 微信小程序 手写签名_微信小程序实现手写签字

    无纸化办公,这是老板对我的要求,然而有人现场执法文件全部电子化,只有签字部分让一个搞web的人有点儿头疼,不能为了这个找个人来开发app吧于是想到了小程序,对于一个新接触小程序的人来说还是有挑战性的, ...

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

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

最新文章

  1. 激活函数之softmax介绍及C++实现
  2. cv2.circle函数
  3. eclipse 切换svn账号
  4. android dispatchtouchevent 用法,android – 检测每个触摸事件,而不会覆盖dispatchTouchEvent()?...
  5. 一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目
  6. ORACLE TEXT FILTER PREFERENCE(二)
  7. 【C++】C++虚函数表详细分析(下)
  8. linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告
  9. 中秋节公司发了这个(结尾分享红包)
  10. ubuntu使用python opencv_Ubuntu中“利用Opencv + python进行特征匹配”的环境搭建
  11. Flex【原创】惯性定位效果
  12. FFmpeg总结(五)AV系列结构体之AVCodec、AVCodecParameters、AVCodecParser、AVCodecParserContext、AVCodecDescriptor
  13. 计算机维修报价,求一张电脑维护维修价格表
  14. UNIX环境高级编程习题——第一章
  15. 软件工程设计概念与体系结构设计
  16. 如何系统整理需求调研报告
  17. 【Jquery】文本框校验练习
  18. stm32f107外设晶振8MHZ换成25MHZ 配置系统时钟72MHZ
  19. 除了支付宝,微信也能查询账单了!再也不担心钱花哪去了!
  20. python 第三方插件登陆——QQ

热门文章

  1. 加载MNIST数据集
  2. 直线平面垂直的判定和性质
  3. php 和 java 美刀,通过GOOGLE(谷歌) API获取实时货币汇率(人民币和美金)的PHP代码
  4. 计算机ppt基础知识题库,计算机二级考试MSOffice考试题库ppt操作题附答案.pdf
  5. Unity3D学习1--Unity基础
  6. 基于HFSS的圆极化阵列天线设计
  7. 视频搬运伪原创 视频修改MD5值
  8. 硬盘分区表知识——详解硬盘MBR
  9. 深度学习:图像识别(匹配)方法|室内定位|论文与方法整理
  10. 数学建模——sas(1)——几种统计方法