vue 移动端签字_vue移动端使用canvas签名的实现

效果JDV免费资源网

JDV免费资源网

canvas画板移动端 .gifJDV免费资源网

需求JDV免费资源网

在一些项目业务中,经常会使用到画板,让用户自己去写/画一些东西做标示,比如说在线签电子合约、签名等,如果不用插件,那么如何使用h5的canvas画布来实现这一需求呢? 【本篇只讨论移动端,PC端请看上篇】JDV免费资源网

分析JDV免费资源网

很明显,我们需要一个canvas,关于canvas的一些基本操作可以在w3school或者别的一些平台上熟悉一下,其实本例也是基础操作。本案例在vue中完成。(脱离vue也一样。)JDV免费资源网首先,需要一个canvas画布 其次,考虑逻辑 把逻辑实现

1. canvas画布JDV免费资源网

随意布局的一个画布,此处值得注意的是如果canvas的宽高确定,则在html>canvas中直接写宽高,如果不确定,根据别的元素变化,那么可以在js中初始化画布时写。JDV免费资源网

htmlJDV免费资源网

布局JDV免费资源网

.boardBox{

margin: 30px auto;

width: 90vw;

height: 25vh;

background: #f9f9f9;

canvas{

border: 1px solid #b3b3b3;

}

}

画布初始化JDV免费资源网

let board = this.$refs.board; // 获取DOM

board.width = this.$refs.boardBox.offsetWidth; // 设置画布宽

board.height = this.$refs.boardBox.offsetHeight; // 设置画布高

this.ctx = board.getContext('2d'); // 二维绘图

this.ctx.strokeStyle = '#000'; // 颜色

this.ctx.lineWidth = 3; // 线条宽度

2. 逻辑分析JDV免费资源网

由于本篇只讨论移动端端,因此无非是在画布上监听三个触摸事件:touchstart、touchmove、touchend。JDV免费资源网

那么,在这三个事件中,分别需要做什么呢?JDV免费资源网

touchstartJDV免费资源网

开始滑动按下,需要做:JDV免费资源网 获取触摸点做画布上的位置 存为一个点坐标(起始点) 以起始点建立一个路径 开启画布操作

touchmoveJDV免费资源网

触摸滑动时,又要做那些准备呢?JDV免费资源网 判断是否开启画布操作,如果没开启就禁止绘制,因此先判断是否当前状态可绘制 获取触摸点做画布上的位置 上一个点到这一个点作连线 绘制出来 当前点存储,下一次用

touchendJDV免费资源网

滑动结束,事件结束:JDV免费资源网 closePath() // 停止绘制 关闭画布操作的开关

好了,其实就是这三个事件,理清楚之后去代码实现就简单得多了。附上代码一份。JDV免费资源网

3. 代码JDV免费资源网

CSS略,如初始化即可,不是重点。JDV免费资源网

@touchstart="mStart"

@touchmove="mMove"

@touchend="mEnd">

data() {

return {

ctx: null,

point: {

x: 0,

y: 0

},

moving: false // 是否正在绘制中且移动

};

},

mounted() {

let board = this.$refs.board; // 获取DOM

board.width = this.$refs.boardBox.offsetWidth; // 设置画布宽

board.height = this.$refs.boardBox.offsetHeight; // 设置画布高

this.ctx = board.getContext('2d'); // 二维绘图

this.ctx.strokeStyle = '#000'; // 颜色

this.ctx.lineWidth = 3; // 线条宽度

},

methods: {

// 触摸(开始)

mStart (e) {

console.log(e);

let x = e.touches[0].clientX - e.target.offsetLeft,

y = e.touches[0].clientY - e.target.offsetTop; // 获取触摸点在画板(canvas)的坐标

this.point.x = x;

this.point.y = y;

this.ctx.beginPath();

this.moving = true;

},

// 滑动中...

mMove (e) {

if(this.moving) {

let x = e.touches[0].clientX - e.target.offsetLeft,

y = e.touches[0].clientY - e.target.offsetTop; // 获取触摸点在画板(canvas)的坐标

this.ctx.moveTo(this.point.x, this.point.y); // 把路径移动到画布中的指定点,不创建线条(起始点)

this.ctx.lineTo(x, y); // 添加一个新点,然后创建从该点到画布中最后指定点的线条,不创建线条

this.ctx.stroke(); // 绘制

this.point.x = x, this.point.y = y; // 重置点坐标为上一个坐标

}

},

// 滑动结束

mEnd () {

if(this.moving) {

this.ctx.closePath(); // 停止绘制

this.moving = false; // 关闭绘制开关

}

},

},

思考JDV免费资源网

上一篇,在PC端完成绘制,本篇如法炮制,在移动端也顺利完成,相比pc端只是稍微的修改了一下获取坐标点的算法而已。那么PC端和移动端如何并存呢? 出错了,怎么重新绘制呢? 绘制完成后,怎么保存呢?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。JDV免费资源网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue移动端实现横屏手写签名功能,可以使用HTML5的canvas元素和JavaScript来实现。首先,你需要创建一个canvas元素,并设置其宽高比,以便在横屏模式下正确显示。然后,你需要监听设备方向变化事件,根据设备方向动态调整canvas元素的宽高比,以便在横屏模式下正确显示。最后,你需要监听用户手写事件,并在canvas元素上绘制用户手写的签名。 以下是示例代码,可以在移动设备上测试: ```html <template> <div class="canvas-container"> <canvas ref="canvas"></canvas> </div> </template> <script> export default { mounted() { // 监听设备方向变化事件 window.addEventListener("orientationchange", this.onOrientationChange); // 初始化canvas this.initCanvas(); }, methods: { initCanvas() { const canvas = this.$refs.canvas; const ctx = canvas.getContext("2d"); // 设置canvas宽高比为3:2 canvas.width = 300; canvas.height = 200; // 监听用户手写事件 canvas.addEventListener("touchstart", this.onTouchStart); canvas.addEventListener("touchmove", this.onTouchMove); canvas.addEventListener("touchend", this.onTouchEnd); }, onOrientationChange() { const canvas = this.$refs.canvas; const ctx = canvas.getContext("2d"); // 根据设备方向动态调整canvas宽高比 if (window.orientation === 90 || window.orientation === -90) { canvas.width = 200; canvas.height = 300; } else { canvas.width = 300; canvas.height = 200; } // 清空canvas ctx.clearRect(0, 0, canvas.width, canvas.height); }, onTouchStart(event) { const canvas = this.$refs.canvas; const ctx = canvas.getContext("2d"); // 开始绘制路径 ctx.beginPath(); // 获取触点位置 const touch = event.touches[0]; const x = touch.pageX - canvas.offsetLeft; const y = touch.pageY - canvas.offsetTop; // 移动到触点位置 ctx.moveTo(x, y); }, onTouchMove(event) { const canvas = this.$refs.canvas; const ctx = canvas.getContext("2d"); // 获取触点位置 const touch = event.touches[0]; const x = touch.pageX - canvas.offsetLeft; const y = touch.pageY - canvas.offsetTop; // 绘制直线到触点位置 ctx.lineTo(x, y); ctx.stroke(); }, onTouchEnd() { const canvas = this.$refs.canvas; const ctx = canvas.getContext("2d"); // 结束路径绘制 ctx.closePath(); } }, beforeDestroy() { // 移除事件监听 window.removeEventListener("orientationchange", this.onOrientationChange); const canvas = this.$refs.canvas; canvas.removeEventListener("touchstart", this.onTouchStart); canvas.removeEventListener("touchmove", this.onTouchMove); canvas.removeEventListener("touchend", this.onTouchEnd); } }; </script> <style scoped> .canvas-container { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; } canvas { border: 1px solid #ccc; } </style> ``` 在上面的示例中,我们创建了一个canvas元素,并设置了其宽高比为3:2,以便在竖屏模式下正确显示。我们还监听了设备方向变化事件,根据设备方向动态调整canvas元素的宽高比。我们还监听了用户手写事件,并在canvas元素上绘制用户手写的签名。当用户完成签名后,可以将canvas元素上的图像数据保存到服务器或本地存储中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值