小程序实现手写签名功能_javascript技巧
来源:网络
编辑:思怯
时间:2022-07-19
小程序利用canvas实现手写签名,供大家参考,具体内容如下
设置小程序横屏
在page.json或对应页面 .json文件中设置landscape代表固定横屏
"pageOrientation":"landscape"
手写签名
创建canvas画布 设置监听触摸开始 移动 结束等时间
此处为uniapp示例 原生小程序的也可参考进行修改(只需将@touchmove等事件换为bindtouchmove等微信事件即可)
<view class='contents'> <canvas class='firstCanvas' canvas-id="firstCanvas" @touchmove='move' @touchstart='start($event)' @touchend='end' @touchcancel='cancel' @longtap='tap' disable-scroll='true' @error='error'> </canvas> <view class="btnBox"> <view class="btn1" @tap='clearClick'>重签</view> <view class="btn2" @tap="overSign">完成签名</view> </view> </view>
page { background-color: #f2f2f2; } canvas { background-color: #fff; width: calc(100% - 20px); height: calc(100% - 70px); margin: 10px; position: absolute; } .btnBox { display: flex; height: 50px; width: 100%; position: fixed; left: 0; bottom: 0; } .btnBox view { width: 50%; text-align: center; height: 50px; line-height: 50px; color: #FFFFFF; } .btnBox view:active { background-color: #CCCCCC; color: #333333; } .btn1{ background-color: #FF8F58; } .btn2{ background-color: #0599D7; }
重点js
var content = null; var touchs = []; var canvasw = 0; var canvash = 0; var _that; export default { data() { return { isEnd: false, // 是否签名 srcA: '' } }, methods: { overSign: function() { if (this.isEnd) { let that = this uni.canvasToTempFilePath({ canvasId: 'firstCanvas', fileType: 'png', success: function(res) { //打印图片路径 console.log(res.tempFilePath) console.log('完成签名') // 可以再次进行直接保存图片到本地,这个保存就不写了可参考之前的canvas图片保存到本地 // 一般签名都是要返回前一页进行提交,所以在此将图片写到微信内部文件(不会出现在手机相册中)返回上一页获取,在上一页提交后在将图片删除 let fsm = uni.getFileSystemManager(); fsm.readFile({ filePath: res.tempFilePath, success: function(res) { //转换成功 var arrayBuffer = res.data fsm.writeFile({ filePath: `${wx.env.USER_DATA_PATH}/autograph.png`, data: arrayBuffer, encoding: 'binary', success() { console.log('写入成功') uni.navigateBack() }, fail(err) { console.log(err) }, }); }, fail: function(e) {} }) } }) } else { uni.showToast({ title: '请先完成签名', icon: "none", duration: 1500, mask: true }) } }, // 画布的触摸移动开始手势响应 start: function(event) { // console.log(event) // console.log("触摸开始" + event.changedTouches[0].x) // console.log("触摸开始" + event.changedTouches[0].y) //获取触摸开始的 x,y let point = { x: event.changedTouches[0].x, y: event.changedTouches[0].y } // console.log(point) touchs.push(point); }, // 画布的触摸移动手势响应 move: function(e) { let point = { x: e.touches[0].x, y: e.touches[0].y } // console.log(point) touchs.push(point) if (touchs.length >= 2) { this.draw(touchs) } }, // 画布的触摸移动结束手势响应 end: function(e) { // console.log("触摸结束" + e) // 设置为已经签名 this.isEnd = true // 清空轨迹数组 for (let i = 0; i < touchs.length; i++) { touchs.pop() } }, // 画布的触摸取消响应 cancel: function(e) { console.log("触摸取消" + e) }, // 画布的长按手势响应 tap: function(e) { console.log("长按手势" + e) }, error: function(e) { console.log("画布触摸错误" + e) }, //绘制 draw: function(touchs) { // console.log(touchs[0], touchs[1]) let point1 = touchs[0] let point2 = touchs[1] touchs.shift() content.moveTo(point1.x, point1.y) content.lineTo(point2.x, point2.y) content.stroke() content.draw(true) }, //清除操作 clearClick: function() { // 设置为未签名 this.isEnd = false //清除画布 content.clearRect(0, 0, canvasw, canvash) content.draw(true) }, }, /*生命周期函数--监听页面加载 */ onLoad: function(options) { _that = this let dev = uni.getSystemInfoSync() console.log(dev) // 获取横屏的宽高 设置画布的大小 // screenWidth windowHeight canvasw = dev.screenWidth - 20 canvash = dev.screenHeight - 70 //获得Canvas的上下文 content = wx.createCanvasContext('firstCanvas') //设置线的颜色 content.setStrokeStyle("#000") //设置线的宽度 content.setLineWidth(5) //设置线两端端点样式更加圆润 content.setLineCap('round') //设置两条线连接处更加圆润 content.setLineJoin('round') content.setFillStyle('white'); //填充白色 content.fillRect(0, 0, canvasw, canvash); //画出矩形白色背景 content.restore() content.save() }, }
上一页可在onshow中获取签名的图片 (若签名没有writeFile则可不理会下方的)
// 获取本地保存的图片 getImg() { var timestamp = new Date().getTime(); uni.getImageInfo({ src: `${wx.env.USER_DATA_PATH}/autograph.png`, success: function(res) { console.log(res.path) _that.srcA = res.path hasQM = true }, fail: function(err) { console.log(err) _that.srcA = '' }, }) }, //删除缓存的图片 delPic() { let fsm = uni.getFileSystemManager(); fsm.unlink({ filePath: `${wx.env.USER_DATA_PATH}/autograph.png`, success(res) { console.log(res) _that.srcA = '' hasQM = false }, fail(res) { console.error(res) } }) }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章:
- [前端]uniapp微信小程序自定义导航栏的全过程_javascript技巧
- [前端]微信小程序获取用户手机号码的详细步骤_javascript技巧
- [前端]微信小程序日期选择器使用详解_javascript技巧
- [前端]微信小程序自定义时间段picker选择器_javascript技巧
- [前端]微信小程序多项选择器checkbox_javascript技巧
- [前端]微信小程序自定义多列选择器使用_javascript技巧
- [前端]微信小程序实现地区选择伪五级联动_javascript技巧
- [前端]微信小程序实现日期时间筛选器_javascript技巧
- [前端]微信小程序复选框组件使用详解_javascript技巧
- [前端]微信小程序下拉框组件使用方法_javascript技巧
相关推荐:
- [前端]Vue3 编写自定义指令插件的示例代码_vue.js
- [前端]vue使用element实现上传图片和修改图片功能_vue.js
- [前端]JS前端架构pnpm构建Monorepo方式管理demo_JavaScript
- [前端]Iconfont不能上传如何维护Icon_React
- [前端]jquery实现手风琴展开效果_jquery
- [前端]js前端实现word excel pdf ppt mp4图片文本等文件预览_JavaScript
- [前端]uniapp实现横屏签字版_javascript技巧
- [前端]微信小程序实现手写签名(签字版)_javascript技巧
- [前端]vue 大文件分片上传(断点续传、并发上传、秒传)_vue.js
- [前端]微信小程序实现日期范围选择_javascript技巧
栏目分类
最新文章
- 如何在 JavaScript 中把字符串转换成数字
- 怎么理解ES6中Proxy及使用场景
- 详解vuex中的this.$store.dispatch方法
- javascript的call和apply的区别
- 为什么要使用Reflect对象
- 前端一些好学好用的代码规范-git hook+husky + commitlint
- 前端一些好学好用的代码规范-git hook+husky + commitlint
- 解决报错Node Sass does not yet support your current environment: Windows 64-bit with Unsupported
- mac安装nvm
- npm husky install .git can not be found解决方案
热门文章
- CSS世界PDF电子版百度云网盘下载
- JavaScript权威指南(第6版)中文版PDF电子版百度云网盘下载
- Web服务 原理与技术[Michael P. Papazoglou]PDF电子版百度云网盘下载[44.7M]
- 基于TypeScript的HTML5游戏开发本科毕业设计PDF电子版百度云网盘下载
- 详解vue修改elementUI的分页组件视图没更新问题
- javascript的call和apply的区别
- WebKit技术内幕朱永盛PDF电子版百度云网盘下载
- JAVASCRIPT语言精髓与编程实践.周爱民.扫描版PDF电子版百度云网盘下载
- 精彩绝伦的CSS[Eric A. Meyer]PDF电子版百度云网盘下载[25.8M]
- HTML5与CSS3基础教程(第8版)[Elizabeth Castro]PDF电子版百度云网盘下载[72M]