返回顶部
首页 > 资讯 > 精选 >使用canvas怎么实现一个手势解锁功能
  • 818
分享到

使用canvas怎么实现一个手势解锁功能

2023-06-09 13:06:15 818人浏览 安东尼
摘要

使用canvas怎么实现一个手势解锁功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。手势解锁通过手指将屏幕上的九个点依次连接起来形成一个图案,所以叫图案解锁。

使用canvas怎么实现一个手势解功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

手势解锁

通过手指将屏幕上的九个点依次连接起来形成一个图案,所以叫图案解锁。如上图每一个解锁圆圈后面其实都是一个数字,每次比较的并不是是用户画出来的图案,而是每次手指经过图案时串联起来的圆圈下的数字组成的密码字符串,本质上我们比较的还是字符串的密码,只不过站在用户的角度看是绘制出来的图案。图案的记忆远比数字字符串记的牢固。

实现步骤

绘制密码盘

密码盘的绘制比较简单,唯一需要注意需要通过动态计算使九个点围成的正方式始终在屏幕的中间位置,在手机上还需要减去状态栏的高度。

var width = $(document).width();var height = $(document).height() - 40; //减去手机状态栏的高度//九宫格其实就是九个点,9个点的坐标对象var lockCicle = {    x: 0, //x坐标    y: 0, //y坐标    color: "#999999",    state: "1" //状态当前点是否已经被链接过};var offset = (width - height) / 2; //计算偏移量var arr = []; //九个点的坐标数组//计算九个点坐标的方法for (var i = 1; i <= 3; i++) {    //每一行    for (var j = 1; j <= 3; j++) {        //每一行的每一个        var lockCicle = {};        //横屏        if (offset > 0) {            lockCicle.x = (height / 4) * j + Math.abs(offset);            lockCicle.y = (height / 4) * i;            lockCicle.state = 0;            //竖屏        } else {            lockCicle.x = (width / 4) * j;            lockCicle.y = (width / 4) * i + Math.abs(offset);            lockCicle.state = 0;        }        arr.push(lockCicle);    }}//初始化界面的方法function init() {    ctx.clearRect(0, 0, width, height); //清空画布    pointerArr = []; //清楚绘制路径    for (var i = 0; i < arr.length; i++) {        arr[i].state = 0; //清除绘制状态        drawPointer(i);    }}//绘制九宫格解锁界面function drawPointer(i) {    ctx.save();    var radius = 0;    if (hastouch) {        radius = width / 12;    } else {        radius = 24;    }    var _fillStyle = "#dd514c";    var _strokeStyle = "#dd514c";    //不同状态显示不同颜色    if (arr[i].state == 1) {        _strokeStyle = "#1bd6c5";    }    //绘制原点    ctx.beginPath();    ctx.fillStyle = _fillStyle;    ctx.arc(arr[i].x, arr[i].y, 6, 0, Math.PI * 2, false);    ctx.fill();    ctx.closePath();    //绘制圆圈    ctx.beginPath();    ctx.strokeStyle = _strokeStyle;    ctx.lineWidth = 0.3;    ctx.lineCap = "round";    ctx.lineJoin = "round";    ctx.arc(arr[i].x, arr[i].y, radius, 0, Math.PI * 2, false);    ctx.stroke();    ctx.closePath();    ctx.restore();}//初始化界面init();

绘制连线

绘制连线的方法

var pointerArr = []; //连接线点的坐标数组var startX, startY; //线条起始点var puts = []; //经过的九个点的数组var currentPointer; //当前点是否已经连接var pwd = []; //密码var confirmPwd = []; //确认密码var unlockFlag = false; //是否解锁的标志function drawLinePointer(x, y, flag) {    ctx.clearRect(0, 0, width, height);    ctx.save();    ctx.beginPath();    ctx.strokeStyle = "#1bd6c5";    ctx.lineWidth = 5;    ctx.lineCap = "round";    ctx.lineJoin = "round";    for (var i = 0; i < pointerArr.length; i++) {        if (i == 0) {            ctx.moveTo(pointerArr[i].x, pointerArr[i].y);        } else {            ctx.lineTo(pointerArr[i].x, pointerArr[i].y);        }    }    ctx.stroke();    ctx.closePath();    ctx.restore();    for (var i = 0; i < arr.length; i++) {        drawPointer(i); //绘制圆圈和原点        if (ctx.isPointInPath(x, y) && currentPointer != i) {            //判断鼠标点击是否在圆中            pointerArr.push({                x: arr[i].x,                y: arr[i].y            });            currentPointer = i;            puts.push(i + 1);            startX = arr[i].x;            startY = arr[i].y;            arr[i].state = 1;        }    }    if (flag) {        ctx.save();        ctx.beginPath();        ctx.globalCompositeOperation = "destination-over";        ctx.strokeStyle = "#e2e0e0";        ctx.lineWidth = 5;        ctx.lineCap = "round";        ctx.lineJoin = "round";        ctx.moveTo(startX, startY);        ctx.lineTo(x, y);        ctx.stroke();        ctx.beginPath();        ctx.restore();    }}

绑定事件

连线的过程就是将 3 个 touch(移动端) 事件组合起来获取当前位置的坐标放入数组中,然后将这些坐标渲染到界面上的过程。

  • touchstart (mousedown) 当手指(鼠标)按下时设置 isMouseDown=true,同时将该点的坐标保存到线条数组中,并将数组中的点绘制出来。

  • touchmove (mousemove) 当 isMouseDown=true 时 将手指(鼠标)移动过程中所有的坐标点都保存到萧条数组中,并将数组中的点绘制出来。

  • mouseup (mouseup) 当手指(鼠标)松开后设置 isMouseDown=fasle.将数组中的所有点绘制出来,清空 pointerArr 数组,然后比较连接的点的数量如果小于 6(自己设置,一般密码 6 位以上)给一个密码长度不够的提示,清空 puts 数组,重新调用 init 方法初始化界面,如果大于等于 6 则密码设置成功。

//兼容移动触摸的事件写法var hastouch = "ontouchstart" in window ? true : false,    tapstart = hastouch ? "touchstart" : "mousedown",    tapmove = hastouch ? "touchmove" : "mousemove",    tapend = hastouch ? "touchend" : "mouseup";//绑定按下事件lockCnavs.addEventListener(tapstart, function(e) {    isMouseDown = true;    var x1 = hastouch        ? e.targetTouches[0].pageX        : e.clientX - canvas.offsetLeft;    var y1 = hastouch ? e.targetTouches[0].pageY : e.clientY - canvas.offsetTop;    drawLinePointer(x1, y1, true);});//移动时候,将经过的坐标点全部保存起来lockCnavs.addEventListener(tapmove, function(e) {    if (isMouseDown) {        var x1 = hastouch            ? e.targetTouches[0].pageX            : e.clientX - canvas.offsetLeft;        var y1 = hastouch            ? e.targetTouches[0].pageY            : e.clientY - canvas.offsetTop;        drawLinePointer(x1, y1, true);    }});//取消lockCnavs.addEventListener(tapend, function(e) {    drawLinePointer(0, 0, false);    isMouseDown = false;    pointerArr = [];    if (puts.length >= 6) {        alert("你的图案密码是: [   " + puts.join("    >   ") + "   ]");        if (unlockFlag) {            //解锁            unlock();        } else {            //设置解锁密码            settingUnlockPwd();        }    } else {        if (puts.length >= 1) {            alert("你的图案密码太简单了~~~");            init();        }    }    puts = [];});

实现解锁逻辑

通过上面几步的操作,九宫格解锁每一次绘图之后的数据和显示效果都有了,现在只需要在关键地方添加相应逻辑代码就可以了,这里主要介绍它的实现逻辑就不对代码做封装了。

相关代码

//设置解锁密码和解锁测试function settingUnlockPwd() {    if (pwd.length <= 0) {        pwd = puts;        init();        $("header").text("再次绘制解锁图案");    } else if (confirmPwd.length <= 0) {        confirmPwd = puts;    }    console.log(pwd + "  " + confirmPwd);    //笔记两次密码是否正确    if (pwd.length > 0 && confirmPwd.length > 0) {        if (compareArr(pwd, confirmPwd)) {            $("header").text("解锁图案绘制成功");            init();        } else {            $("header").text("两次绘制的解锁图案不一致");            init();            confirmPwd = [];        }    }}//解锁function unlock() {    console.log("解锁密码:" + puts + "  " + confirmPwd);    if (compareArr(puts, confirmPwd)) {        $("header").text("解锁成功!页面跳转中......");    } else {        $("header").text("解锁图案不正确!!!");        init();    }}$("footer").click(function() {    if ($(this).text() === "解锁") {        unlockFlag = true;        init();        $("header").text("绘制解锁图案");    }});//比较两个数组(Number)是否相等function compareArr(arr1, arr2) {    return arr1.toString() === arr2.toString();}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 使用canvas怎么实现一个手势解锁功能

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

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

猜你喜欢
  • 使用canvas怎么实现一个手势解锁功能
    使用canvas怎么实现一个手势解锁功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。手势解锁通过手指将屏幕上的九个点依次连接起来形成一个图案,所以叫图案解锁。...
    99+
    2023-06-09
  • 使用Canvas怎么实现一个手势控制功能
    使用Canvas怎么实现一个手势控制功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先讲一下思路:首先跟图需求可以知道,作出这样的效果需要一组对象,每个对象有颜色,所占...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现手势解锁
    怎么在html5中使用canvas实现手势解锁?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。demo.html<!DOCTYPE html><h...
    99+
    2023-06-09
  • 使用canvas怎么实现一个滤镜功能
    使用canvas怎么实现一个滤镜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 了解 canvas?1.1 什么是 canvas?这个 HTML 元素是为...
    99+
    2023-06-09
  • 使用canvas怎么实现一个拼图功能
    使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后...
    99+
    2023-06-09
  • 使用canvas怎么实现一个放大镜功能
    使用canvas怎么实现一个放大镜功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 1. 什么是离屏技术?canvas 学习和滤镜实现 介绍过 drawImage ...
    99+
    2023-06-09
  • canvas如何实现手机的手势解锁
    这篇文章给大家分享的是有关canvas如何实现手机的手势解锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:按照国际惯例,先放效果图1、js动态初始化Dom结构首先在index.html中添加基本样式bo...
    99+
    2023-06-09
  • 使用canvas怎么实现一个在线签名功能
    这期内容当中小编将会给大家带来有关使用canvas怎么实现一个在线签名功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是 Canvas?Canvas 是 HTML5 新增的元素,用于在网页上绘制图形...
    99+
    2023-06-09
  • 使用canvas怎么实现一个图片打码功能
    使用canvas怎么实现一个图片打码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先创建一个html文件, 并引入 vue 和 elelment-ui(注...
    99+
    2023-06-09
  • 使用canvas怎么实现一个图形验证码功能
    本篇文章给大家分享的是有关使用canvas怎么实现一个图形验证码功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。<!DOCTYPE html><h...
    99+
    2023-06-09
  • JS前端使用Canvas快速实现手势解锁特效
    目录前言Demo需要实现的功能初始化数据和页面渲染touchstart 手指开始触摸事件touchmove 监听手指滑动事件touchend 监听手指触摸结束事件页面滚动处理连接的两...
    99+
    2024-04-02
  • 怎么使用HTML5制作屏幕手势解锁功能
    这篇文章主要介绍怎么使用HTML5制作屏幕手势解锁功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现原理 利用HTML5的canvas,将解锁的圈圈划出,利用touch事件解锁这...
    99+
    2024-04-02
  • 使用socket.io 和canvas怎么实现一个共享画板功能
    这期内容当中小编将会给大家带来有关使用socket.io 和canvas怎么实现一个共享画板功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。git clone <reposit...
    99+
    2023-06-09
  • Android开发中怎么实现一个手势密码功能
    本篇文章为大家展示了Android开发中怎么实现一个手势密码功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果使用GestureOverlayView,在xml配置文件中使用Android.ge...
    99+
    2023-05-31
    android roi
  • 怎么在H5中使用canvas实现一个动态图形功能
    怎么在H5中使用canvas实现一个动态图形功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是动画?我们在绘制动画之前必须要弄清楚什么是动画,一个动画最起码需要哪些基...
    99+
    2023-06-09
  • 使用canvas怎么实现一个手写签名效果
    这期内容当中小编将会给大家带来有关使用canvas怎么实现一个手写签名效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HTML代码:<!--手写区-->   &...
    99+
    2023-06-09
  • 怎么在html5中利用canvas实现一个弹幕功能
    本篇文章为大家展示了怎么在html5中利用canvas实现一个弹幕功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(function () {   ...
    99+
    2023-06-09
  • 怎么在Android应用中实现一个图案解锁功能
    这期内容当中小编将会给大家带来有关怎么在Android应用中实现一个图案解锁功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最关健的就是那个自定义九宫格View,代码来自framework下:LockP...
    99+
    2023-05-31
    android roi
  • 怎么在Android应用中实现一个手势操作识别功能
    今天就跟大家聊聊有关怎么在Android应用中实现一个手势操作识别功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先,在Android系统中,每一次手势交互都会依照以下顺序执行。...
    99+
    2023-05-31
    android roi
  • 怎么在Android 应用中实现一个九宫格手势锁
    怎么在Android 应用中实现一个九宫格手势锁?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。主要的方法是重写View.onTouchEvent( Motion...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作