加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

canvas实现手机的手势解锁的步调具体

发布时间:2020-03-29 02:15:27 所属栏目:编程 来源:站长网
导读:副问题#e# 凭证国际老例,先放结果图 1、js动态初始化Dom布局 起首在index.html中添加根基样式 body{background:pink;text-align: center;} 加个移动端meta头 meta name=viewport content=width=device-width,initial-scale=1.0,user-scalable=no 引入index
副问题[/!--empirenews.page--]

凭证国际老例,先放结果图

1、js动态初始化Dom布局

起首在index.html中添加根基样式

body{background:pink;text-align: center;}

加个移动端meta头

<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">

引入index.js剧本

<script src=http://www.jb51.net/html5/"index.js"></script>

index.js

// 匿名函数自执行 (function(){ // canvasLock是全局工具 window.canvasLock=function(obj){ this.width=obj.width; this.height=obj.height; } //动态天生DOM canvasLock.prototype.initDom=function(){ //建设一个div var div=document.createElement("div"); var h4="<h4>绘制解锁图案</h4>"; div.innerHTML=h4; div.setAttribute("style","position:absolute;top:0;left:0;right:0;bottom:0;"); //建设canvas var canvas=document.createElement("canvas"); canvas.setAttribute("id","canvas"); //cssText 的本质就是配置 HTML 元素的 style 属性值 canvas.style.cssText="background:pink;display:inine-block;margin-top:15px;"; div.appendChild(canvas); document.body.appendChild(div); //配置canvas默认宽高 var width=this.width||300; var height=this.height||300; canvas.style.width=width+"px"; canvas.style.height=height+"px"; canvas.width=width; canvas.height=height; } //init代表初始化,措施的进口 canvasLock.prototype.init=function(){ //动态天生DOM this.initDom(); //建设画布 this.canvas=document.getElementById("canvas"); this.ctx=this.canvas.getContext("2d"); } })();

在index.html中建设实例并初始化

new canvasLock({}).init();

结果图

2、 画圆函数

必要增补一下画布宽度与圆的半径的相关

假如一行3个圆,则有4个间距,间距的宽度与圆的直径沟通,相等于7个直径,即14个半径

假如一行4个圆,则有5个间距,间距的宽度与圆的直径沟通,相等于9个直径,即18个半径

假如一行n个圆,则有n+1个间距,间距的宽度与圆的直径沟通,相等于2n+1个直径,即4n+2个半径

增补两个要领:

//以给定坐标点为圆心画出单个圆 canvasLock.prototype.drawCircle=function(x,y){ this.ctx.strokeStyle="#abcdef"; this.ctx.lineWidth=2; this.ctx.beginPath(); this.ctx.arc(x,y,this.r,0,2*Math.PI,true); this.ctx.closePath(); this.ctx.stroke(); } //绘制出全部的圆 canvasLock.prototype.createCircle=function(){ var n=this.circleNum;//一行几个圆 var count=0; this.r=this.canvas.width/(4*n+2);//公式计较出每个圆的半径 this.lastPoint=[];//储存点击过的圆的信息 this.arr=[];//储存全部圆的信息 this.restPoint=[];//储存未被点击的圆的信息 var r=this.r; for(var i=0;i<n;i++){ for(var j=0;j<n;j++){ count++; var obj={ x:(4*j+3)*r, y:(4*i+3)*r, index:count//给每个圆标志索引 }; this.arr.push(obj); this.restPoint.push(obj);//初始化时为全部点 } } //清屏 this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height); //以给定坐标点为圆心画出全部圆 for(var i=0;i<this.arr.length;i++){ //轮回挪用画单个圆的要领 this.drawCircle(this.arr[i].x,this.arr[i].y); } }

初始化的时辰记得挪用

canvasLock.prototype.init=function(){ //动态天生DOM this.initDom(); //建设画布 this.canvas=document.getElementById("canvas"); this.ctx=this.canvas.getContext("2d"); //绘制出全部的圆 this.createCircle(); }

别忘了在index.html中实例化时传入参数(一行界说几个圆)

new canvasLock({circleNum:3}).init();

结果图

3、canvas变乱操纵——实现画圆和画线

getPosition要领用来获得鼠标触摸点离canvas的间隔(左边和上边)

canvasLock.prototype.getPosition=function(e){ var rect=e.currentTarget.getBoundingClientRect();//得到canvas间隔屏幕的上下阁下间隔 var po={ //鼠标与视口的左间隔 - canvas间隔视口的左间隔 = 鼠标与canvas的左间隔 x:(e.touches[0].clientX-rect.left), //鼠标与视口的上间隔 - canvas间隔视口的上间隔 = 鼠标间隔canvas的上间隔 y:(e.touches[0].clientY-rect.top) }; return po; }

给canvas添加 touchstart 变乱,判定触摸点是否在圆内

触摸点在圆内则应承拖拽,并将该圆添加到 lastPoint 中,从 restPoint 中剔除

this.canvas.addEventListener("touchstart",function(e){ var po=self.getPosition(e);//鼠标间隔canvas的间隔 //判定是否在圆内 for(var i=0;i<self.arr.lenth;i++){ if(Math.abs(po.x-self.arr[i].x)<self.r && Math.abs(po.y-self.arr[i].y)<self.r){ self.touchFlag=true;//应承拖拽 self.lastPoint.push(self.arr[i]);//点击过的点 self.restPoint.splice(i,1);//剩下的点剔除这个被点击的点 break; } } },false);

判定是否在圆内的道理:

圆心的x轴偏移和鼠标点的x轴偏移的间隔的绝对值小于半径

而且

圆心的y轴偏移和鼠标点的y轴偏移的间隔的绝对值小于半径

则可以判定鼠标位于圆内

给touchmove绑定变乱,在触摸点移动时给点击过的圆画上实心圆,并画线

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读