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

html+canvas 实现签名功能-手机触摸

手机上的效果图

image

需要注意,手机触摸和鼠标不是一个事件,不能通用,上一篇是关于使用鼠标的样例

相关代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.buttons {margin-top: 10px;}</style>
</head><body><div><canvas id="signatureCanvas" width="500" height="200" style="border:solid;"></canvas><button onclick="clearSignature()">清除</button><button onclick="undoLast()">清除上一步</button><button onclick="saveSignature()">保存</button></div><script>const canvas = document.getElementById('signatureCanvas');const ctx = canvas.getContext('2d');let isDrawing = false;let lastX, lastY;let strokes = []; // 用于存储每一步的绘制操作// 触摸开始事件function handleTouchStart(e) {e.preventDefault(); // 阻止默认的触摸事件isDrawing = true;[lastX, lastY] = [e.touches[0].clientX - canvas.offsetLeft, e.touches[0].clientY - canvas.offsetTop];strokes.push([]); // 开始新的笔画}// 触摸移动事件function handleTouchMove(e) {e.preventDefault(); // 阻止默认的触摸事件if (!isDrawing) return; // 如果没有触摸,则退出函数const x = e.touches[0].clientX - canvas.offsetLeft;const y = e.touches[0].clientY - canvas.offsetTop;ctx.beginPath();ctx.moveTo(lastX, lastY);ctx.lineTo(x, y);ctx.stroke();strokes[strokes.length - 1].push({ x: lastX, y: lastY, x2: x, y2: y }); // 记录当前笔画[lastX, lastY] = [x, y];}// 触摸结束事件function handleTouchEnd(e) {e.preventDefault(); // 阻止默认的触摸事件isDrawing = false;}// 清除签名function clearSignature() {ctx.clearRect(0, 0, canvas.width, canvas.height);strokes = []; // 清空所有笔画记录}// 撤销上一步function undoLast() {strokes.pop(); // 移除最后一个笔画redraw(); // 重新绘制画布}// 重新绘制画布function redraw() {ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布strokes.forEach(stroke => {stroke.forEach(line => {ctx.beginPath();ctx.moveTo(line.x, line.y);ctx.lineTo(line.x2, line.y2);ctx.stroke();});});}// 保存签名function saveSignature() {const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);// 将图片数据转换成 base64 格式const base64ImageData = canvas.toDataURL();console.log(base64ImageData);}// 绑定事件canvas.addEventListener('touchstart', handleTouchStart);canvas.addEventListener('touchmove', handleTouchMove);canvas.addEventListener('touchend', handleTouchEnd);canvas.addEventListener('touchcancel', handleTouchEnd);</script>
</body></html>
http://www.lryc.cn/news/403370.html

相关文章:

  • 前端组件化探索与实践:Vue自定义暂无数据组件的开发与应用
  • 《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境
  • Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析
  • 吴松洋院长 艺后整形集团专家组特约成员 全方位责任塑美
  • 前端经验:使用sheetjs导出CSV文本为excel
  • 【nnUNetv2进阶】十五、nnUNetv2 魔改网络-小试牛刀-引入ECA
  • centos(或openEuler系统)安装kafka集群
  • HarmonyOS根据官网写案列~ArkTs从简单地页面开始
  • GraphRAG+ollama+LM Studio+chainlit
  • 【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程② | 5.4 - 5.8
  • 6. dolphinscheduler-3.0.0伪集群部署
  • 防火墙内容安全综合实验
  • 常见的数据分析用例 —— 信用卡交易欺诈检测
  • IP地址:由电脑还是网线决定?
  • 如何定位及优化SQL语句的性能
  • SentenceTransformers (SBERT)
  • 第三届智能机械与人机交互技术学术会议(IHCIT 2024)
  • 图的访问(C++)
  • LeetCode做题记录(第二天)169. 多数元素
  • Adobe XD中文设置指南:专业设计师的现场解答
  • CentOS 7 安装Jenkins2.346.1(war方式安装)
  • 使用Java -jar运行就jar包时报异常:org.yaml.snakeyaml.error.YAMLException异常
  • golang实现的ab测试http代理工具
  • Maven学习——Maven的下载、安装与配置(详细攻略!)
  • C#知识|账号管理系统-修改账号按钮功能的实现
  • bug等级和优先级
  • 记录|C# winform布局学习
  • C/C++ json库
  • C++案例四:简易记事本程序
  • 【VUE学习】day03-过滤器filter