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

简介: 原文:HTML5 Canvas简简单单实现手机九宫格手势密码解锁   早上花了一个半小时写了一个基于HTML Canvas的手势解锁,主要是为了好玩,可能以后会用到。 思路:根据配置计算出九个点的位置,存入一个数组,当然存入数组的顺序的索引是:    第一行:0   1  2    第二行...

 

早上花了一个半小时写了一个基于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>

 

目录
相关文章
|
21小时前
|
移动开发 HTML5
HTML5实现的手机验证抽奖领券效果源码
这是一款基于HTML5实现的手机验证抽奖领券效果源码。在输入框输入手机号码即可点击下方的按钮来进行抽奖游戏,中奖后还会弹出提示信息,是一款比较经典的抽奖游戏源码
17 9
|
1月前
|
Web App开发 移动开发 前端开发
html5 canvas五彩碎纸屑飘落动画特效
h5 canvas飘落纸片动画是一款实现五彩纸屑飘落的背景动画特效,基于canvas绘制的空中飘落的纸屑片动画特效,适用于网页动态背景效果代码。简单使用,欢迎下载!代码适用浏览器:搜狗、360、FireFox(建议)、Chrome、Safari、Opera、傲游、世界之窗,是一款不错的的特效插件,希望大家喜欢!
40 5
|
2月前
|
前端开发
基于canvas实现的彩色纸屑组成文字3d动画HTML源码
基于canvas实现的彩色纸屑组成文字3d动画HTML源码
31 0
基于canvas实现的彩色纸屑组成文字3d动画HTML源码
|
2月前
|
移动开发 前端开发 HTML5
HTML5 Canvas制作的粒子十秒倒计时源码
一段基于HTML5 Canvas制作的粒子爆炸,十秒数字倒计时,全屏倒计时动画效果,给人一种非常大气的视觉感
40 0
HTML5 Canvas制作的粒子十秒倒计时源码
|
2月前
|
移动开发 HTML5
HTML5熊猫弹跳手机小游戏源码
一款html5手机端小游戏源码,熊猫跳跃小游戏源码下载。熊猫脚底有弹簧,长按变化力度跳跃,计分游戏,html5手机熊猫也疯狂小游戏源代码。
52 5
|
2月前
|
移动开发 HTML5
HTML5实现手机端红包下落抢红包特效源码
HTML5实现手机端红包下落抢红包特效源码是一款手机移动端的抢红包小游戏源码下载。红包像下雪一样,点击抓我呀,可以抢红包,需要此款代码的朋友们可以前来下载使用。本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码。
50 4
|
2月前
|
前端开发 JavaScript
Canvas三维变化背景动画HTML源码
Canvas三维变化背景动画HTML源码
36 5
|
4月前
|
XML 移动开发 前端开发
HTML5 SVG和canvas的性能探讨
HTML5 中的 SVG(可缩放矢量图形)和 Canvas(画布)分别用于网页图形绘制。SVG 基于矢量图形,使用 XML 描述,适合静态或少量动态内容(如图标、图表),易于编辑且保持高分辨率;Canvas 则基于位图,通过 JavaScript 绘制,更适合快速更新大量图形的场景(如游戏、动态动画),但在复杂图形计算时可能遇到性能瓶颈。总体而言,SVG 适用于静态和少量动态内容,而 Canvas 更适合高频率更新和性能要求高的场景。
|
4月前
|
移动开发 前端开发 JavaScript
HTML5 Canvas详解及应用
HTML5 Canvas 允许通过 JavaScript 在网页上动态绘制图形、动画等视觉内容。首先在 HTML 中定义 `&lt;canvas&gt;` 元素,并通过 JavaScript 获取画布上下文进行绘制。常见方法包括绘制矩形、路径、圆形和文本,以及处理图像和创建动画效果。适用于游戏开发、数据可视化、图像编辑和动态图形展示等多种应用场景。需要注意性能优化、无状态绘制及自行处理事件等问题。
|
4月前
|
移动开发 前端开发 数据挖掘
用HTML5中的 画布(Canvas)在“圳品”信息系统网页上绘制显示饼图
用HTML5中的 画布(Canvas)在“圳品”信息系统网页上绘制显示饼图

热门文章

最新文章

下一篇
开通oss服务