首页 > 其他分享 >移动端手写板 + 模态框 + 弹框,前端监听移动端返回按钮

移动端手写板 + 模态框 + 弹框,前端监听移动端返回按钮

时间:2023-12-28 14:27:02浏览次数:18  
标签:function myCanvas false ctx 弹框 手写板 var 移动 mui

今天的需求是把全屏的手写板改为同一个页面只占半屏的手写板,本来用的iframe,后面发现笔触和屏幕按下的位置不一样,然后用了jQuery的$.load(),发现用$.load会导致文件中的js不执行,后面还是重新开始,在同文件重新写了一个canvas手写板,然后发现了,canvas在全屏的时候没问题,在容器设置高度为50%的时候,笔触就还是会出现和屏幕按下位置不一样,后面是通过ctx.translate(0,-hheight/2);重置画板中的起始点完成需求的,套iframe也可以试试这个解决方法。,看代码(mui+jQuery+canvas)

  1 
2 3
4 5 var bindDatas; 6 var opts; 7 var bindDatasStr; 8 //1.获取canvas 9 var myCanvas = document.getElementById("canvas"); 10 //获取2d对象 11 var ctx = myCanvas.getContext("2d"); 12 //清空画布 13 var reset = document.getElementById("reset"); 14 // 保存签名 15 var yes = document.getElementById("yes"); 16 // 保存的盒子 17 var imgs = document.getElementById("imgs"); 18 //控制线条是否画 19 var isMouseMove = false; 20 //线条位置 21 var lastX, lastY; 22 var is_painting = false; 23 mui.plusReady(function () { 24 opts = mui.currentWebview.selectParams; 25 // 从 localStorage 中获取字符串并将其转换为对象 26 bindDatasStr = localStorage.getItem('bindDatas'); 27 myCanvas.width = window.innerWidth; 28 hheight = window.innerHeight; 29 myCanvas.height = hheight /2;(关于笔触和触点偏移关键点在这里[设置画布的高]) 30 31 console.log(myCanvas.width); 32 console.log(myCanvas.height); 33 initCanvas(); 34 console.log(is_painting); 35 }); 36 37 function getMousePos(event) { 38 var rect = canvas.getBoundingClientRect(); 39 var x = event.clientX - rect.left; 40 var y = event.clientY - rect.top; 41 console.log("鼠标坐标:x=" + x + ", y=" + y); 42 } 43 //初始化 44 function initCanvas() { 45 // 重新设置画布的起始点(关于笔触和触点偏移关键点在这里) 46 ctx.translate(0,-hheight/2); 47 let offset = myCanvas.getBoundingClientRect(); 48 var start = (e) => { 49 e.preventDefault(); 50 isMouseMove = true; 51 drawLine( 52 e.changedTouches[0].clientX - offset.left, 53 e.changedTouches[0].clientY - offset.top, 54 false 55 ); 56 is_painting = true; 57 }; 58 let move = (e) => { 59 if (isMouseMove) { 60 getMousePos(e.changedTouches[0]); 61 drawLine( 62 e.changedTouches[0].clientX - offset.left, 63 e.changedTouches[0].clientY - offset.top, 64 true 65 ); 66 } 67 }; 68 let end = (e) => { 69 isMouseMove = false; 70 }; 71 let cancel = (e) => { 72 isMouseMove = false; 73 }; 74 75 myCanvas.addEventListener('touchstart', start) 76 myCanvas.addEventListener('touchmove', move) 77 myCanvas.addEventListener('touchend', end) 78 myCanvas.addEventListener("touchcancel", cancel) 79 } 80 //画线 81 function drawLine(x, y, isT) { 82 if (isT) { 83 ctx.beginPath(); 84 ctx.lineWidth = 1; //设置线宽状态 85 ctx.strokeStyle = 'black'; //设置线的颜色状态 86 ctx.lineCap = 'round' 87 ctx.lineJoin = "round"; 88 ctx.moveTo(lastX, lastY); 89 ctx.lineTo(x, y); 90 ctx.stroke(); 91 ctx.closePath(); 92 } 93 // 每次移动都要更新坐标位置 94 lastX = x; 95 lastY = y; 96 } 97 98 //清空画图 99 function clearCanvas() { 100 imgs.innerHTML = "" 101 ctx.beginPath(); 102 ctx.clearRect(0,hheight/2, myCanvas.width, myCanvas.height);//重新设置了起始点后,使用clearRect会出现没有清空画布这个问题,这里的hheight使用了window的高重置了一下clearRect的起始点 103 ctx.closePath(); //可加入,可不加入 104 is_painting = false; 105 } 106 //保存图片 107 function saveImgInfo() { 108 if (is_painting == true) { 109 var images = myCanvas.toDataURL('image/png'); 110 imgs.innerHTML = `<img src='${images}'>`; 111 imgs.classList.remove('mui-hidden'); 112 myCanvas.classList.add('mui-hidden'); 113 114 var options = { 115 async: false 116 }; 117 118 var data = { 119 src_data: images, 120 bindDatas: JSON.parse(bindDatasStr) 121 }; 122 123 var params = 'funid= &eventcode= &data=' + JSON.stringify(data); 124 125 var hdcall = function () { 126 mui.toast('提交成功!'); 127 // var targetWin = plus.webview.getWebviewById(opts.callbackWinId); 128 // mui.fire(targetWin, opts.callbackEvent); 129 mui.back(); 130 } 131 132 ajax.post(params, hdcall, options); 133 } else { 134 console.log(is_painting); 135 mui.alert("请先签名!"); 136 return false; 137 } 138 } 139 140 reset.addEventListener("click", clearCanvas); 141 yes.addEventListener("click", saveImgInfo);

前端监听移动端返回按钮

document.addEventListener("plusready", function() {
                // 注册返回按键事件 
                plus.key.addEventListener('backbutton', function() {
                    // 事件处理 
    }, false);
});

 

标签:function,myCanvas,false,ctx,弹框,手写板,var,移动,mui
From: https://www.cnblogs.com/sakixi/p/17814315.html

相关文章

  • css+jquery右下角弹框提示框(工作需要就开发调式了)
    使用时调用:addTip();setTimeout("closeTip();",1000);setTimeout("removeTip();",2000); //添加提示框functionaddTip(){vartip="<divid='tip'>"+"<divclass='tip-header'>提示......
  • Qt 中的多线程 02:移动工作对象到子线程中
    Qt中的多线程除了通过继承QThread类,然后重写虚函数run()之外还有另一种方案:将要执行的复杂操作,放在一个继承自QObject的类中,然后使用QObject::moveToThread(QThread*)函数将工作对象的移动到创建的子线程中去执行。工作对象类该类继承自QObject主要是用来实现一些耗......
  • libgdx摄像头的移动
    要知道,做一个游戏,摄像头是必不可少的。接下来,我将讲解libgdx里面摄像头的移动2d摄像头OrthographicCamera也叫做正交相机结果展示:按上下左右是可以移动的OrthographicCameracamera的使用:完整代码:packagecom.brentaureli.mariobros.cam;importcom.badlogic.gdx.Appli......
  • mac系统使用NTFS移动硬盘只读问题
    查看硬盘状态diskutilinfo/Volumes/秋雨mount命令也能看出磁盘挂载位置尝试使用makedir命令新建文件夹,提示只读解决方案#查看挂载的磁盘mount#卸载挂载的磁盘sudoumount/dev/disk4s1#以读写模式重新挂载:#新建一个目录$mkdir~/flashdisk#使用mount_ntfs命令挂载sudo......
  • 移动CRM是如何解决业务难题的?移动CRM系统有必要吗?
    商机稍纵即逝,外出场景下同样应该保持对销售商机的追踪,而移动CRM管理系统能办到这一点。移动CRM具体能为企业解决哪些应用场景下的问题?我们将从移动CRM的五项功能和三个具体应用场景为您说明。移动端CRM支持功能得益于SaaS架构,大多数PC端的CRM系统功能都能在手机上进行访问,相......
  • P1259 黑白棋子的移动(函数预处理)
    P1259黑白棋子的移动个人感想终于不用看题解的思路写题了(大概率是题比较简单)函数预处理如果要实现两个函数间的互相调用,直接使用会报错,因为在你第一个函数中调用的第二个函数其实还没被定义。所以需要进行函数的预处理,将次函数(排序较后的函数)可以预处理定义即可解决。解题思......
  • Unity引擎2D游戏开发,野猪基本的移动逻辑和动画
    一、类的继承在Scripts下创建Enemy文件夹,里面再创建两个C#文件将Boar文件内的代码修改为以下代码,:后的是Enemy,即继承了Enemy类publicclassBoar:Enemy{}在Enemy内,编写基本属性publicclassEnemy:MonoBehaviour{[Header("基本参数")]//基本移动速度......
  • WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化
    在信息化时代,移动应用已经成为企业发展的重要组成部分。然而,开发和维护原生客户端的成本却相对较高,需要大量的iOS、安卓和桌面端工程师。为了解决这一问题,WorkPlus作为一个功能完备的超级APP,为企业节约了大量的IT人力成本。通过使用WorkPlus,企业不需要额外雇佣iOS、安卓和桌面端工......
  • 浏览器通过USB连接移动设备读取设备信息
     注意:一般情况下,浏览器只允许通过安全的传输协议(如HTTPS)或者本地的localhost和file协议来访问USB设备这些限制是为了确保用户的隐私和安全。使用HTTPS协议可以加密数据传输,从而减少数据被窃取或篡改的风险。而本地的localhost和file协议则主要用于本地开发和测试环境,可以避免通......
  • vue项目中使用的移动端的签名组件,纯 js 写的
    <template><section><divclass="sign-wrap"><divclass="main"><divclass="box"style="width:100%;height:100%"><!--<vue-esignref="esign&qu......