小程序 实现手写签名功能

小程序利用canvas实现手写签名

示例

设置小程序横屏

在page.json或对应页面 .json文件中设置
landscape代表固定横屏

"pageOrientation":"landscape"
手写签名

创建canvas画布 设置监听触摸开始 移动 结束等时间

此处为uniapp示例 原生小程序的也可参考进行修改(只需将@touchmove等事件换为bindtouchmove等微信事件即可)

<view class='contents'>
		<canvas class='firstCanvas' canvas-id="firstCanvas" @touchmove='move' @touchstart='start($event)'
			@touchend='end' @touchcancel='cancel' @longtap='tap' disable-scroll='true' @error='error'>
		</canvas>
		<view class="btnBox">
			<view class="btn1" @tap='clearClick'>重签</view>
			<view class="btn2" @tap="overSign">完成签名</view>
		</view>
	</view>
	page {
		background-color: #f2f2f2;
	}

	canvas {
		background-color: #fff;
		width: calc(100% - 20px);
		height: calc(100% - 70px);
		margin: 10px;
		position: absolute;
	}

	.btnBox {
		display: flex;
		height: 50px;
		width: 100%;
		position: fixed;
		left: 0;
		bottom: 0;
	}

	.btnBox view {
		width: 50%;
		text-align: center;
		height: 50px;
		line-height: 50px;
		color: #FFFFFF;
	}

	.btnBox view:active {
		background-color: #CCCCCC;
		color: #333333;
	}

	.btn1{
		background-color: #FF8F58;
	}

	.btn2{
		background-color: #0599D7;
	}

重点js

var content = null;
var touchs = [];
var canvasw = 0;
var canvash = 0;
var _that;
export default {
	data() {
		return {
			isEnd: false, // 是否签名
			srcA: ''
		}
	},

	methods: {
		overSign: function() {
			if (this.isEnd) {
				let that = this
				uni.canvasToTempFilePath({
					canvasId: 'firstCanvas',
					fileType: 'png',
					success: function(res) {
						//打印图片路径
						console.log(res.tempFilePath)
						console.log('完成签名')
						// 可以再次进行直接保存图片到本地,这个保存就不写了可参考之前的canvas图片保存到本地
						// 一般签名都是要返回前一页进行提交,所以在此将图片写到微信内部文件(不会出现在手机相册中)返回上一页获取,在上一页提交后在将图片删除
						let fsm = uni.getFileSystemManager();
						fsm.readFile({
							filePath: res.tempFilePath,
							success: function(res) {
								//转换成功
								var arrayBuffer = res.data
								fsm.writeFile({
									filePath: `${wx.env.USER_DATA_PATH}/autograph.png`,
									data: arrayBuffer,
									encoding: 'binary',
									success() {
										console.log('写入成功')
										uni.navigateBack()
									},
									fail(err) {
										console.log(err)
									},
								});
							},
							fail: function(e) {}
						})
					}
				})
			} else {
				uni.showToast({
					title: '请先完成签名',
					icon: "none",
					duration: 1500,
					mask: true
				})
			}

		},
		// 画布的触摸移动开始手势响应
		start: function(event) {
			// console.log(event)
			// console.log("触摸开始" + event.changedTouches[0].x)
			// console.log("触摸开始" + event.changedTouches[0].y)
			//获取触摸开始的 x,y
			let point = {
				x: event.changedTouches[0].x,
				y: event.changedTouches[0].y
			}
			// console.log(point)
			touchs.push(point);

		},
		// 画布的触摸移动手势响应
		move: function(e) {
			let point = {
				x: e.touches[0].x,
				y: e.touches[0].y
			}
			// console.log(point)
			touchs.push(point)
			if (touchs.length >= 2) {
				this.draw(touchs)
			}
		},
		// 画布的触摸移动结束手势响应
		end: function(e) {
			// console.log("触摸结束" + e)
			// 设置为已经签名
			this.isEnd = true
			// 清空轨迹数组
			for (let i = 0; i < touchs.length; i++) {
				touchs.pop()
			}

		},
		// 画布的触摸取消响应
		cancel: function(e) {
			console.log("触摸取消" + e)
		},
		// 画布的长按手势响应
		tap: function(e) {
			console.log("长按手势" + e)
		},
		error: function(e) {
			console.log("画布触摸错误" + e)
		},
		//绘制
		draw: function(touchs) {
			// console.log(touchs[0], touchs[1])
			let point1 = touchs[0]
			let point2 = touchs[1]
			touchs.shift()
			content.moveTo(point1.x, point1.y)
			content.lineTo(point2.x, point2.y)
			content.stroke()
			content.draw(true)
		},
		//清除操作
		clearClick: function() {
			// 设置为未签名
			this.isEnd = false
			//清除画布
			content.clearRect(0, 0, canvasw, canvash)
			content.draw(true)
		},
	},
	/*生命周期函数--监听页面加载 */
	onLoad: function(options) {
		_that = this
		let dev = uni.getSystemInfoSync()
		console.log(dev)
		// 获取横屏的宽高 设置画布的大小
		// screenWidth windowHeight
		canvasw = dev.screenWidth - 20
		canvash = dev.screenHeight - 70
		//获得Canvas的上下文
		content = wx.createCanvasContext('firstCanvas')
		//设置线的颜色
		content.setStrokeStyle("#000")
		//设置线的宽度
		content.setLineWidth(5)
		//设置线两端端点样式更加圆润
		content.setLineCap('round')
		//设置两条线连接处更加圆润
		content.setLineJoin('round')
		content.setFillStyle('white'); //填充白色

		content.fillRect(0, 0, canvasw, canvash); //画出矩形白色背景

		content.restore()
		content.save()
	},
}

上一页可在onshow中获取签名的图片 (若签名没有writeFile则可不理会下方的)

	// 获取本地保存的图片
	getImg() {
		var timestamp = new Date().getTime();
		uni.getImageInfo({
			src: `${wx.env.USER_DATA_PATH}/autograph.png`,
			success: function(res) {
				console.log(res.path)
				_that.srcA = res.path
				hasQM = true
			},
			fail: function(err) {
				console.log(err)
				_that.srcA = ''
			},
		})
	},
	//删除缓存的图片
	delPic() {
			let fsm = uni.getFileSystemManager();
			fsm.unlink({
				filePath: `${wx.env.USER_DATA_PATH}/autograph.png`,
				success(res) {
					console.log(res)
					_that.srcA = ''
					hasQM = false
				},
				fail(res) {
					console.error(res)
				}
			})
	}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于vue实现签名手写签名功能,可以使用HTML5的canvas标签实现。具体可以参考以下步骤: 1. 在vue组件中引入canvas标签,并设置该标签的宽高和边框等样式。如下: ``` <canvas id="canvas" width="400" height="200" style="border:1px solid #000000;"></canvas> ``` 2. 在vue组件的mounted生命周期中获取canvas对象,并设置canvas的绘制样式。如下: ``` mounted() { this.canvas = document.getElementById('canvas'); this.ctx = this.canvas.getContext('2d'); this.ctx.lineWidth = 2; // 设置笔画宽度 this.ctx.strokeStyle = '#000000'; // 设置笔画颜色 } ``` 3. 在提供签名功能的按钮事件中,绑定canvas的鼠标事件。如下: ``` <button @click="startDrawing">签名</button> ``` startDrawing方法中绑定事件: ``` startDrawing() { this.drawing = true; this.canvas.addEventListener('mousedown', this.onMouseDown); this.canvas.addEventListener('mouseup', this.onMouseUp); this.canvas.addEventListener('mousemove', this.onMouseMove); } ``` 4. 监听canvas的鼠标事件,实现手写签名。如下: ``` onMouseDown(e) { this.ctx.beginPath(); this.ctx.moveTo(e.offsetX, e.offsetY); this.mouseMoved = false; } onMouseMove(e) { if (this.drawing) { this.mouseMoved = true; this.ctx.lineTo(e.offsetX, e.offsetY); this.ctx.stroke(); } } onMouseUp(e) { if (!this.mouseMoved) { this.ctx.fillRect(e.offsetX - 1, e.offsetY - 1, 2, 2); } this.drawing = false; this.canvas.removeEventListener('mousedown', this.onMouseDown); this.canvas.removeEventListener('mouseup', this.onMouseUp); this.canvas.removeEventListener('mousemove', this.onMouseMove); } ``` 以上就是通过canvas实现vue签名手写签名功能的具体步骤。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值