当前位置: 首页 > news >正文

基于uniapp 实现画板签字

直接上效果图

在这里插入图片描述

代码

<template><view class="container"><!-- 签名画布 --><view class="canvas-container"><canvas canvas-id="signCanvas" class="sign-canvas"@touchstart="handleTouchStart"@touchmove="handleTouchMove"@touchend="handleTouchEnd"></canvas></view><!-- 操作按钮 --><view class="button-group"><button @click="clearCanvas" class="btn">清除</button><button @click="saveSignature" class="btn">保存签名</button></view><!-- 保存的签名预览 --><view class="preview" v-if="imagePath"><image :src="imagePath" mode="widthFix"></image></view></view>
</template><script>
export default {data() {return {ctx: null, // canvas 上下文points: [], // 存储绘制点isDrawing: false, // 是否正在绘制imagePath: '' // 保存的签名图片路径}},onReady() {// 初始化canvas上下文this.ctx = uni.createCanvasContext('signCanvas', this);// 设置画笔样式this.ctx.setStrokeStyle('#000000');this.ctx.setLineWidth(4);this.ctx.setLineCap('round');this.ctx.setLineJoin('round');},methods: {// 触摸开始handleTouchStart(e) {this.isDrawing = true;const startX = e.touches[0].x;const startY = e.touches[0].y;this.points = [{x: startX, y: startY}];// 开始新路径this.ctx.beginPath();this.ctx.moveTo(startX, startY);},// 触摸移动handleTouchMove(e) {if (!this.isDrawing) return;const moveX = e.touches[0].x;const moveY = e.touches[0].y;this.points.push({x: moveX, y: moveY});// 只保留最近的两个点用于绘制线段if (this.points.length > 2) {const lastTwoPoints = this.points.slice(-2);this.ctx.moveTo(lastTwoPoints[0].x, lastTwoPoints[0].y);this.ctx.lineTo(lastTwoPoints[1].x, lastTwoPoints[1].y);this.ctx.stroke();this.ctx.draw(true);}},// 触摸结束handleTouchEnd() {if (this.points.length < 2) {// 如果只有一个点,画一个点const point = this.points[0];this.ctx.arc(point.x, point.y, 2, 0, 2 * Math.PI);this.ctx.fill();this.ctx.draw(true);}this.isDrawing = false;this.points = [];},// 清除画布clearCanvas() {this.ctx.clearRect(0, 0, 10000, 10000);this.ctx.draw(true);this.imagePath = '';},// 保存签名saveSignature() {uni.canvasToTempFilePath({canvasId: 'signCanvas',success: (res) => {this.imagePath = res.tempFilePath;uni.showToast({title: '签名保存成功',icon: 'success'});// 这里可以添加将签名上传服务器的代码// this.uploadSignature(res.tempFilePath);},fail: (err) => {console.error('保存签名失败:', err);uni.showToast({title: '保存签名失败',icon: 'none'});}}, this);},// 上传签名到服务器(可选)uploadSignature(tempFilePath) {uni.uploadFile({url: '你的上传接口地址',filePath: tempFilePath,name: 'signature',success: (uploadRes) => {console.log('上传成功', uploadRes);},fail: (uploadErr) => {console.error('上传失败', uploadErr);}});}}
}
</script><style lang="scss" scoped>
.sign-canvas{width: 100vw;height: 70vh;
}
</style>

相关文章:

  • (EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • day26 学习笔记
  • 关于vxe-select得filter-method 自定义方法得使用,忽略大小写匹配
  • 【LLM】Llama-Index 架构
  • 【三维重建与生成】GenFusion:SVD统一重建和生成
  • Java版本对应关系表
  • 如何使用ChatGPT撰写短视频爆款文案
  • ping 命令的用途与功能
  • 【刷题2025】高级数据结构(并查集+优先队列+图论)
  • <uniapp><websocket><http>基于uniapp,手机客户端通过websocket进行数据通讯(二维码扫码数据)
  • 【Axure视频教程】标准金额格式转换
  • ArrayList 与顺序表:Java 线性表深度解析
  • 【JAVAFX】自定义FXML 文件存放的位置以及使用
  • 第三天 组件系统
  • OpenAI发布GPT-4.1系列模型,近屿智能助力AI人才成长#OpenAI
  • Elasticsearch:AI 助理 - 从通才到专才
  • PDF处理控件Aspose.PDF指南:使用 C# 从 PDF 文档中删除页面
  • 接口测试之postman使用指南
  • MCP技术革命:元控制协议如何重构AI与数据库的交互范式
  • 关于响应式编程框架ReactiveUI的感悟
  • 北方旱情持续,水利部:大中型灌区春灌总体有保障
  • 新片|《我仍在此》定档5月,《新·驯龙高手》同步北美上映
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 烟花秀、新航线、购物节......上海邮轮文化旅游节今日开幕
  • 以“最美通缉犯”为噱头直播?光明网:违法犯罪不应成网红跳板