该功能主要用到了canvas画布实现,先说明本地测试会卡顿,但是部署到测式服务器或生产环境后,就很流畅了,这一点无须担心。下面贴一些关键代码,变量啥的我没删,项目完成半年多了,在此记录一下, 我的签名是白底黑字,可以修改canvas属性自定义,导出图片方法里注释掉的一堆代码,是使用百度的智能识别签名图片上的文字,不过测试后识别率很低,评估之后取消了此需求,没有删除(以防万一,二次开发提需求。。。)有的可以识别出来,不过不尽人意啊,如果你有次功能,需要在百度只能识别上面注册,第一个请求url,需要包含grant_type,client_id和client_secret,请求成功后返回一个token,第二个接口url拼接access_token等于返回的token,教程里都有
wxml <!-- 弹窗里放画布 --> <view wx:if='{{showSignature}}' class="drawContainer"> <view style="display:flex;justify-content: space-between"> <button style="margin-top:10rpx" type="default" bindtap="closeCanvas">关闭</button> <button style="margin-top:10rpx" type="default" bindtap="cleardraw">清空</button> <button style="margin-top:10rpx" type="default" bindtap="getimg">确定</button> </view> <canvas class="canvas" id="canvas" canvas-id="canvas" disable-scroll="true" bindtouchstart="canvasStart" bindtouchmove="canvasMove" bindtouchend="canvasEnd" touchcancel="canvasEnd" binderror="canvasIdErrorCallback"></canvas> </view> js onLoad: function (options) { context = wx.createCanvasContext('canvas'); context.beginPath() context.setFillStyle('white'); context.fillRect(0, 0, 800 , 457 ) context.setLineWidth(4); context.setLineCap('round'); context.setLineJoin('round'); }, //开始 canvasStart: function (event) { isButtonDown = true; arrz.push(0); arrx.push(event.changedTouches[0].x); arry.push(event.changedTouches[0].y); //context.moveTo(event.changedTouches[0].x, event.changedTouches[0].y); }, cleardraw: function () { //清除画布 arrx = []; arry = []; arrz = []; context.clearRect(0, 0, canvasw, canvash); context.draw(true); }, closeCanvas: function () { this.cleardraw(); this.setData({ showSignature : false }) }, //生成图片 setTimeout(function(){ wx.canvasToTempFilePath({ canvasId: 'canvas', success: function (res) { // var imgUrl = ""; // var tempFilePath = res.tempFilePath; // wx.getFileSystemManager().readFile({ // filePath:tempFilePath, // encoding:'base64', // success(res){ // imgUrl = res.data; // wx.request({ // url: '', // method:'post', // header:{ // "sessionKey": app.globalData.sessionKey // }, // success(res1){ // var token = res1.data.access_token; // wx.request({ // url: '', // method:'post', // dataType:'json', // header:{ // "sessionKey": app.globalData.sessionKey, // "Content-Type": 'application/x-www-form-urlencoded' // }, // data:{ // "image":imgUrl // }, // success(res2){ // console.log(res2) // } // }) // } // }) // } // }) that.setData({ drawImg:res.tempFilePath, showSignature:false }) } }) }) //过程 canvasMove: function (event) { if (isButtonDown) { arrz.push(1); arrx.push(event.changedTouches[0].x); arry.push(event.changedTouches[0].y); }; for (var i = 0; i < arrx.length; i++) { if (arrz[i] == 0) { context.moveTo(arrx[i], arry[i]) } else { context.lineTo(arrx[i], arry[i]) }; }; context.clearRect(0, 0, canvasw, canvash); // context.setStrokeStyle('#000000'); context.setFillStyle('white'); context.fillRect(0, 0, 800 , 457 ) context.setLineWidth(4); context.setLineCap('round'); context.setLineJoin('round'); context.stroke(); context.draw(false); }, canvasEnd: function (event) { isButtonDown = false; },