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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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