初始化

This commit is contained in:
2025-08-01 10:44:32 +08:00
commit cbb8dc2ba6
1083 changed files with 178320 additions and 0 deletions

View File

@@ -0,0 +1,188 @@
<template>
<view class="canvas-main">
<canvas :style="'width:'+width+'rpx;height:'+height+'rpx;'" class="canvas-item" disable-scroll="true"
canvas-id="canvasId" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"
@error="error"></canvas>
<view class="btn-list">
<view class="btn-reset" @click.stop="reset">重置</view>
<!-- <view class="btn-reset" @click.stop="rotateScreen">
横向
</view> -->
<view class="btn-complete" @click.stop="save">完成</view>
</view>
</view>
</template>
<script>
export default {
props: {
//签名板宽度(rpx)
width: {
type: Number,
default: 750
},
//签名板高度(rpx)
height: {
type: Number,
default: 500
},
//签名板背景色
bgColor: {
type: String,
default: '#000000'
},
//画笔大小(rpx)
lineWidth: {
type: Number,
default: 6
},
//画笔颜色
lineColor: {
type: String,
default: '#FFFFFF'
},
//生成的图片格式(jpg或png)
fileType: {
type: String,
default: 'png'
},
},
data() {
return {
windowWidth: 0,
pixelRatio: 0,
context: null,
points: [],
oldPoints: []
}
},
mounted() {
this.$nextTick(() => {
this.start()
})
},
methods: {
rotateScreen(){
this.$emit('heng')
},
start() {
const systemInfo = uni.getSystemInfoSync()
this.windowWidth = systemInfo.windowWidth
this.pixelRatio = systemInfo.pixelRatio
this.context = uni.createCanvasContext('canvasId', this)
this.context.fillStyle = this.bgColor
const width = this.width / 750 * this.windowWidth
const height = this.height / 750 * this.windowWidth
const lineWidth = this.lineWidth / 750 * this.windowWidth
this.context.fillRect(0, 0, width, height)
this.context.lineWidth = lineWidth
this.context.strokeStyle = this.lineColor
this.context.lineCap = 'round'
this.context.lineJoin = 'round'
this.context.stroke()
this.context.draw(true)
},
touchstart(e) {
this.points.push({
x: e.changedTouches[0].x,
y: e.changedTouches[0].y
})
this.context.beginPath()
},
touchmove(e) {
this.points.push({
x: e.changedTouches[0].x,
y: e.changedTouches[0].y
})
this.oldPoints = JSON.parse(JSON.stringify(this.points))
if (this.points.length > 1) {
this.context.moveTo(this.points[0].x, this.points[0].y)
this.context.lineTo(this.points[1].x, this.points[1].y)
this.points.splice(0, 1)
this.context.stroke()
this.context.draw(true)
}
},
touchend(e) {
this.points = []
},
reset() {
this.context = null
this.points = []
this.oldPoints = []
this.start()
},
save() {
if (this.oldPoints.length == 0) {
uni.showToast({
title: '请进行签名!',
icon: 'none'
})
return
}
let self = this
uni.canvasToTempFilePath({
canvasId: 'canvasId',
fileType: self.fileType,
quality: 1,
width: self.width,
height: self.height,
destWidth: self.width * self.pixelRatio,
destHeight: self.height * self.pixelRatio,
success: (res) => {
self.$emit('change', res.tempFilePath)
},
fail: (err) => {
console.log('生成图片失败:', err)
}
}, self)
},
error(e) {
console.log('错误信息:', e)
}
}
}
</script>
</script>
<style lang="scss" scoped>
.canvas-main {
width: 100%;
height: auto;
.btn-list {
width: 100%;
height: 102rpx;
background: #FEFFFE;
box-shadow: 0rpx 0rpx 4rpx 0rpx rgba(0, 0, 0, 0.1);
display: flex;
align-items: center;
justify-content: space-around;
view{
// flex: 1;
}
.btn-reset {
width: 320rpx;
height: 72rpx;
background: #FFFFFF;
border-radius: 40rpx;
border: 2rpx solid #E6E6E6;
font-size: 30rpx;
color: #3E3E3E;
display: flex;
align-items: center;
justify-content: center;
}
.btn-complete {
width: 320rpx;
height: 76rpx;
border-radius: 40rpx;
font-size: 30rpx;
color: #FFFFFF;
background-color: #FD430E;
display: flex;
align-items: center;
justify-content: center;
}
}
}
</style>