iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >canvas如何实现手机的手势解锁
  • 418
分享到

canvas如何实现手机的手势解锁

2023-06-09 11:06:17 418人浏览 八月长安
摘要

这篇文章给大家分享的是有关canvas如何实现手机的手势解锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:按照国际惯例,先放效果图1、js动态初始化Dom结构首先在index.html中添加基本样式bo

这篇文章给大家分享的是有关canvas如何实现手机的手势解的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

具体如下:

按照国际惯例,先放效果图

canvas如何实现手机的手势解锁

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="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 h5="<h5 id='title' class='title'>绘制解锁图案</h5>";        div.innerHTML=h5;        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();

效果图

canvas如何实现手机的手势解锁

2、 画圆函数

需要补充一下画布宽度与圆的半径的关系

如果一行3个圆,则有4个间距,间距的宽度与圆的直径相同,相当于7个直径,即14个半径

如果一行4个圆,则有5个间距,间距的宽度与圆的直径相同,相当于9个直径,即18个半径

如果一行n个圆,则有n+1个间距,间距的宽度与圆的直径相同,相当于2n+1个直径,即4n+2个半径

canvas如何实现手机的手势解锁

补充两个方法:

//以给定坐标点为圆心画出单个圆    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();

效果图

canvas如何实现手机的手势解锁

3、canvas事件操作&mdash;&mdash;实现画圆和画线

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);

判断是否在圆内的原理:

canvas如何实现手机的手势解锁

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

并且

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

则可以判断鼠标位于圆内

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

//触摸点移动时的动画    canvasLock.prototype.update=function(po){        //清屏,canvas动画前必须清空原来的内容        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);        }        this.drawPoint();//点击过的圆画实心圆        this.drawLine(po);//画线    }    //画实心圆    canvasLock.prototype.drawPoint=function(){        for(var i=0;i<this.lastPoint.length;i++){            this.ctx.fillStyle="#abcdef";            this.ctx.beginPath();            this.ctx.arc(this.lastPoint[i].x,this.lastPoint[i].y,this.r/2,0,2*Math.PI,true);            this.ctx.closePath();            this.ctx.fill();        }    }    //画线    canvasLock.prototype.drawLine=function(po){        this.ctx.beginPath();        this.lineWidth=3;        this.ctx.moveTo(this.lastPoint[0].x,this.lastPoint[0].y);//线条起点        for(var i=1;i<this.lastPoint.length;i++){            this.ctx.lineTo(this.lastPoint[i].x,this.lastPoint[i].y);        }        this.ctx.lineTo(po.x,po.y);//触摸点        this.ctx.stroke();        this.ctx.closePath();    }

效果图

canvas如何实现手机的手势解锁

4、canvas手势链接操作实现

在touchmove中补充当碰到下一个目标圆时的操作

//碰到下一个圆时只需要push到lastPoint当中去        for(var i=0;i<this.restPoint.length;i++){            if((Math.abs(po.x-this.restPoint[i].x)<this.r) && (Math.abs(po.y-this.restPoint[i].y)<this.r)){                this.lastPoint.push(this.restPoint[i]);//将这个新点击到的点存入lastPoint                this.restPoint.splice(i,1);//从restPoint中剔除这个新点击到的点                break;            }        }

效果图

canvas如何实现手机的手势解锁

5、解锁成功与否的判断

//设置密码    canvasLock.prototype.storePass=function(){        if(this.checkPass()){            document.getElementById("title").innerHTML="解锁成功";            this.drawStatusPoint("lightgreen");        }else{            document.getElementById("title").innerHTML="解锁失败";            this.drawStatusPoint("orange");        }    }    //判断输入的密码    canvasLock.prototype.checkPass=function(){        var p1="123",//成功的密码            p2="";        for(var i=0;i<this.lastPoint.length;i++){            p2+=this.lastPoint[i].index;        }        return p1===p2;    }    //绘制判断结束后的状态    canvasLock.prototype.drawStatusPoint=function(type){        for(var i=0;i<this.lastPoint.length;i++){            this.ctx.strokeStyle=type;            this.ctx.beginPath();            this.ctx.arc(this.lastPoint[i].x,this.lastPoint[i].y,this.r,0,2*Math.PI,true);            this.ctx.closePath();            this.ctx.stroke();        }    }    //程序全部结束后重置    canvasLock.prototype.reset=function(){        this.createCircle();    }

大功告成!!下面晒出所有代码

index.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>手势解锁</title>    <!-- 移动端meta头 -->    <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">    <style>           body{background:pink;text-align: center;}    </style></head><body>    <script src="index.js"></script>    <script>        // circleNum:3 表示一行3个圆        new canvasLock({circleNum:3}).init();    </script>  </body></html>

index.js

// 匿名函数自执行(function(){    // canvasLock是全局对象    window.canvasLock=function(obj){        this.width=obj.width;        this.height=obj.height;        this.circleNum=obj.circleNum;    }    //动态生成DOM    canvasLock.prototype.initDom=function(){        //创建一个div        var div=document.createElement("div");        var h5="<h5 id='title' class='title'>绘制解锁图案</h5>";        div.innerHTML=h5;        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;    }    //以给定坐标点为圆心画出单个圆    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.bindEvent=function(){        var self=this;        this.canvas.addEventListener("touchstart",function(e){            var po=self.getPosition(e);//鼠标距离canvas的距离            //判断是否在圆内            for(var i=0;i<self.arr.length;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);        this.canvas.addEventListener("touchmove",function(e){            if(self.touchFlag){                //触摸点移动时的动画                self.update(self.getPosition(e));            }        },false);        //触摸离开时        this.canvas.addEventListener("touchend",function(e){            if(self.touchFlag){                self.storePass(self.lastPoint);                setTimeout(function(){                    self.reset();                },300);            }        },false);    }    //设置密码    canvasLock.prototype.storePass=function(){        if(this.checkPass()){            document.getElementById("title").innerHTML="解锁成功";            this.drawStatusPoint("lightgreen");        }else{            document.getElementById("title").innerHTML="解锁失败";            this.drawStatusPoint("orange");        }    }    //判断输入的密码    canvasLock.prototype.checkPass=function(){        var p1="123",//成功的密码            p2="";        for(var i=0;i<this.lastPoint.length;i++){            p2+=this.lastPoint[i].index;        }        return p1===p2;    }    //绘制判断结束后的状态    canvasLock.prototype.drawStatusPoint=function(type){        for(var i=0;i<this.lastPoint.length;i++){            this.ctx.strokeStyle=type;            this.ctx.beginPath();            this.ctx.arc(this.lastPoint[i].x,this.lastPoint[i].y,this.r,0,2*Math.PI,true);            this.ctx.closePath();            this.ctx.stroke();        }    }    //程序全部结束后重置    canvasLock.prototype.reset=function(){        this.createCircle();    }        //获取鼠标点击处离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;    }    //触摸点移动时的动画    canvasLock.prototype.update=function(po){        //清屏,canvas动画前必须清空原来的内容        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);        }        // 鼠标每移动一下都会重绘canvas,update操作相当于每一个move事件都会触发        this.drawPoint();//点击过的圆画实心圆        this.drawLine(po);//画线        //碰到下一个圆时只需要push到lastPoint当中去        for(var i=0;i<this.restPoint.length;i++){            if((Math.abs(po.x-this.restPoint[i].x)<this.r) && (Math.abs(po.y-this.restPoint[i].y)<this.r)){                this.lastPoint.push(this.restPoint[i]);//将这个新点击到的点存入lastPoint                this.restPoint.splice(i,1);//从restPoint中剔除这个新点击到的点                break;            }        }    }    //画实心圆    canvasLock.prototype.drawPoint=function(){        for(var i=0;i<this.lastPoint.length;i++){            this.ctx.fillStyle="#abcdef";            this.ctx.beginPath();            this.ctx.arc(this.lastPoint[i].x,this.lastPoint[i].y,this.r/2,0,2*Math.PI,true);            this.ctx.closePath();            this.ctx.fill();        }    }    //画线    canvasLock.prototype.drawLine=function(po){        this.ctx.beginPath();        this.lineWidth=3;        this.ctx.moveTo(this.lastPoint[0].x,this.lastPoint[0].y);//线条起点        for(var i=1;i<this.lastPoint.length;i++){            this.ctx.lineTo(this.lastPoint[i].x,this.lastPoint[i].y);        }        this.ctx.lineTo(po.x,po.y);//触摸点        this.ctx.stroke();        this.ctx.closePath();    }    //init代表初始化,程序的入口    canvasLock.prototype.init=function(){        //动态生成DOM        this.initDom();        //创建画布        this.canvas=document.getElementById("canvas");        this.ctx=this.canvas.getContext("2d");        //默认不允许拖拽        this.touchFlag=false;        //绘制出所有的圆        this.createCircle();        //添加事件        this.bindEvent();    }})();

感谢各位的阅读!关于“canvas如何实现手机的手势解锁”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: canvas如何实现手机的手势解锁

本文链接: http://www.lsjlt.com/news/255807.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • canvas如何实现手机的手势解锁
    这篇文章给大家分享的是有关canvas如何实现手机的手势解锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:按照国际惯例,先放效果图1、js动态初始化Dom结构首先在index.html中添加基本样式bo...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现手势解锁
    怎么在html5中使用canvas实现手势解锁?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。demo.html<!DOCTYPE html><h...
    99+
    2023-06-09
  • 使用canvas怎么实现一个手势解锁功能
    使用canvas怎么实现一个手势解锁功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。手势解锁通过手指将屏幕上的九个点依次连接起来形成一个图案,所以叫图案解锁。...
    99+
    2023-06-09
  • JS前端使用Canvas快速实现手势解锁特效
    目录前言Demo需要实现的功能初始化数据和页面渲染touchstart 手指开始触摸事件touchmove 监听手指滑动事件touchend 监听手指触摸结束事件页面滚动处理连接的两...
    99+
    2024-04-02
  • jQuery如何实现手势解锁密码特效
    这篇文章主要为大家展示了“jQuery如何实现手势解锁密码特效”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现手势解锁密码特效”这篇文章吧。效...
    99+
    2024-04-02
  • 微信小程序怎么实现手势解锁
    本文小编为大家详细介绍“微信小程序怎么实现手势解锁”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序怎么实现手势解锁”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、项目展示这是一款简单实用的手势解锁工具...
    99+
    2023-06-30
  • 微信小程序实现手势解锁的示例详解
    目录一、项目展示二、设置手势、手势解锁三、手势重置一、项目展示 这是一款简单实用的手势解锁工具 手势解锁是当下常用的解锁方式 本实例以工具的形式 可以嵌入到不同的项目之中 二、设置...
    99+
    2024-04-02
  • 手机解锁方法:8个顶级的 Android 手机解锁软件
    一般来说,太简单的密码是不安全的,所以我们设置一个安全的密码,可能会稍微复杂一点。然而,我们可能经常会忘记复杂的密码并锁定我们的 Android 智能手机。 8个顶级的 Android 手机解锁软件 如果您遇到过这种情况并且正在寻找一种有...
    99+
    2023-09-03
    android 智能手机 android studio windows
  • 微信小程序如何实现手势图案锁屏功能
    这篇文章给大家分享的是有关微信小程序如何实现手势图案锁屏功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图WXML<view class="con...
    99+
    2024-04-02
  • CSS3怎么实现手机滑动解锁功能
    本篇内容主要讲解“CSS3怎么实现手机滑动解锁功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS3怎么实现手机滑动解锁功能”吧!该效果的主要实现思路是给文...
    99+
    2024-04-02
  • 基于Flutter实现手势密码加密与解锁功能
    目录前言1、绘制静态图形2、存储手势密码数据3、添加手势交互4、绘制、刷新密码线5、加入密码错误动画总结前言 密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波...
    99+
    2024-04-02
  • 使用Canvas怎么实现一个手势控制功能
    使用Canvas怎么实现一个手势控制功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先讲一下思路:首先跟图需求可以知道,作出这样的效果需要一组对象,每个对象有颜色,所占...
    99+
    2023-06-09
  • 如何实现HTML5 Canvas+JS控制电脑或手机上的摄像头
    这篇文章主要介绍“如何实现HTML5 Canvas+JS控制电脑或手机上的摄像头”,在日常操作中,相信很多人在如何实现HTML5 Canvas+JS控制电脑或手机上的摄像头问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • jquery如何实现手势密码插件
    这篇文章将为大家详细讲解有关jquery如何实现手势密码插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果图:代码如下:<!DOCTYPE html&...
    99+
    2024-04-02
  • ajax如何实现手机定位
    这篇文章将为大家详细讲解有关ajax如何实现手机定位,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目前的版本只是demo,仍有几个问题需要完善一下,问题如下:1,如何将经...
    99+
    2024-04-02
  • jquery.mobile如何实现手机滚动
    小编给大家分享一下jquery.mobile如何实现手机滚动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!<!-- <...
    99+
    2024-04-02
  • Python如何利用opencv实现手势识别
    目录获取视频(摄像头)肤色检测轮廓处理前言: 网上搜到了一些关于手势处理的实验,我在这儿简单的实现一下,主要运用的知识就是opencv,python基本语法,图像处理基础知识。 获取...
    99+
    2024-04-02
  • Android如何实现九宫格手势密码
    这篇“Android如何实现九宫格手势密码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何实现九宫格手势密码...
    99+
    2023-07-02
  • react如何实现手机验证码
    今天小编给大家分享一下react如何实现手机验证码的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。react实现手机验证码的方...
    99+
    2023-07-04
  • java手机验证码如何实现
    要实现Java手机验证码功能,你可以使用短信平台的API来发送短信验证码。以下是一个简单的示例:1. 首先,你需要在短信平台上注册一...
    99+
    2023-09-04
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作