uniApp使用canvas制作签名板

news/2024/11/7 7:23:44/

插件市场大佬封装好的 组件 可以直接拿过去

javascript"><template><viewclass="whole canvas-autograph flexc"@touchmove.prevent.stop@wheel.prevent.stopv-show="modelValue"><canvasclass="scroll-view"id="mycanvas"canvas-id="mycanvas"@touchstart="touchstart"@touchmove="touchmove"@touchend="touchend"/><view class="fun-box"><viewclass="fun-box-btn clear flex"@click="clear"><text>清空</text></view><viewclass="fun-box-btn confirm flex"@click="confirm"><text>确认</text></view><viewclass="fun-box-btn cancel flex"@click="cancel"><text>取消</text></view></view></view>
</template><script setup>
/*使用如下<canvas-autograph v-model="isCanvas" @complete="complete"/>// 打开、关闭let isCanvas = ref(false)// 确认事件const complete = e=>{console.log(e)}*/
import { ref, reactive, watch, getCurrentInstance } from 'vue'
const hasSignature = ref(false) // 新增:记录是否签名
const emits = defineEmits(['update:modelValue', 'complete'])const props = defineProps({modelValue: Boolean
})
const _this = getCurrentInstance()
watch(() => props.modelValue,(e) => {// 这里可进行 tabbar 的 显示、隐藏  不要也可以// 自己写},{immediate: true // 是否默认执行一次  默认为false}
)let points = reactive([]) //路径点集合let canvaCtx = reactive(uni.createCanvasContext('mycanvas', _this)) //创建绘图对象
//设置画笔样式
canvaCtx.lineWidth = 4
canvaCtx.lineCap = 'round'
canvaCtx.lineJoin = 'round'//触摸开始,获取到起点
const touchstart = (e) => {hasSignature.value = true // 有触摸操作则认为有签名let startX = e.changedTouches[0].xlet startY = e.changedTouches[0].ylet startPoint = { X: startX, Y: startY }points.push(startPoint)//每次触摸开始,开启新的路径canvaCtx.beginPath()
}
//触摸移动,获取到路径点
const touchmove = (e) => {let moveX = e.changedTouches[0].xlet moveY = e.changedTouches[0].ylet movePoint = { X: moveX, Y: moveY }points.push(movePoint) //存点let len = points.lengthif (len >= 2) {draw()}
}
//绘制路径
const draw = () => {let point1 = points[0]let point2 = points[1]points.shift()canvaCtx.moveTo(point1.X, point1.Y)canvaCtx.lineTo(point2.X, point2.Y)canvaCtx.stroke()canvaCtx.draw(true)
}
// 触摸结束,将未绘制的点清空防止对后续路径产生干扰
const touchend = (e) => {points = []
}
// 清空画布
const clear = () => {hasSignature.value = false // 清空时重置签名标志return uni.getSystemInfo().then((res) => {canvaCtx.clearRect(0, 0, res.windowWidth, res.windowHeight)canvaCtx.draw(true)return res}).catch((err) => {// console.log(err);})
}
// 确认
const confirm = () => {if (!hasSignature.value) {// 如果没有签名,提示用户uni.showToast({title: '请先签名',icon: 'none',duration: 2000})return}uni.canvasToTempFilePath({ canvasId: 'mycanvas' }, _this, _this.parent).then((res) => {console.log(res.tempFilePath)emits('complete', res.tempFilePath)cancel()})
}
// 取消
const cancel = () => {clear().then((res) => emits('update:modelValue', false))
}
</script><style scoped lang="scss">
.canvas-autograph {position: fixed;z-index: 99999;width: 100vw;height: 100vh;top: 0;left: 0;.scroll-view {width: 100%;height: 100%;background-color: #ffffff;}.fun-box {position: absolute;right: 0;bottom: 10vh;height: auto;display: flex;flex-direction: column;.fun-box-btn {width: 100rpx;height: 160rpx;color: #ffffff;border-radius: 20rpx;border: 1rpx solid #c0c0c0;display: flex;align-items: center;justify-content: center;margin-bottom: 20rpx;margin-right: 10rpx;text {transform: rotate(90deg);}}.clear {color: #909399;background-color: #f4f4f5;}.confirm {background-color: #409eff;}.cancel {background-color: #f67d7d;}}
}
</style>

子组件使用

javascript">    <miliu-autographv-model="isCanvas"@complete="complete"></miliu-autograph>let isCanvas = ref(false)function toCanvas() {isCanvas.value = true
}// 确认事件
const complete = (e) => {console.log(e) // 返回本地生成的base图片路径// 上传签名图片uni.getImageInfo({src: e,success: function (res) {// uni.uploadFile({//   url: baseUrl + '/file/upload', //后端接口地址//   name: 'file', //必填 , 此为类型名称//   filePath: res.path, //电子签名图片路径//   header: {//     Authorization: 'Bearer ' + that.token//   },//   success: (res) => {//     console.log(res, '签名信息 ------ res');//     //上传成功后逻辑//     uni.showToast({//       title: '签名成功!'//     });//   },//   fail: (err) => {//     console.log(err);//     uni.showToast({//       title: '签名失败!'//     });//   }// });}})
}

再具体的我就不描述了 


http://www.ppmy.cn/news/1544995.html

相关文章

石墨舟氮气柜:半导体制造中的关键保护设备

石墨舟是由高纯度石墨材料制成的&#xff0c;主要用于承载硅片或其他基板材料通过高温处理过程&#xff0c;是制造半导体器件和太阳能电池片的关键设备之一。 石墨舟在空气中容易与氧气发生反应&#xff0c;尤其是在高温处理后&#xff0c;表面可能更为敏感&#xff1b;石墨舟具…

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d&#xff1a;如果是两位数&#xff0c;将会在前面添上一位0 %.2f&#xff1a;会保留两位小数 如果是long&#xff0c;必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制&#xff1a; 十进制转任意进制时&#xff…

基于Zynq FPGA对雷龙SD NAND的测试

一、SD NAND 特征 1.1 SD 卡简介 雷龙的 SD NAND 有很多型号&#xff0c;在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能&#xff0c;并且在意外掉电的情况下同样能保证数据的安全。 …

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

【Linux】Linux管道揭秘:匿名管道如何连接进程世界

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1.什么是管道 &#xff1f;2. 管道的类型2.1 匿…

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求&#xff0c;一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

Git进阶(十八):git rebase详解

文章目录 一、前言二、rebase 图解三、应用示例四、重建提交历史五、rebase VS merge六、拓展阅读 一、前言 rebase 使用方法 git rebase [基节点] git rebase [基节点] [待变基节点]rebase后面的参数可以是两个&#xff0c;也可以是一个&#xff0c;当rebase为一个参数的时…

Harmony OS 如何实现 C++ NATIVE YUV420(其他数据格式如BGRA等)自渲染

在HarmonyOS下自渲染视频数据 在本文中&#xff0c;我们将介绍如何在HarmonyOS下自渲染视频数据。我们将实现包括创建本地窗口、设置缓冲区选项、请求缓冲区、处理视频帧数据以及刷新缓冲区等步骤。 环境准备 在开始之前&#xff0c;请确保您已经安装了HarmonyOS的开发环境&…