canvas实现电子签名并且实时回显

canvas实现电子签名并且实时回显
效果:
在这里插入图片描述

<template>
  <div>
    canvas
    <canvas
     ref="canvasF"
      @mousedown="mouseDown"
      @mousemove="mouseMove"
      @mouseup="mouseUp"
      @touchStart="touchStart"
      @touchMove="touchMove"
      @touchEnd="touchEnd"
 ></canvas>

 <div v-if="canvasData">
    <img :src="canvasData" alt="">
 </div>

 <div @click="overwrite">清除重写</div>
  </div>
</template>

<script>
  export default{

    data() {
      return {
        stageInfo:'',
        imgUrl:'',
        client: {},
        points: [],
        canvasTxt: null,
        startX: 0,
        startY: 0,
        moveY: 0,
        moveX: 0,
        endY: 0,
        endX: 0,
        w: null,
        h: null,
        isDown: false,
        canvaBom:null,
        canvasData:''
      }
    },

    mounted() {
      let _this = this
      let canvas = this.$refs.canvasF
    //   测试回显用
      this.canvaBom = this.$refs.canvasF
      canvas.height = 300
      canvas.width = 400
      _this.canvasTxt = canvas.getContext('2d')//canvas的初始化
      _this.stageInfo = canvas.getBoundingClientRect() //getBoundingClientRect()可以不用考虑兼容性
    },

    methods: {
    //mobile端
    touchStart(ev) {
        ev = ev || event
        ev.preventDefault()
        if (ev.touches.length == 1) {
        let obj = {
        x: ev.targetTouches[0].clienX,
        y: ev.targetTouches[0].clientY,
        }
        this.startX = obj.x
        this.startY = obj.y
        this.canvasTxt.beginPath()
        this.canvasTxt.moveTo(this.startX, this.startY)
        this.canvasTxt.lineTo(obj.x, obj.y)
        this.canvasTxt.stroke()
        this.canvasTxt.closePath()
        this.points.push(obj)
        }
    },
    touchMove(ev) {
        ev = ev || event
        ev.preventDefault()
        if (ev.touches.length == 1) {
            let obj = {
            x: ev.targetTouches[0].clientX - this.stageInfo.left,
            y: ev.targetTouches[0].clientY - this.stageInfo.top
            }
            this.moveY = obj.y
            this.moveX = obj.x
            this.canvasTxt.beginPath()
            this.canvasTxt.moveTo(this.startX, this.startY)
            this.canvasTxt.lineTo(obj.x, obj.y)
            this.canvasTxt.stroke()
            this.canvasTxt.closePath()
            this.startY = obj.y
            this.startX = obj.x
            this.points.push(obj)
        }
    },
    touchEnd(ev) {
        ev = ev || event
        ev.preventDefault()
        if (ev.touches.length == 1) {
            let obj = {
            x: ev.targetTouches[0].clientX - this.stageInfo.left,
            y: ev.targetTouches[0].clientY - this.stageInfo.top
            }
            this.canvasTxt.beginPath()
            this.canvasTxt.moveTo(this.startX, this.startY)
            this.canvasTxt.lineTo(obj.x, obj.y)
            this.canvasTxt.stroke()
            this.canvasTxt.closePath()
            this.points.push(obj)
        }
    },
    //pc端
    mouseDown(ev) {
        ev = ev || event
        ev.preventDefault()
        // if (1) {
            let obj = {
                x: ev.offsetX,
                y: ev.offsetY
            }
            this.startX = obj.x
            this.startY = obj.y
            this.canvasTxt.beginPath()
            this.canvasTxt.moveTo(this.startX, this.startY)
            this.canvasTxt.lineTo(obj.x, obj.y)
            this.canvasTxt.stroke()
            this.canvasTxt.closePath()
            this.points.push(obj)
            this.isDown = true
        // }
    },
    mouseMove(ev) {
        ev = ev || event
        ev.preventDefault()
        if (this.isDown) {
            let obj = {
                x: ev.offsetX,
                y: ev.offsetY
            }
            this.moveY = obj.y
            this.moveX = obj.x
            this.canvasTxt.beginPath()
            this.canvasTxt.moveTo(this.startX, this.startY)
            this.canvasTxt.lineTo(obj.x, obj.y)
            this.canvasTxt.stroke()
            this.canvasTxt.closePath()
            this.startY = obj.y
            this.startX = obj.x
            this.points.push(obj)

            this.hauhuadebabybaby()
        }
    },
    mouseUp(ev) {
        ev = ev || event
        ev.preventDefault()
        // if (1) {
            let obj = {
                x: ev.offsetX,
                y: ev.offsetY
            }
            this.canvasTxt.beginPath()
            this.canvasTxt.moveTo(this.startX, this.startY)
            this.canvasTxt.lineTo(obj.x, obj.y)
            this.canvasTxt.stroke()
            this.canvasTxt.closePath()
            this.points.push(obj)
            this.points.push({x: -1, y: -1})
            this.isDown = false
    },

	//最重要,实时改变图片
    hauhuadebabybaby(){
        let dataURL = this.canvaBom.toDataURL();
        var image = new Image();
        image.src = dataURL
        this.canvasData = dataURL;
    },

    //清除重写
    overwrite() {
        this.canvasTxt.clearRect(0, 0, this.canvaBom.width,this.canvaBom.width, this.canvaBom.width,this.canvaBom.height)
        this.points = []
        this.canvasData = ''
    },
  },
}
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在小程序中实现电子签名,可以使用小程序的 `canvas` 组件。 首先,在页面的 `wxml` 文件中添加 `canvas` 组件: ```html <canvas id="canvas" class="canvas"></canvas> ``` 然后,在页面的 `js` 文件中,获取 `canvas` 组件的上下文: ```javascript Page({ onLoad: function () { const ctx = wx.createCanvasContext('canvas'); } }) ``` 接下来,监听用户手指在 `canvas` 上的滑动事件,并将滑动轨迹绘制到 `canvas` 上: ```javascript Page({ data: { startX: 0, startY: 0, endX: 0, endY: 0 }, onLoad: function () { const ctx = wx.createCanvasContext('canvas'); ctx.setStrokeStyle('#000000'); ctx.setLineWidth(5); ctx.setLineCap('round'); ctx.setLineJoin('round'); ctx.beginPath(); ctx.draw(); }, onTouchStart: function (e) { this.setData({ startX: e.changedTouches[0].x, startY: e.changedTouches[0].y }); }, onTouchMove: function (e) { const ctx = wx.createCanvasContext('canvas'); this.setData({ endX: e.changedTouches[0].x, endY: e.changedTouches[0].y }); ctx.moveTo(this.data.startX, this.data.startY); ctx.lineTo(this.data.endX, this.data.endY); ctx.stroke(); ctx.draw(true); this.setData({ startX: this.data.endX, startY: this.data.endY }); } }) ``` 最后,将 `canvas` 组件保存为图片,并将图片保存到本地: ```javascript Page({ data: { imageSrc: '' }, onSave: function () { const ctx = wx.createCanvasContext('canvas'); wx.canvasToTempFilePath({ canvasId: 'canvas', success: (res) => { this.setData({ imageSrc: res.tempFilePath }); wx.saveImageToPhotosAlbum({ filePath: this.data.imageSrc, success: (res) => { wx.showToast({ title: '保存成功', icon: 'success', duration: 2000 }); }, fail: (err) => { wx.showToast({ title: '保存失败', icon: 'none', duration: 2000 }); } }); }, fail: (err) => { wx.showToast({ title: '保存失败', icon: 'none', duration: 2000 }); } }); } }) ``` 完整代码示例: ```html <view class="container"> <canvas id="canvas" class="canvas" bindtouchstart="onTouchStart" bindtouchmove="onTouchMove"></canvas> <view class="btn-group"> <button class="btn" bindtap="onSave">保存签名</button> </view> </view> ``` ```javascript Page({ data: { startX: 0, startY: 0, endX: 0, endY: 0, imageSrc: '' }, onLoad: function () { const ctx = wx.createCanvasContext('canvas'); ctx.setStrokeStyle('#000000'); ctx.setLineWidth(5); ctx.setLineCap('round'); ctx.setLineJoin('round'); ctx.beginPath(); ctx.draw(); }, onTouchStart: function (e) { this.setData({ startX: e.changedTouches[0].x, startY: e.changedTouches[0].y }); }, onTouchMove: function (e) { const ctx = wx.createCanvasContext('canvas'); this.setData({ endX: e.changedTouches[0].x, endY: e.changedTouches[0].y }); ctx.moveTo(this.data.startX, this.data.startY); ctx.lineTo(this.data.endX, this.data.endY); ctx.stroke(); ctx.draw(true); this.setData({ startX: this.data.endX, startY: this.data.endY }); }, onSave: function () { const ctx = wx.createCanvasContext('canvas'); wx.canvasToTempFilePath({ canvasId: 'canvas', success: (res) => { this.setData({ imageSrc: res.tempFilePath }); wx.saveImageToPhotosAlbum({ filePath: this.data.imageSrc, success: (res) => { wx.showToast({ title: '保存成功', icon: 'success', duration: 2000 }); }, fail: (err) => { wx.showToast({ title: '保存失败', icon: 'none', duration: 2000 }); } }); }, fail: (err) => { wx.showToast({ title: '保存失败', icon: 'none', duration: 2000 }); } }); } }) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值