HTML5 Canvas简简单单实现手机九宫格手势密码解锁

原文:HTML5 Canvas简简单单实现手机九宫格手势密码解锁

早上花了一个半小时写了一个基于HTML Canvas的手势解锁,主要是为了好玩,可能以后会用到。

思路:根据配置计算出九个点的位置,存入一个数组,当然存入数组的顺序的索引是:

   第一行:0   1  2    第二行:3  4  5   第三行:6  7  8

然后就根据这个坐标数组去绘制九个点

再则我们需要一个保存选中点的数组,每当touchmove事件就判断当前触摸点和那个点的距离小于圆的半径

    如果为真的话 那么就添加进入选中点的数组

    在绘制过程中就根据该数据去绘制线条。就这么简单

上代码:(需要chrome浏览器或者火狐浏览器 模拟手机状态才有触摸效果)

  1 <!DOCTYPE html>
  2 <html>
  3 <head lang="en">
  4     <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
  5           name="viewport"/>
  6     <meta charset="UTF-8">
  7     <title></title>
  8     <style type="text/css">
  9         html, body {
 10             margin: 0;
 11             padding: 0;
 12             width: 100%;
 13             height: 100%;
 14         }
 15     </style>
 16     <script type="text/javascript">
 17         var R = 26, CW = 400, CH = 320, OffsetX = 30, OffsetY = 30;
 18         function CaculateNinePointLotion(diffX, diffY) {
 19             var Re = [];
 20             for (var row = 0; row < 3; row++) {
 21                 for (var col = 0; col < 3; col++) {
 22                     var Point = {
 23                         X: (OffsetX + col * diffX + ( col * 2 + 1) * R),
 24                         Y: (OffsetY + row * diffY + (row * 2 + 1) * R)
 25                     };
 26                     Re.push(Point);
 27                 }
 28             }
 29             return Re;
 30         }
 31         var PointLocationArr = [];
 32         window.onload = function () {
 33             var c = document.getElementById("myCanvas");
 34             CW = document.body.offsetWidth;
 35             c.width = CW;
 36             c.height = CH;
 37             var cxt = c.getContext("2d");
 38             //两个圆之间的外距离 就是说两个圆心的距离去除两个半径
 39             var X = (CW - 2 * OffsetX - R * 2 * 3) / 2;
 40             var Y = (CH - 2 * OffsetY - R * 2 * 3) / 2;
 41             PointLocationArr = CaculateNinePointLotion(X, Y);
 42             InitEvent(c, cxt);
 43             //CW=2*offsetX+R*2*3+2*X
 44             Draw(cxt, PointLocationArr, [],null);
 45         }
 46         function Draw(cxt, _PointLocationArr, _LinePointArr,touchPoint) {
 47             if (_LinePointArr.length > 0) {
 48                 cxt.beginPath();
 49                 for (var i = 0; i < _LinePointArr.length; i++) {
 50                     var pointIndex = _LinePointArr[i];
 51                     cxt.lineTo(_PointLocationArr[pointIndex].X, _PointLocationArr[pointIndex].Y);
 52                 }
 53                 cxt.lineWidth = 10;
 54                 cxt.strokeStyle = "#627eed";
 55                 cxt.stroke();
 56                 cxt.closePath();
 57                 if(touchPoint!=null)
 58                 {
 59                     var lastPointIndex=_LinePointArr[_LinePointArr.length-1];
 60                     var lastPoint=_PointLocationArr[lastPointIndex];
 61                     cxt.beginPath();
 62                     cxt.moveTo(lastPoint.X,lastPoint.Y);
 63                     cxt.lineTo(touchPoint.X,touchPoint.Y);
 64                     cxt.stroke();
 65                     cxt.closePath();
 66                 }
 67             }
 68             for (var i = 0; i < _PointLocationArr.length; i++) {
 69                 var Point = _PointLocationArr[i];
 70                 cxt.fillStyle = "#627eed";
 71                 cxt.beginPath();
 72                 cxt.arc(Point.X, Point.Y, R, 0, Math.PI * 2, true);
 73                 cxt.closePath();
 74                 cxt.fill();
 75                 cxt.fillStyle = "#ffffff";
 76                 cxt.beginPath();
 77                 cxt.arc(Point.X, Point.Y, R - 3, 0, Math.PI * 2, true);
 78                 cxt.closePath();
 79                 cxt.fill();
 80                 if(_LinePointArr.indexOf(i)>=0)
 81                 {
 82                     cxt.fillStyle = "#627eed";
 83                     cxt.beginPath();
 84                     cxt.arc(Point.X, Point.Y, R -16, 0, Math.PI * 2, true);
 85                     cxt.closePath();
 86                     cxt.fill();
 87                 }
 88
 89             }
 90         }
 91         function IsPointSelect(touches,LinePoint)
 92         {
 93             for (var i = 0; i < PointLocationArr.length; i++) {
 94                 var currentPoint = PointLocationArr[i];
 95                 var xdiff = Math.abs(currentPoint.X - touches.pageX);
 96                 var ydiff = Math.abs(currentPoint.Y - touches.pageY);
 97                 var dir = Math.pow((xdiff * xdiff + ydiff * ydiff), 0.5);
 98                 if (dir < R ) {
 99                     if(LinePoint.indexOf(i) < 0){ LinePoint.push(i);}
100                     break;
101                 }
102             }
103         }
104         function InitEvent(canvasContainer, cxt) {
105             var LinePoint = [];
106             canvasContainer.addEventListener("touchstart", function (e) {
107                 IsPointSelect(e.touches[0],LinePoint);
108             }, false);
109             canvasContainer.addEventListener("touchmove", function (e) {
110                 e.preventDefault();
111                 var touches = e.touches[0];
112                 IsPointSelect(touches,LinePoint);
113                 cxt.clearRect(0,0,CW,CH);
114                 Draw(cxt,PointLocationArr,LinePoint,{X:touches.pageX,Y:touches.pageY});
115             }, false);
116             canvasContainer.addEventListener("touchend", function (e) {
117                 cxt.clearRect(0,0,CW,CH);
118                 Draw(cxt,PointLocationArr,LinePoint,null);
119                 alert("密码结果是:"+LinePoint.join("->"));
120                 LinePoint=[];
121             }, false);
122         }
123     </script>
124 </head>
125 <body>
126 <canvas id="myCanvas"></canvas>
127 </body>
128 </html>
时间: 2024-12-26 20:41:42

HTML5 Canvas简简单单实现手机九宫格手势密码解锁的相关文章

Swift 简简单单实现手机九宫格手势密码解锁

大家可以看到我之前的文章[HTML5 Canvas简简单单实现手机九宫格手势密码解锁] 本文是使用苹果语言对其进行了移植 颜色配色是拾取的支付宝的颜色 本文的目的说明:语言是想通的  只要思路在 语言只是手段而已 这是本人自学swift一个礼拜 然后花了三个小时写出来的肯定会有不规范的地方 因为思路比较简单 大家可以参考 javascript 版本 废话不多说先上效果 (对了 大家如果能在转载的地方注明出处的话 那就是极好的 http://www.cnblogs.com/zzzzz/p/swif

[优化]Swift 简简单单实现手机九宫格手势密码 解锁

我去 为毛这篇文章会被移除首页 技术含量还是有点的   如果在此被移除  那就果断离开园子了 之前的文章 Swift 简简单单实现手机九宫格手势密码解锁 1.对之前的绘制线条的方法进行优化 之前是遍历选中点的集合分别的在点之间绘制线条 改进之后使用系统的API一口气将线条绘制出来 2.增加密码错误情况下想某宝一样红色提示和三角形状的路线指示如下图所示 3.遇到的难点主要是三角形的绘制 和 旋转角度的功能 原理就不多说了 真相见代码 转载需要注明出处 http://www.cnblogs.com/

九宫格手势密码

公司项目中需要做一个手势密码,效果如图: 上面小的手势图与下面大的联动,效果: 由于没有合用的第三方,就只好自己写了一个,根据需求,下面的每连上一个点就需要通知上方小密码盘,做相应改变,并且绘制完成后,需要获取手势密码的内容,所以设计了如下接口: public interface GesturesPasswordListener { /** * * @param list 绘制完成的密码 */ void getGesturesPassword(List<Integer> list); /**

HTML5+Canvas+jQuery调用手机拍照功能实现图片上传(二)

上一篇只讲到前台操作,这篇专门涉及到Java后台处理,前台通过Ajax提交将Base64编码过的图片数据信息传到Java后台,然后Java这边进行接收处理,通过对图片数据信息进行Base64解码,之后使用流将图片数据信息上传至服务器进行保存,并且将图片的路径地址存进数据库.ok,废话不多说了,直接贴代码吧. 1.前台js代码: $.ajax({ async:false,//是否异步 cache:false,//是否使用缓存 type: "POST", data:{fileData:fi

Html5实现手机九宫格密码解锁功能

HTML5真的是很强大,前端时间看到一个canvas实现九宫格的密码解锁.今天抽出时间模仿了一个,特定分享一下! 效果截图如下: 效果看起来还不错吧! 源码如下: <!DOCTYPE html> <html> <head lang="zh-CN"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"

Appnium+python实现手势密码为什么总是报错

最近一直在尝试Appnium实现Android手机自动化测试,一直一直卡在一个点上,那就是手势密码,因为所测应用的手势密码使用的不是单个的imageview实现的手势密码解锁窗,所以只能靠坐标点来定位.在网上看到的资料,使用python写的解锁手势密码的Appnium代码如下形式: 1 action = TouchAction(driver) 2 unlock = action.press(x=240, y=915).wait(ms=100)3 .move_to(x=480, y=0).wait

支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)

/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: [email protected] */ 背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物.消费已是人们不可或缺的一个生活习惯了.随着这股浪潮的兴起,安全.便捷的移动支付需求也越来越大.因此,各大互联网公司纷纷推出了其移动支付平台.其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了.就我而言,平时和同事一起出去AA吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了. 正所谓树大招风,移动支付

[转载]支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)

/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: [email protected] */ 背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物.消费已是人们不可或缺的一个生活习惯了.随着这股浪潮的兴起,安全.便捷的移动支付需求也越来越大.因此,各大互联网公司纷纷推出了其移动支付平台.其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了.就我而言,平时和同事一起出去AA吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了. 正所谓树大招风,移动支付

H5移动端手势密码组件

项目简介 最近参加了2017年360前端星计划,完成了一个有趣的UI组件开发大作业,借机和大家分享一下移动端开发的技术啦~~ 本项目采用原生JS和Canvas实现移动端手势密码组件,支持手势密码设置和验证. 先加星后看,年薪百万!欢迎大家关注我的github,互相学习~~      demo演示地址:http://tangzhirong.github.io/lock/example/demo.html      项目github地址:https://github.com/tangzhirong/