小程序利用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) ?? ??? ??? ??? ?} ?? ?}) }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did124240