Vue H5手写签名板开发

1,287 阅读1分钟

1. 视图实现

首先我们使用canvas标签来实现视图,并且我们主要为canvas 来绑定三个事件 分别是 touchstart(触摸开始)touchmove(触摸过程),touchend(触摸结束)。 并且在mounted 进行一个初始化。下面是代码实现 预览地址

<template>
  <div class="sign-wrap">
    <div class="boardBox" ref="boardBox" @touchmove.prevent>
      <canvas
        ref="canvas"
        :width="cWidth"
        :height="cHeight"
        id="canvas"
        @touchstart="mStart"
        @touchmove="mMove"
        @touchend="mEnd"
      ></canvas>
    </div>
    <div class="footer-bar">
      <div class="reset" @click="clearcanvas">重写</div>
      <div class="use" @click="getcanvas">使用</div>
    </div>
  </div>
</template>
export default {
  name: "Sign",
  components: {},
  data() {
    return {
      cWidth: 1000,		// 我们给一个远超屏幕大小尺寸的宽度
      cHeight: 1000,		// 同样给一个远超屏幕大小尺寸的高度
      ctx: null,
      point: {
        x: 0,
        y: 0,
      },
    };
  },
  mounted() {
    this.ctx = this.$refs.canvas.getContext("2d"); // 二维绘图对象
    this.ctx.strokeStyle = "#000"; // 初始化前面颜色颜色
  },
 }

2.完善对应的功能

mStart方法中 我们记录初始位置即 X,y坐标 。同时开始绘制。 在mMove方法中我们要去记录此刻的一个坐标位置 。并且指定开始坐标,然后进行绘制自定义路线 。滑动结束我们触发ctx对象的停止绘制方法 closePath()代码如下:

 methods: {
    // 触摸(开始)
    mStart(e) {
      console.log(e)
      let x = e.touches[0].clientX ,
        y = e.touches[0].clientY ; // 获取触摸点在画板(canvas)的坐标
      this.point.x = x;
      this.point.y = y;
      this.ctx.beginPath();       // 开始绘制
      this.ctx.lineWidth = 7; // 设置线条宽度
      this.moving = true;
    },
    // 滑动中...
    mMove(e) {
      if (this.moving) {   // 确保mStart触发
        let x = e.touches[0].clientX,
          y = e.touches[0].clientY; // 获取触摸点在画板(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; // 关闭绘制开关
      }
    },
   }

到这里我们的 canvas 功能已经基本完成了。后续可以进行一些新的优化。以及功能叠加

3.追加清除canvas功能

//清除画布
    clearcanvas() {
      
      this.ctx.setTransform(1, 0, 0, 1, 0, 0);    // 重置矩阵
      this.ctx.clearRect(0, 0, 1000, 1000);     //给定的矩形内清除指定的像素
      
    },

4. 获取签名内容

使用canvastoDataURL()方法获取图片数据 这里采用的是base64传给后端。也可以转换成Blob来传,但在获取内容之前 ,我们需要判断内容是否存在,确保用户已经签名了,而不是空内容


	// 判断画布内容是否为空
    isCanvasEmpty(canvas) {
      var blank = document.createElement("canvas"); //系统获取一个空canvas对象
      blank.width = canvas.width;
      blank.height = canvas.height;
      return canvas.toDataURL() == blank.toDataURL(); //比较值相等则为空
    },


//获取绘画图片
    getcanvas() {
      //绘画转图片
     
      let canvas = document.getElementById("canvas");
      if (this.isCanvasEmpty(canvas)) {
        // alert("请绘制签名后再上传!");
        this.$Message.notify({
          content: "请绘制签名后再上传!",
          type: "error",
          //time: 5500
        });
        return;
      }
    //   this.convertCanvasToImage();
    // console.log(this.$refs..toDataURL("image/png"))
    // 获取图片数据
    this.basedata = this.$refs.canvas.toDataURL("image/png")
    this.updataImg()		// 上传图片给后端
    }
  1. 后续优化加入 签名成功失败提醒功能 这里就不细说了 主要是通过Vue.extend() 去创建了一个Vue实例,并且通过Vue.use()来注册使用。欢迎阅读。预览地址 代码仓库