uniapp实现canvas签名

简介: uniapp实现canvas签名

效果图:

 

需求:

用户需在小程序中使用手写的方式签字或签名

使用:

<template>
   <view class="signature-box">
      <!-- 签名 -->
      <view class="signature">
        <canvas class="mycanvas" canvas-id="mycanvas" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"></canvas>
        <view class="footer">
          <button @click="finish" type="primary" ripple-bg-color="#909399">保存</button>
          <button @click="clear" type="warning" ripple-bg-color="#909399">清除</button>
          <button @click="close" type="error" ripple-bg-color="#909399">关闭</button>
        </view>
      </view>
                   <!-- 签完名后生成的图片 -->
      <view v-show="SignatureImg" class="SignatureImg"><image :src="SignatureImg" mode=""></image></view>
                    <!-- 清除签完名后生成的图片 -->
      <u-button v-show="SignatureImg" @click="obliterate" type="error" :plain="true" :ripple="true" ripple-bg-color="#909399" size="medium">清除签名</u-button>
    </view>
</template>
<script>
  var x = 20;
  var y = 20;
  export default {
    data() {
      return {
        //绘图图像
        ctx: '', 
        //路径点集合
        points: [], 
        //签名图片
        SignatureImg: ''
      };
    },
    props: ['showCanvas'],
    methods: {
      //清除签名的图片
      obliterate() {
        if (this.SignatureImg) {
          this.SignatureImg = '';
        }
        this.close();
      },
      //关闭并清空画布
      close() {
        this.$emit('closeCanvas');
        this.clear();
      },
      //创建并显示画布
      createCanvas() {
        this.ctx = uni.createCanvasContext('mycanvas', this); //创建绘图对象
        //设置画笔样式
        this.ctx.lineWidth = 4;
        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);
      },
      //清空画布
      clear() {
        console.log("清空")
        let that = this;
        uni.getSystemInfo({
          success: function(res) {
            let canvasw = res.windowWidth;
            let canvash = res.windowHeight;
            that.ctx.clearRect(0, 0, canvasw, canvash);
            that.ctx.draw(true);
          }
        });
      },
      //完成绘画并保存到本地
      finish() {
        console.log('保存')
        let that = this;
        uni.canvasToTempFilePath(
          {
            canvasId: 'mycanvas',
            success: function(res) {
              console.log('------------------')
              console.log(res);
              that.SignatureImg = res.tempFilePath;
              that.$emit('closeCanvas');
              that.close();
            }
          },
        );
      }
    },
    mounted() {
      this.createCanvas();
    }
  };
</script>
<style lang="less" scoped>
.signature-box {
  display: flex;
  flex-direction: column;
  align-items: center;
  background: #fff;
  //签名模块
  .signature {
    position: fixed;
    top: 10px;
    left: 2%;
    z-index: 999;
    width: 96%;
    //canvas
    .mycanvas {
      width: 100%;
      height: calc(100vh - 200upx);
      background-color: #ececec;
    }
    //底部按钮
    .footer {
      font-size: 14px;
      height: 150upx;
      display: flex;
      justify-content: space-around;
      align-items: center;
    }
  }
  //生成的图片
  .SignatureImg {
    image {
      width: 750rpx;
      height: 750rpx;
    }
  }
}
</style>
目录
相关文章
|
开发框架 小程序
用uniapp实现微信小程序的电子签名效果
用uniapp实现微信小程序的电子签名效果
743 0
用uniapp实现微信小程序的电子签名效果
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的房屋租赁App的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的房屋租赁App的详细设计和实现(源码+lw+部署文档+讲解等)
129 7
基于SpringBoot+Vue+uniapp的房屋租赁App的详细设计和实现(源码+lw+部署文档+讲解等)
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的汉服交易小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的汉服交易小程序的详细设计和实现(源码+lw+部署文档+讲解等)
63 7
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的宠物医院微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的宠物医院微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
84 7
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的武汉市公交路线查询系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的武汉市公交路线查询系统的详细设计和实现(源码+lw+部署文档+讲解等)
116 7
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的旅游攻略系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的旅游攻略系统的详细设计和实现(源码+lw+部署文档+讲解等)
117 7
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的成人教育APP的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的成人教育APP的详细设计和实现(源码+lw+部署文档+讲解等)
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现(源码+lw+部署文档+讲解等)