Home  >  Article  >  Web Front-end  >  HTML5实现手势屏幕解锁

HTML5实现手势屏幕解锁

WBOY
WBOYOriginal
2016-05-17 09:07:311312browse
  效果展示


  实现原理
  利用HTML5的canvas,将解锁的圈圈划出,利用touch事件解锁这些圈圈,直接看代码。
  1. function createCircle() {// 创建解锁点的坐标,根据canvas的大小来平均分配半径

  2.         var n = chooseType;// 画出n*n的矩阵
  3.         lastPoint = [];
  4.         arr = [];
  5.         restPoint = [];
  6.         r = ctx.canvas.width / (2 + 4 * n);// 公式计算 半径和canvas的大小有关
  7.         for (var i = 0 ; i
  8.             for (var j = 0 ; j
  9.                 arr.push({
  10.                     x: j * 4 * r + 3 * r,
  11.                     y: i * 4 * r + 3 * r
  12.                 });
  13.                 restPoint.push({
  14.                     x: j * 4 * r + 3 * r,
  15.                     y: i * 4 * r + 3 * r
  16.                 });
  17.             }
  18.         }
  19.         //return arr;
  20.     }
复制代码

  canvas里的圆圈画好之后可以进行事件绑定
  1. function bindEvent() {
  2.         can.addEventListener("touchstart", function (e) {
  3.              var po = getPosition(e);
  4.              console.log(po);
  5.              for (var i = 0 ; i
  6.                 if (Math.abs(po.x - arr[i].x)

  7.                     touchFlag = true;
  8.                     drawPoint(arr[i].x,arr[i].y);
  9.                     lastPoint.push(arr[i]);
  10.                     restPoint.splice(i,1);
  11.                     break;
  12.                 }
  13.              }
  14.          }, false);
  15.          can.addEventListener("touchmove", function (e) {
  16.             if (touchFlag) {
  17.                 update(getPosition(e));
  18.             }
  19.          }, false);
  20.          can.addEventListener("touchend", function (e) {
  21.              if (touchFlag) {
  22.                  touchFlag = false;
  23.                  storePass(lastPoint);
  24.                  setTimeout(function(){

  25.                     init();
  26.                 }, 300);
  27.              }


  28.          }, false);
  29.     }
复制代码

  接着到了最关键的步骤绘制解锁路径逻辑,通过touchmove事件的不断触发,调用canvas的moveTo方法和lineTo方法来画出折现,同时判断是否达到我们所画的圈圈里面,其中lastPoint保存正确的圈圈路径,restPoint保存全部圈圈去除正确路径之后剩余的。 Update方法:
  1. function update(po) {// 核心变换方法在touchmove时候调用
  2.         ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);

  3.         for (var i = 0 ; i
  4.             drawCle(arr[i].x, arr[i].y);
  5.         }

  6.         drawPoint(lastPoint);// 每帧花轨迹
  7.         drawLine(po , lastPoint);// 每帧画圆心

  8.         for (var i = 0 ; i
  9.             if (Math.abs(po.x - restPoint[i].x)
  10.                 drawPoint(restPoint[i].x, restPoint[i].y);
  11.                 lastPoint.push(restPoint[i]);
  12.                 restPoint.splice(i, 1);
  13.                 break;
  14.             }
  15.         }

  16.     }
复制代码

  最后就是收尾工作,把路径里面的lastPoint保存的数组变成密码存在localstorage里面,之后就用来处理解锁验证逻辑了。
  1. function storePass(psw) {// touchend结束之后对密码和状态的处理
  2.         if (pswObj.step == 1) {
  3.             if (checkPass(pswObj.fpassword, psw)) {
  4.                 pswObj.step = 2;
  5.                 pswObj.spassword = psw;
  6.                 document.getElementById('title').innerHTML = '密码保存成功';
  7.                 drawStatusPoint('#2CFF26');
  8.                 window.localStorage.setItem('passwordx', JSON.stringify(pswObj.spassword));
  9.                 window.localStorage.setItem('chooseType', chooseType);
  10.             } else {
  11.                 document.getElementById('title').innerHTML = '两次不一致,重新输入';
  12.                 drawStatusPoint('red');
  13.                 delete pswObj.step;
  14.             }
  15.         } else if (pswObj.step == 2) {
  16.             if (checkPass(pswObj.spassword, psw)) {
  17.                 document.getElementById('title').innerHTML = '解锁成功';
  18.                 drawStatusPoint('#2CFF26');
  19.             } else {
  20.                 drawStatusPoint('red');
  21.                 document.getElementById('title').innerHTML = '解锁失败';
  22.             }
  23.         } else {
  24.             pswObj.step = 1;
  25.             pswObj.fpassword = psw;
  26.             document.getElementById('title').innerHTML = '再次输入';
  27.         }

  28.     }
复制代码

  解锁组件
  将这个HTML5解锁写成了一个组件,放在https://github.com/lvming6816077/H5lock

  转载自AlloyTeam:http://www.alloyteam.com/2015/07 ... u-shou-shi-jie-suo/

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn