zoukankan      html  css  js  c++  java
  • HTML5实现手势屏幕解锁

    详细内容请点击

    效果展示

     
      实现原理
     
      利用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 < n ; i++) {
    8.             for (var j = 0 ; j < n ; 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 < arr.length ; i++) {
    6.                 if (Math.abs(po.x - arr[i].x) < r && Math.abs(po.y - arr[i].y) < r) { // 用来判断起始点是否在圈圈内部
    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 < arr.length ; i++) { // 每帧先把面板画出来
    4.             drawCle(arr[i].x, arr[i].y);
    5.         }
    6.         drawPoint(lastPoint);// 每帧花轨迹
    7.         drawLine(po , lastPoint);// 每帧画圆心
    8.         for (var i = 0 ; i < restPoint.length ; i++) {
    9.             if (Math.abs(po.x - restPoint[i].x) < r && Math.abs(po.y - restPoint[i].y) < r) {
    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/
     

    更多html5内容请点击

  • 相关阅读:
    8.14-T1村通网(pupil)
    8.10-Day2T3 镇守府
    8.10-Day2T2 吃喝大法好
    8.10-Day2T1最小值
    8.10-DayT3游走(wander)
    8.10-Day1T2圈(circle)
    8.10-Day1T1-数字(number)
    bzoj2462: [BeiJing2011]矩阵模板
    8.7-Day1T1
    k8s高可用部署后续:SLB
  • 原文地址:https://www.cnblogs.com/j--d/p/html_css.html
Copyright © 2011-2022 走看看