<template> <view class="tm-signBoard" > <!-- @touchmove.stop.prevent="stopEvent" --> <!-- #ifdef H5 || APP-VUE || APP-PLUS --> <canvas :style="{ width: ctx_w + 'px', height: ctx_h + 'px' }" :disable-scroll="true" @touchstart="touchstart" @touchmove.stop.prevent="touchsmove" @touchend="touchsend" @mousedown="touchstart" @mousemove.stop.prevent="touchsmove" @mouseup="touchsend" :canvas-id="uid" :id="uid" ></canvas> <!-- #endif --> <!-- #ifdef MP --> <canvas :style="{ width: ctx_w + 'px', height: ctx_h + 'px' }" :disable-scroll="true" @touchstart="touchstart" @touchmove="touchsmove" @touchend="touchsend" @mousedown="touchstart" @mousemove.stop.prevent="touchsmove" @mouseup="touchsend" canvas-id="tm-signBoard-id" id="tm-signBoard-id" ></canvas> <!-- #endif --> </view> </template> <script> /** * 手写签名板 * @description 手写签名板,笔峰效果,通过ref执行clear和save功能。 * @property {Number} line-width = [] 默认:6,线宽度。 * @property {String} line-color = [] 默认:'#000000',线颜色 * @property {Number} width = [] 默认:0, 画布宽,默认使用父组件的宽高。单位upx * @property {Number} height = [] 默认:400, 画布高,单位upx * @example <tm-signBoard></tm-signBoard> */ export default { name: 'tm-signBoard', props: { lineWidth: { type: Number, default: 6 }, lineColor: { type: String, default: '#000000' }, // 默认使用父组件的宽高。单位upx width: { type: Number, default: 0 }, // 单位upx height: { type: Number, default: 400 } }, data() { return { ctx: null, uid:"f", ctx_w: 0, ctx_h: 0 }; }, created() { // #ifdef H5 || APP-VUE || APP-PLUS this.uid = this.$tm.guid(); // #endif }, async mounted() { let qins = await this.$Querey('.tm-signBoard',this,50).catch(e => {}); this.ctx_w = uni.upx2px(this.width) || qins[0].width; this.ctx_h = uni.upx2px(this.height) || qins[0].height; this.$nextTick(function() { // #ifdef H5 || APP-VUE || APP-PLUS this.ctx = uni.createCanvasContext(this.uid, this); // #endif // #ifdef MP this.ctx = uni.createCanvasContext('tm-signBoard-id', this); // #endif this.handwriting = new uni.$tm.HandwritingSelf(this.ctx,this.ctx_w,this.ctx_h,this.lineWidth,this.lineColor) }); }, methods: { touchstart(event) { event.preventDefault() event.stopPropagation() if (event.type.indexOf('mouse')==-1&&event.changedTouches.length==1) { var touch = event.changedTouches[0]; this.handwriting.down(touch.x,touch.y); }else{ this.handwriting.down(event.pageX-event.currentTarget.offsetLeft,event.pageY-event.currentTarget.offsetTop); } }, touchsmove(event) { event.preventDefault() event.stopPropagation() if (event.type.indexOf('mouse')==-1&&event.changedTouches.length == 1) { var touch = event.changedTouches[0]; this.handwriting.move(touch.x,touch.y); }else{ this.handwriting.move(event.pageX-event.currentTarget.offsetLeft,event.pageY-event.currentTarget.offsetTop); } }, touchsend(event) { event.preventDefault() event.stopPropagation() if (event.type.indexOf('mouse')==-1&&event.changedTouches.length == 1) { var touch = event.changedTouches[0]; this.handwriting.up(touch.x,touch.y); }else{ this.handwriting.up(event.pageX-event.currentTarget.offsetLeft,event.pageY-event.currentTarget.offsetTop); } }, clear() { if (!this.ctx) return; this.ctx.clearRect(0, 0, this.ctx_w, this.ctx_h); this.ctx.draw(false); this.$nextTick(function() { // #ifdef H5 this.ctx = uni.createCanvasContext(this.uid, this); // #endif // #ifndef H5 this.ctx = uni.createCanvasContext('tm-signBoard-id', this); // #endif this.handwriting = new uni.$tm.HandwritingSelf(this.ctx,this.ctx_w,this.ctx_h,this.lineWidth,this.lineColor) }); }, save() { let t = this; return new Promise((su, fa) => { if (!this.ctx) { fa('ctx未初始化'); return; } let uid =this.uid; // #ifndef H5 uid='tm-signBoard-id' // #endif uni.canvasToTempFilePath( { x: 0, y: 0, width: t.ctx_w, height: t.ctx_h, canvasId: uid, success: function(res) { // 在H5平台下,tempFilePath 为 base64 su(res.tempFilePath); }, fail: res => { fa(res); } }, ); }); }, stopEvent(event) { event.preventDefault() event.stopPropagation() } } }; </script> <style lang="scss"></style>