You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
4.6 KiB
Vue

1 year ago
<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>