小程序封装电子签名

父组件

<sign bind:GetSignEvent="getSign" bind:backEvent="bindback"></sign>

Page({

  /**
   * 页面的初始数据
   */
  data: {},

  getSign(e){
    console.log(e.detail)
  },
 

})

子组件

<!-- 电子签名组件 -->
<view class="title">
<view class="qianm-all">请在空白处签字</view>
<view class="text1" wx:if="{{isshowcav}}">
   <canvas  type="2d"  id="myCanvas" style='width:680rpx; height:430rpx;' canvas-id="myCanvas"  disable-scroll="true" class="myCanvas" bindtouchstart="bindtouchstart" bindtouchmove="bindtouchmove" ></canvas>
</view>
<view class="containers">
<view bindtap="generateSign" class="container-back1">取消</view>
<view bindtap="clear" class="container-back2">清空重写</view>
<view bindtap="sure" class="container-back3">提交签名</view>
</view>
</view>

Component({
  attached(){
    // 初始化
    let that = this
    // 获取画布
    const query = this.createSelectorQuery()
    query.select('#myCanvas')
      .fields({
        node: true,
        size: true
      })
      .exec((res) => {
        console.log(res,'res');
        const canvas = res[0].node
        const ctx = canvas.getContext('2d')
        const dpr = wx.getSystemInfoSync().pixelRatio
        canvas.width = res[0].width * dpr
        canvas.height = res[0].height * dpr
        ctx.scale(dpr, dpr)
        // ctx.fillRect(0, 0, 100, 100)
        // 设置笔触信息
        ctx.strokeStyle = 'rgb(23, 24, 24)'
        ctx.lineWidth = 5
        ctx.font = "20px Arial"
        that.setData({
          canvas: canvas,
          context: ctx
        })
      })
  },
  detached: function() {
    // 在组件实例被从页面节点树移除时执行
    this.data.canvas.width = 0
    this.data.canvas.height = 0
    this.setData({
      isshowcav: false,
    })
  },
  /**
   * 组件的属性列表
   */
  properties: {

  },

  /**
   * 组件的初始数据
   */
  data: {
    config: config.host,
    isshowcav: true,
    canvas: null,
    context: null,
    // 前一点
    preX: 0,
    preY: 0,
  },

  /**
   * 组件的方法列表
   */
  methods: {
    generateSign() {
this.triggerEvent('backEvent','')
    },
    bindtouchstart(e) {
      let context = this.data.context
      let curX = e.changedTouches[0].x
      let curY = e.changedTouches[0].y
      context.beginPath()
      context.moveTo(curX, curY)
      this.data.preX = curX
      this.data.preY = curY
    },
    bindtouchmove(e) {
      this.setData({
        nullflag: true
      })
      let context = this.data.context
      let preX = this.data.preX //前面的点坐标
      let preY = this.data.preY
      let curX = e.changedTouches[0].x //现在的点坐标
      let curY = e.changedTouches[0].y

      let deltaX = Math.abs(preX - curX) //新旧值连接画线,取绝对值
      let deltaY = Math.abs(preY - curY)

      // 相差大于3像素的时候作二阶贝塞尔曲线
      if (deltaX >= 3 || deltaY >= 3) {
        // 前后两点中心点
        let centerX = (preX + curX) / 2
        let centerY = (preY + curY) / 2

        //这里以前一点作为控制点,中心点作为终点,起始点为上一次的中点
        context.quadraticCurveTo(preX, preY, centerX, centerY);
        context.stroke();
        this.data.preX = curX
        this.data.preY = curY
      }

    },
    clear(e) {
      let context = this.data.context
      let canvas = this.data.canvas
      context.clearRect(0, 0, canvas.width, canvas.height);
      context.strokeStyle = '#000000'
      context.lineWidth = 5
      context.font = "20px Arial"
    },
    sure() {
      let that = this
      setTimeout(() => {
        wx.canvasToTempFilePath({
          x: 0,
          y: 0,
          width: this.data.canvas.width,
          height: this.data.canvas.height,
          canvas: this.data.canvas,
          success(res) {
            that.setData({
              canvanImg: res.tempFilePath,
            })
            wx.uploadFile({
              filePath: res.tempFilePath,
              name: 'file',
              url: '',
              success(res) {
                that.triggerEvent('GetSignEvent',JSON.parse(res.data).message)
              }
            })
          },
          fail(res) {
            console.log(res, 'fail');
          }
        }, that)
      }, 300)
    },
  }
})

.title{
  background-color: #eee;
  height: 100vh;
 }
 .containers{
   width: 700rpx;
   margin-left: 10rpx;
   height: 18vh;
   /* justify-content: space-around; */
   display: flex;
   }
   .container-back1{
    display: inline-block;
    width: 110rpx;
    margin-left: 40rpx;
    margin-top: 5vh;
    height: 6vh;
    line-height: 6vh;
    text-align: center;
    border-radius: 20rpx;
    font-size: 28rpx;
    border: 1rpx solid #B99C65;
    color: #B99C65;
   }
   .container-back2,.container-back3{
    display: inline-block;
    width: 140rpx;
    margin-top: 5vh;
    height: 6vh;
    line-height: 6vh;
    text-align: center;
    border-radius: 20rpx;
    font-size: 28rpx;
   }
   .container-back2{
    border: 1rpx solid #B99C65;
    color: #B99C65;
    margin-left: 260rpx;
   }
   .container-back3{
    border: 1rpx solid #B99C65;
    color: #f1f0ee;
    background-color: #B99C65;
    margin-left: 30rpx;
   }
  .qianm-all{
      width:750rpx;
      height:10vh;
      line-height: 10vh;
      text-align: center;
      color: rgb(104, 103, 103);
      font-size: 28rpx;
   }
   .text{
      margin-left: 20rpx;
      height: 8vh;
      line-height: 8vh;
   }
   .text1{
      border-radius: 16rpx;
      margin-left: 35rpx;
      width: 680rpx;
      background-color: white;
      /* border:1rpx solid black; */
   }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值