uni-item-manage/tm-vuetify/components/tm-signBoard/tm-signBoard.vue
2023-10-18 15:52:41 +08:00

191 lines
4.6 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>