uniapp 实现手写签字组件

简介: 在移动应用中,手写签名是一项非常方便和实用的功能。本文将介绍如何使用 Uniapp 实现一个手写签字组件,并支持在 APP、小程序和 Web 应用中使用。

前言:

在移动应用中,手写签名是一项非常方便和实用的功能。本文将介绍如何使用 Uniapp 实现一个手写签字组件,并支持在 APP、小程序和 Web 应用中使用。

实现思路:

创建一个空白画布;
监听画布上的鼠标或触摸事件,获取当前的坐标;
将当前坐标与上一个坐标连接起来,形成一条线段;
将所有线段绘制到画布上;
提供清空和保存功能。

实现步骤:

  1. 在 uni-app 项目中新建 Handwriting.vue 文件,并添加下面的 HTML 代码:
<template>
  <div class="handwriting">
    <canvas ref="canvas" @touchstart="startDraw" @touchmove="drawing" @touchend="stopDraw" />
  </div>
</template>

<script>
export default {
    
  name: 'Handwriting',
  data() {
    
    return {
    
      ctx: null,
      canvasWidth: 0,
      canvasHeight: 0,
      lastX: 0,
      lastY: 0,
      isDrawing: false
    }
  },
  mounted() {
    
    this.initCanvas()
  },
  methods: {
    
    initCanvas() {
    
      // 初始化画布
      const canvas = this.$refs.canvas
      this.ctx = canvas.getContext('2d')
      this.canvasWidth = canvas.width = canvas.offsetWidth
      this.canvasHeight = canvas.height = canvas.offsetHeight
      this.ctx.strokeStyle = '#000'
      this.ctx.lineJoin = 'round'
      this.ctx.lineWidth = 5
    },
    startDraw(e) {
    
      // 开始绘制
      const {
     clientX, clientY } = e.touches[0]
      this.lastX = clientX
      this.lastY = clientY
      this.isDrawing = true
    },
    drawing(e) {
    
      // 绘制中
      if (!this.isDrawing) return
      const {
     clientX, clientY } = e.touches[0]
      this.ctx.beginPath()
      this.ctx.moveTo(this.lastX, this.lastY)
      this.ctx.lineTo(clientX, clientY)
      this.ctx.closePath()
      this.ctx.stroke()
      this.lastX = clientX
      this.lastY = clientY
    },
    stopDraw() {
    
      // 停止绘制
      this.isDrawing = false
    },
    clearCanvas() {
    
      // 清空画布
      this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight)
    },
    saveImage() {
    
      // 保存签名图片
      const dataURL = this.$refs.canvas.toDataURL('image/png')
      console.log(dataURL)
    }
  }
}
</script>

<style>
.handwriting {
    
  width: 100%;
  height: 300px;
  position: relative;
}

canvas {
    
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
</style>

在页面中使用 Handwriting 组件:

<template>
  <div>
    <Handwriting />
    <button @click="clearCanvas">清除</button>
    <button @click="saveImage">保存</button>
  </div>
</template>

<script>
import Handwriting from '@/components/Handwriting.vue'

export default {
    
  components: {
    
    Handwriting
  },
  methods: {
    
    clearCanvas() {
    
      // 调用 Handwriting 组件的清空画布方法
      this.$refs.handwriting.clearCanvas()
    },
    saveImage() {
    
      // 调用 Handwriting 组件的保存图片方法
      this.$refs.handwriting.saveImage()
    }
  }
}
</script>

在 App、小程序和 Web 应用中使用:

  1. App 端:直接在页面中使用 Handwriting 组件即可;
  2. 小程序端:需要在项目根目录下的 uni.scss 文件中添加以下代码,解决 canvas 在安卓机上可能出现模糊的问题:
    canvas {
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    1. Web 端:需要在页面中引入 Handwriting 组件并注册为全局组件,在需要使用的地方添加 标签即可。

完整代码如下:

<template>
  <div>
    <Handwriting ref="handwriting" />
    <button @click="clearCanvas">清除</button>
    <button @click="saveImage">保存</button>
  </div>
</template>

<script>
import Handwriting from '@/components/Handwriting.vue'

export default {
    
  components: {
    
    Handwriting
  },
  methods: {
    
    clearCanvas() {
    
      // 调用 Handwriting 组件的清空画布方法
      this.$refs.handwriting.clearCanvas()
    },
    saveImage() {
    
      // 调用 Handwriting 组件的保存图片方法
      this.$refs.handwriting.saveImage()
    }
  }
}
</script>

<style lang="scss">
canvas {
    
  -webkit-transform: translateZ(0);
  transform: translateZ(0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}

.handwriting {
    
  width: 100%;
  height: 300px;
  position: relative;
}

canvas {
    
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
</style>

总结:

本文介绍了如何使用 Uniapp 实现一个手写签字组件,并支持在 APP、小程序和 Web 应用中使用。通过监听鼠标或触摸事件,将用户手写的线条绘制到画布上,并提供清空和保存功能。这个组件在实际开发中非常实用,可以用于签名、手写笔记等场景。

目录
相关文章
|
1月前
|
数据挖掘
uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件
uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件
57 10
|
1月前
|
搜索推荐 JavaScript 数据可视化
uniapp/vue个性化单选、复选组件
uniapp/vue个性化单选、复选组件
88 5
|
1月前
|
数据可视化 大数据 API
低代码可视化开发-uniapp新闻跑马灯组件-代码生成器
低代码可视化开发-uniapp新闻跑马灯组件-代码生成器
82 2
|
1月前
|
存储 API 数据库
uniapp APP自动更新组件
uniapp APP自动更新组件
65 1
|
1月前
Uniapp矩阵评分组件
Uniapp矩阵评分组件
50 1
|
23天前
|
移动开发 编解码 数据可视化
低代码可视化-uniapp SliderRange区间组件-代码生成器
SliderRange区间组件是一种用户界面元素,允许用户通过拖动滑块选择数值范围。组件支持微信小程序、H5和App,具有高度可定制性、响应式设计和多种事件处理功能。适用于价格筛选、音量调节等场景。代码实现包括滑动区域、滑块、事件处理等部分,支持可视化配置步长、颜色等属性。使用时需注意选择合适步长、提供清晰标签和考虑无障碍设计。
36 0
|
1月前
|
编解码 数据可视化 API
DIY可视化UniApp表格组件
DIY可视化UniApp表格组件
37 0
|
1月前
|
机器学习/深度学习 算法 数据可视化
UniApp手机滑块验证组件代码生成器
UniApp手机滑块验证组件代码生成器
62 0
|
1月前
|
前端开发 JavaScript
uniapp纯CSS实现圆形进度条组件
uniapp纯CSS实现圆形进度条组件
92 0
|
4月前
|
移动开发 前端开发 小程序
uniapp内置组件uni.navigateTo跳转后页面空白问题解决
【7月更文挑战第1天】uniapp内置组件uni.navigateTo跳转后页面空白问题解决
117 4