实现uniapp小程序电子签名板,横屏手写姓名签名专用写字画板

      发布在:前端技术      评论:0 条评论

实现uniapp小程序电子横屏签名板代码如下

<template>
  <view>
    <view>
      <view>
        <canvas canvas-id="canvas_sign" @touchstart="touchstart"
                @touchmove="touchmove" @touchend="touchend" disable-scroll="true"></canvas>
      </view>

      <view>
        <button @click="autographClick(1)">重置</button>
        <button @click="autographClick(2)">保存</button>
        <button @click="autographClick(3)">取消</button>
      </view>
    </view>

  </view>
</template>

<script>
import {request_url} from "../../utils/url.js"
export default {
  data() {
    return {
      request_url:request_url,canvasCtx: '', //绘图图像
      points: [], //路径点集合
      hasSign: false,
      isInit: false,
    }
  },
  onLoad(query) {
    this.canvasCtx = uni.createCanvasContext('canvas_sign', this) //创建绘图对象
    //设置画笔样式
    this.canvasCtx.lineWidth = 6
    // 设置线条的端点样式
    this.canvasCtx.lineCap = 'round'
    // 设置线条的交点样式
    this.canvasCtx.lineJoin = 'round'
  },

  methods: {
    touchstart: function(e) {
      if (!this.isInit) {
        this.isInit = true
        this.autographClick(1);
      }
      let startX = e.changedTouches[0].x
      let startY = e.changedTouches[0].y
      let startPoint = {
        X: startX,
        Y: startY
      }
      this.points.push(startPoint)
      //每次触摸开始,开启新的路径
      this.canvasCtx.beginPath()
    },touchmove: function(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: function() {
      this.points = []
      this.canvasCtx.draw(true)
    },
    draw: function() {
      let point1 = this.points[0]
      let point2 = this.points[1]
      this.points.shift()
      this.canvasCtx.moveTo(point1.X, point1.Y)
      this.canvasCtx.lineTo(point2.X, point2.Y)
      this.canvasCtx.stroke()
      this.canvasCtx.draw(true)
      this.hasSign = true
    },
    clear() {
      //清空画布
      this.hasSign = false
      let that=this;
      uni.getSystemInfo({
        success: function(res) {
          let canvas = uni.createSelectorQuery().select('.form-content__canvas')
          canvas.boundingClientRect().exec(function(data) {
            console.log('canvas', data)
            console.log('canvas wh:' + data[0].width + 'X' + data[0].height)
            let canvasw = Math.ceil(data[0].width)
            let canvash = Math.ceil(data[0].height)
            that.canvasCtx.fillStyle = '#fff'
            that.canvasCtx.fillRect(0, 0, canvasw, canvash)
            that.canvasCtx.draw(true)
          })
        }
      })
    },
    // 底部按钮点击操作
    autographClick(type) {
      let that = this
      if (type === 1) {

        that.clear();
      }else if (type === 3) {
        uni.navigateBack({
        })
      } else {
        if (!this.hasSign) {
          uni.showToast({
            title: '签名不能为空',
            icon: 'none',
            duration: 2000
          })
          return
        }
        uni.getSystemInfo({
          success: function(res) {
            let canvas = uni.createSelectorQuery().select('.form-content__canvas')
            canvas.boundingClientRect().exec(function(data) {
              console.log('canvas saveSign:', data[0].width + 'X' + data[0].height)
              let canvasw = Math.ceil(data[0].width)
              let canvash = Math.ceil(data[0].height)
              uni.canvasToTempFilePath({
                destWidth: canvasw,
                destHeight: canvash,
                fileType: 'jpg',
                canvasId: 'canvas_sign',
                success: function(res) {
                  console.log('图片导出成功:', res)
                  let path = res.tempFilePath

                  // 保存图片
                  if (type === 2) {
                    that.uploadPic(path)
                  } else if (type === 3) {
                    // 预览图片
                    uni.previewImage({
                      urls: [path]
                    })
                  }
                },
                fail: (err) => {
                  // http://tmp/2LVQyvzddk2R820a9009dff43323d8e7fc9ef7a8d076.jpg
                  console.log('图片导出失败:', err)
                }
              })
            })
          }
        })
      }
    },

    // 图片上传处理
    uploadPic(tempFile) {
      let t = this;
      uni.showLoading({
        title: '正在上传中...'
      })
      uni.uploadFile({
        url:request_url+"uploadImg",
        filePath:tempFile,
        name:"upfile",
        success(res){
          let data = JSON.parse(res.data)
          t.$store.commit("signature",data.path)
          t.clear();
          console.log(t.$store.state.signature)
          uni.navigateBack({
          })
        },
        fail(e){
          console.log(e)
        },
        complete(){
          uni.hideLoading()
       }
    });
  }
  }
}
</script>

<style scoped>
/*
* 横屏后的适配方案
* @param $rpx为需要转换的字号
* @参考 https://blog.csdn.net/sdfsfsdscd/article/details/91375066
**/
@function tovmin($rpx) {
  @return #{$rpx * 100 / 750}vmin;
}

.page-content {
  width: 100vw;
  height: 100vh;

  .form {
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;

    .form-content {
      width: 100%;
      height: 100%;

      &__canvas {
        height: 100%;
        width: 100vw;
      }
    }

    .form-footer {
      padding-bottom: tovmin(20);
      //height: 100%;
      width: 100%;

      display: flex;
      flex-direction: row;

      background: #FFFFFF;
      box-shadow: 0 tovmin(4) tovmin(20) tovmin(2) rgba(183, 183, 183, 0.20);


      button {
        width: 20vw;

        height: tovmin(88);
        line-height: tovmin(88);
        border-radius: tovmin(48);
        text-align: center;
        font-size: tovmin(36);
        font-weight: bold;
      }

      button::after {
        border: none;
      }

      &__reset {
        color: #008AFE;
        border: tovmin(1) solid #008AFE;
      }

      &__save {
        background-image: linear-gradient(135deg, #1BC5FF 0%, #008AFE 100%);
      }

      &__preview {
        color: #008AFE;
        border: tovmin(1) solid #008AFE;
      }
    }
  }
}
</style>

横屏切换

到【pages.json】文件中添加横屏切换配置

 {
			"path": "pages/my/sign_page",
			"style": {
				"navigationBarTitleText": "签名",  
				"pageOrientation": "landscape",//重点是这里切换横屏
				"enablePullDownRefresh": false,
				"disableScroll": true
			}
		}


相关文章
热门推荐