微信小程序 手写签名_【微信小程序canvas】实现小程序手写板用户签名(附代码)...
【微信小程序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】实现小程序手写板用户签名(附代码)...相关推荐
- 微信小程序手写饼状图,非wx-echarts库,简洁易懂,不占代码体积!!!
写在前面:小程序也有echarts组件库,但是我觉得太占代码量了,本来小程序的体积只有2m.在下载个组件库.那就没多少了.索性就手写一个. 实现效果: 布局 <view class=" ...
- 微信小程序 手写签名_你竟然还不知道在微信上就可以手写签名、签文件了~
原标题:你竟然还不知道在微信上就可以手写签名.签文件了~ 你是否遇到以下问题: 正在休假却收到公司的夺命连环call,说有重要文件需要你签字确认? 正在上班,却有孩子学校.小区.甚至居委会各种需要通知 ...
- 【微信小程序canvas】实现小程序手写板用户签名(附代码)测试有效
工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml: <view class="wrapper"><view class="handBt ...
- 【微信小程序canvas】实现小程序手写板用户签名(附代码)
[微信小程序canvas]实现小程序手写板用户签名(附代码) 工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml <view class="wrapper"& ...
- 机器学习之KNN结合微信机器人实现手写数字识别终极API
机器学习之KNN结合微信机器人实现手写数字识别终极API 手写数字识别 功能概述 实现步骤 结果展示 改进之处和TIPS 手写数字识别 功能概述 微信机器人接收到的手写数字图片,传送给已经经过机器学习 ...
- java文字手写识别_【手写文字识别】-JavaAPI示例代码
手写文字识别-JavaAPI示例代码 不知不觉手写文字识别百度已经开始邀测了.需要的小伙伴去申请了哦.申请方式加入文字识别群找PM.或者工单提交申请.都要说明自己的APPID哦. 接口地址:https ...
- 微信小程序 手写签名_微信小程序实现电子签名功能
本文实例为大家分享了微信小程序实现电子签名的具体代码,供大家参考,具体内容如下 // XXXX.wxml bindtouchmove="canvasMove" bindtouche ...
- 微信小程序 手写签名_小程序手写签名(wepy)
对于手写签名组件组件晚上有很多种写法,我选择了一种进行了wepy的框架的改造.如果使用wepy框架做手写签名的话可以直接复制下面的代码. 这里需要提醒的是:安卓手机和苹果手机有适配性的问题,苹果手机在 ...
- 微信小程序 手写签名_微信小程序实现手写签字
无纸化办公,这是老板对我的要求,然而有人现场执法文件全部电子化,只有签字部分让一个搞web的人有点儿头疼,不能为了这个找个人来开发app吧于是想到了小程序,对于一个新接触小程序的人来说还是有挑战性的, ...
- 微信小程序---手写签名(签字版)
公司近期有个需要用户签名的功能,就用小程序canvas写了个, wxml <view class="sign"><view class="paper&q ...
最新文章
- 激活函数之softmax介绍及C++实现
- cv2.circle函数
- eclipse 切换svn账号
- android dispatchtouchevent 用法,android – 检测每个触摸事件,而不会覆盖dispatchTouchEvent()?...
- 一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目
- ORACLE TEXT FILTER PREFERENCE(二)
- 【C++】C++虚函数表详细分析(下)
- linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告
- 中秋节公司发了这个(结尾分享红包)
- ubuntu使用python opencv_Ubuntu中“利用Opencv + python进行特征匹配”的环境搭建
- Flex【原创】惯性定位效果
- FFmpeg总结(五)AV系列结构体之AVCodec、AVCodecParameters、AVCodecParser、AVCodecParserContext、AVCodecDescriptor
- 计算机维修报价,求一张电脑维护维修价格表
- UNIX环境高级编程习题——第一章
- 软件工程设计概念与体系结构设计
- 如何系统整理需求调研报告
- 【Jquery】文本框校验练习
- stm32f107外设晶振8MHZ换成25MHZ 配置系统时钟72MHZ
- 除了支付宝,微信也能查询账单了!再也不担心钱花哪去了!
- python 第三方插件登陆——QQ
热门文章
- 加载MNIST数据集
- 直线平面垂直的判定和性质
- php 和 java 美刀,通过GOOGLE(谷歌) API获取实时货币汇率(人民币和美金)的PHP代码
- 计算机ppt基础知识题库,计算机二级考试MSOffice考试题库ppt操作题附答案.pdf
- Unity3D学习1--Unity基础
- 基于HFSS的圆极化阵列天线设计
- 视频搬运伪原创 视频修改MD5值
- 硬盘分区表知识——详解硬盘MBR
- 深度学习:图像识别(匹配)方法|室内定位|论文与方法整理
- 数学建模——sas(1)——几种统计方法