• react做 canvas做签名(含清理画图,阻止手机滑动行为,为空判断等)


    import React, { Component } from 'react'
    import { Button, Divider, Row, Col } from 'antd'
    class Autograph extends Component {
      state = {
        base: '' // base64形式的图片
      }
      componentDidMount () {
        this.initCanvas()
      }
      initCanvas () {
        // 自适应设置画布大小
        const vWidth = document.body.clientWidth
        const can = document.getElementById('canvas')
        can.width = vWidth
        can.height = vWidth
        // 画布准备
        const context = can.getContext('2d')
        // 添加背景色
        context.fillStyle = '#ccc'
        context.fillRect(0, 0, can.width, can.height)
        // 笔尖设置
        context.strokeStyle = '#000' // 笔尖颜色
        context.lineWidth = 6 // 笔尖粗度
        // 监听触屏事件
        can.addEventListener('touchstart', (e) => {
          context.beginPath()
          context.moveTo(e.touches[0].pageX, e.touches[0].pageY)
        })
        can.addEventListener('touchmove', (e) => {
          e.preventDefault(); // 阻止页面拖动,如部分移动端,上下左右滑动手势,等
          context.lineTo(e.touches[0].pageX, e.touches[0].pageY)
          context.stroke()
        })
        can.addEventListener('touchend', () => {
          context.closePath()
        })
      }
      blankCanvas () {
        const blank = document.createElement('canvas')
        const canImg = document.getElementById('canvas')
        blank.width = canImg.width
        blank.height = canImg.height
        // 为使空画布与现有画图相同 (可根据实际需要修改)
        const context = blank.getContext('2d')
        context.fillStyle = '#ccc'
        context.fillRect(0, 0, blank.width, blank.height)
        // 为true 则为空画图
        // console.log(canImg.toDataURL() === blank.toDataURL());
        return canImg.toDataURL() === blank.toDataURL()
      }
      getCanvasImg () {
        const isFull = this.blankCanvas()
        if (isFull) {
          // 根据项目ui组件自行更改设置
          alert('请签名')
          return
        }
        // 获取到base64代码
        console.log(document.querySelector('canvas').toDataURL());
        this.setState({
          base: document.querySelector('canvas').toDataURL()
        })
      }
      clearCanvas () {
        this.initCanvas()
      }
      render () {
        return (
          <div>
            <canvas id='canvas' disable-scroll="true"></canvas>
            <Divider orientation="center">手写签名</Divider>
            <Row justify="space-around" align="middle">
              <Col>
              <Button onClick={this.getCanvasImg.bind(this)}>提交签名</Button>
              </Col>
              <Col>
              <Button onClick={this.clearCanvas.bind(this )}>清除签名</Button>
              </Col>
            </Row>
            <div style={{'wordBreak': 'break-all'}}>
              base64图片: <br/> {this.state.base}
            </div>
          </div>
        )
      }
    }
    export default Autograph
    
    /*
      https://www.w3school.com.cn/tags/html_ref_canvas.asp
      https://blog.csdn.net/Luckyzhoufangbing/article/details/87784843
      https://blog.csdn.net/weixin_30471561/article/details/97082558
    */ 

  • 相关阅读:
    Python3.8 爬取豆瓣电影TOP250 练手爬虫
    作为一名phper,php的运行模式,你真的了解吗??
    前端自动生成条码码插件JsBarcode.all.min.js
    js判断是否在微信内打开页面
    学习Swoole之如何避免成为被坑哭的程序员
    上下界网络流
    网络流建模经验
    HttpClient和Gson跨域访问
    CentOS7+mysql5.6配置主从
    Atlas安装配置
  • 原文地址:https://www.cnblogs.com/-roc/p/14558181.html
Copyright © 2020-2023  润新知