实现uniapp小程序电子横屏签名板代码如下
<template> <view> <view> <view> <canvas canvas-id="canvas_sign" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend" disable-scroll="true"></canvas> </view> <view> <button @click="autographClick(1)">重置</button> <button @click="autographClick(2)">保存</button> <button @click="autographClick(3)">取消</button> </view> </view> </view> </template> <script> import {request_url} from "../../utils/url.js" export default { data() { return { request_url:request_url,canvasCtx: '', //绘图图像 points: [], //路径点集合 hasSign: false, isInit: false, } }, onLoad(query) { this.canvasCtx = uni.createCanvasContext('canvas_sign', this) //创建绘图对象 //设置画笔样式 this.canvasCtx.lineWidth = 6 // 设置线条的端点样式 this.canvasCtx.lineCap = 'round' // 设置线条的交点样式 this.canvasCtx.lineJoin = 'round' }, methods: { touchstart: function(e) { if (!this.isInit) { this.isInit = true this.autographClick(1); } let startX = e.changedTouches[0].x let startY = e.changedTouches[0].y let startPoint = { X: startX, Y: startY } this.points.push(startPoint) //每次触摸开始,开启新的路径 this.canvasCtx.beginPath() },touchmove: function(e) { let moveX = e.changedTouches[0].x let moveY = e.changedTouches[0].y let movePoint = { X: moveX, Y: moveY } this.points.push(movePoint) //存点 let len = this.points.length if (len >= 2) { this.draw() //绘制路径 } }, touchend: function() { this.points = [] this.canvasCtx.draw(true) }, draw: function() { let point1 = this.points[0] let point2 = this.points[1] this.points.shift() this.canvasCtx.moveTo(point1.X, point1.Y) this.canvasCtx.lineTo(point2.X, point2.Y) this.canvasCtx.stroke() this.canvasCtx.draw(true) this.hasSign = true }, clear() { //清空画布 this.hasSign = false let that=this; uni.getSystemInfo({ success: function(res) { let canvas = uni.createSelectorQuery().select('.form-content__canvas') canvas.boundingClientRect().exec(function(data) { console.log('canvas', data) console.log('canvas wh:' + data[0].width + 'X' + data[0].height) let canvasw = Math.ceil(data[0].width) let canvash = Math.ceil(data[0].height) that.canvasCtx.fillStyle = '#fff' that.canvasCtx.fillRect(0, 0, canvasw, canvash) that.canvasCtx.draw(true) }) } }) }, // 底部按钮点击操作 autographClick(type) { let that = this if (type === 1) { that.clear(); }else if (type === 3) { uni.navigateBack({ }) } else { if (!this.hasSign) { uni.showToast({ title: '签名不能为空', icon: 'none', duration: 2000 }) return } uni.getSystemInfo({ success: function(res) { let canvas = uni.createSelectorQuery().select('.form-content__canvas') canvas.boundingClientRect().exec(function(data) { console.log('canvas saveSign:', data[0].width + 'X' + data[0].height) let canvasw = Math.ceil(data[0].width) let canvash = Math.ceil(data[0].height) uni.canvasToTempFilePath({ destWidth: canvasw, destHeight: canvash, fileType: 'jpg', canvasId: 'canvas_sign', success: function(res) { console.log('图片导出成功:', res) let path = res.tempFilePath // 保存图片 if (type === 2) { that.uploadPic(path) } else if (type === 3) { // 预览图片 uni.previewImage({ urls: [path] }) } }, fail: (err) => { // http://tmp/2LVQyvzddk2R820a9009dff43323d8e7fc9ef7a8d076.jpg console.log('图片导出失败:', err) } }) }) } }) } }, // 图片上传处理 uploadPic(tempFile) { let t = this; uni.showLoading({ title: '正在上传中...' }) uni.uploadFile({ url:request_url+"uploadImg", filePath:tempFile, name:"upfile", success(res){ let data = JSON.parse(res.data) t.$store.commit("signature",data.path) t.clear(); console.log(t.$store.state.signature) uni.navigateBack({ }) }, fail(e){ console.log(e) }, complete(){ uni.hideLoading() } }); } } } </script> <style scoped> /* * 横屏后的适配方案 * @param $rpx为需要转换的字号 * @参考 https://blog.csdn.net/sdfsfsdscd/article/details/91375066 **/ @function tovmin($rpx) { @return #{$rpx * 100 / 750}vmin; } .page-content { width: 100vw; height: 100vh; .form { display: flex; flex-direction: column; width: 100%; height: 100%; .form-content { width: 100%; height: 100%; &__canvas { height: 100%; width: 100vw; } } .form-footer { padding-bottom: tovmin(20); //height: 100%; width: 100%; display: flex; flex-direction: row; background: #FFFFFF; box-shadow: 0 tovmin(4) tovmin(20) tovmin(2) rgba(183, 183, 183, 0.20); button { width: 20vw; height: tovmin(88); line-height: tovmin(88); border-radius: tovmin(48); text-align: center; font-size: tovmin(36); font-weight: bold; } button::after { border: none; } &__reset { color: #008AFE; border: tovmin(1) solid #008AFE; } &__save { background-image: linear-gradient(135deg, #1BC5FF 0%, #008AFE 100%); } &__preview { color: #008AFE; border: tovmin(1) solid #008AFE; } } } } </style>
横屏切换
到【pages.json】文件中添加横屏切换配置
{ "path": "pages/my/sign_page", "style": { "navigationBarTitleText": "签名", "pageOrientation": "landscape",//重点是这里切换横屏 "enablePullDownRefresh": false, "disableScroll": true } }
相关文章