canvas绘制签名

文章介绍了如何使用HTML5的canvasAPI和uni.createCanvasContext在网页和移动端实现动态签名绘制功能,包括配置canvas、处理鼠标和触摸事件、以及清空画布和保存签名图片等过程。
摘要由CSDN通过智能技术生成
  1. 先进行签名项配置
// 关于签名
    createCanvas() {
      // 获取canvas 实例
      var canvas = document.getElementById('mycanvas')
      // 设置宽高
      canvas.width = this.config.width
      canvas.height = this.config.height
      // 设置一个边框,方便咱们检查及运用
      canvas.style.border = '1px solid #ccc'
      // 创立上下文
      this.ctx = canvas.getContext('2d')
      // 设置填充背景色
      this.ctx.fillStyle = '#fff'
      // 制作填充矩形
      this.ctx.fillRect(
        0, // x 轴开端制作方位
        0, // y 轴开端制作方位
        this.config.width, // 宽度
        this.config.height // 高度
      );

    },
  1. 默认设置
 ctx: undefined,
      config: {
        width: 300, // 宽度
        height: 200, // 高度
        lineWidth: 5, // 线宽
        strokeStyle: '#000', // 线条色彩
        lineCap: 'round', // 设置线条两头圆角
        lineJoin: 'round' // 线条交汇处圆角
      },
      client: {
        offsetX: 0, // 偏移量
        offsetY: 0,
        endX: 0, // 坐标
        endY: 0
      },
  1. 页面dom
 <canvas id="mycanvas" @mousedown="mousedown"></canvas>
  1. 执行画图
mousedown(e) {
      // 初始化
      // 获取偏移量及坐标
      const { offsetX, offsetY, pageX, pageY } = e
      // 修正前次的偏移量及坐标
      this.client.offsetX = offsetX
      this.client.offsetY = offsetY
      this.client.endX = pageX
      this.client.endY = pageY
      // 铲除以上一次 beginPath 之后的一切途径,进行制作
      this.ctx.beginPath()
      // 依据装备文件设置进行相应装备
      this.ctx.lineWidth = this.config.lineWidth
      this.ctx.strokeStyle = this.config.strokeStyle
      this.ctx.lineCap = this.config.lineCap
      this.ctx.lineJoin = this.config.lineJoin
      // 设置画线开端点位
      this.ctx.moveTo(this.client.offsetX, this.client.offsetY)
      this.ctx.stroke()
      window.addEventListener("mousemove", this.mousemove)
    },
    mousemove(e) {
      // 获取当时坐标点位
      const { offsetX, offsetY } = e
      // 修正最终一次制作的坐标点
      // this.client.endX = offsetX
      // this.client.endY = offsetY
      // 依据坐标点位移动增加线条
      let h = document.getElementById('mycanvas').getBoundingClientRect().top
      let w = document.getElementById('mycanvas').getBoundingClientRect().left
      this.ctx.lineTo(e.clientX - w, e.clientY - h)
      console.log(offsetX, offsetY);
      // 制作
      this.ctx.stroke()
      window.addEventListener("mouseup", this.mouseup)
    },
    mouseup() {
      this.ctx.closePath()
      // 移除鼠标移动或手势移动监听器
      window.removeEventListener("mousemove", this.mousemove)
    },
    clearcanvas() {
      // 清空画布
      this.ctx.clearRect(0, 0, this.config.width, this.config.height)
      // 清空签名url
      this.sendbackForm.signUrl = undefined
    },
  1. 补充说明
如果是手机签名
          <canvas
            class="mycanvas"
            canvas-id="mycanvas"
            @touchstart="touchstart"
            @touchmove="touchmove"
            @touchend="touchend"
          ></canvas>

  // 关于签名
    createCanvas() {
      this.ctx = uni.createCanvasContext("mycanvas", this); //创建绘图对象
      //设置画笔样式
      this.ctx.lineWidth = 4;
      this.ctx.strokeStyle = "#3366FF";
      this.ctx.lineCap = "round";
      this.ctx.lineJoin = "round";
    },

    touchstart(e) {
      // 触摸开始,获取焦点
      let startX = e.changedTouches[0].x;
      let startY = e.changedTouches[0].y;
      let startPoint = {
        X: startX,
        Y: startY,
      };
      this.points.push(startPoint);
      //每次触摸开始,开启新的路径
      this.ctx.beginPath();
    },
    touchmove(e) {
      // 触摸移动
      let moveX = e.changedTouches[0].x;
      let moveY = e.changedTouches[0].y;
      let movePoint = {
        X: moveX,
        Y: moveY,
      };
      this.points.push(movePoint); //存点
      let len = this.points.length;
      if (len >= 2) {
        this.draw(); //绘制路径
      }
    },

    touchend() {
      // 触摸结束,将未绘制的点清空防止对后续路径产生干扰
      this.points = [];
    },
    draw() {
      //绘制笔迹
      let point1 = this.points[0];
      let point2 = this.points[1];
      this.points.shift();
      this.ctx.moveTo(point1.X, point1.Y);
      this.ctx.lineTo(point2.X, point2.Y);
      this.ctx.stroke();
      this.ctx.draw(true);
      this.hasSign = true;
    },
    clear() {
      //清空画布
      this.hasSign = false;
      let _this = this;
      uni.getSystemInfo({
        success: function (res) {
          let canvasw = res.windowWidth;
          let canvash = res.windowHeight;
          _this.ctx.clearRect(0, 0, canvasw, canvash);
          _this.ctx.draw(true);
        },
      });
    },

    finish() {
      //完成绘画并保存到本地
      if (!this.hasSign) {
        uni.showToast({
          title: "签名为空不能保存",
          icon: "none",
          duration: 2000,
        });
        return;
      }
      let _this = this;
      uni.canvasToTempFilePath({
        canvasId: "mycanvas",
        fileType: "png",
        success: function (res) {
          const header = uni.getStorageSync("token");
          let a = uni.uploadFile({
            url: baseCfg.baseURL + "/management/comm/file/upload", //上传图片接口
            filePath: res.tempFilePath,
            name: "attachments",
            header: {
              Authorization: `Bearer ${header}`,
            },
            success: (res) => {
              const json = JSON.parse(res.data);
              json.data.forEach((item) => {
                formValue.value.commonInfo.diagramAuthorSign = item.id;
              });
              _this.showSign = false;
            },
          });
        },     
      });
    },

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
canvas电子签名是一种在移动端使用canvas元素实现的电子签名功能。通过手指或触控笔在画布上绘制,可以模拟真实的签名效果。具体实现的代码可以参考使用jQuery库实现移动端笔触canvas电子签名的示例代码。 实现canvas电子签名的步骤如下: 1. 创建一个canvas元素作为签名区域。 2. 监听用户的触摸事件或鼠标事件,根据事件的坐标在canvas绘制路径。 3. 根据绘制的路径设置线条的样式,例如颜色、粗细等。 4. 将绘制的路径保存为图片,并上传到服务器或本地存储中。 5. 在需要显示签名的地方,使用<img>标签将保存的图片显示出来。 6. 可以根据需求对签名进行进一步处理,例如旋转、缩放等操作。 需要注意的是,实现电子签名时需要处理不同设备和浏览器的兼容性,并进行合适的调整。另外,还要考虑用户的操作体验,例如支持撤销、清除、保存等功能。 通过canvas电子签名的方式,可以实现在移动端或网页上方便地进行签名操作,适用于各种签署协议、合同等场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [jQuery实现移动端笔触canvas电子签名](https://download.csdn.net/download/weixin_38694023/13130546)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [canvas实现电子签字功能](https://blog.csdn.net/web220507/article/details/128504946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

库库的写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值