手机屏幕解锁

实现原理

  利用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. }
时间: 2024-10-10 20:24:22

手机屏幕解锁的相关文章

android 手机屏幕解锁最多有多少种?

  这个十分有趣的题目出自知乎http://www.zhihu.com/question/24905007/answer/29414497 ,排名第一的知友的答案用python简洁的给出了代码和答案,枉费我用C++ 鼓捣了半天... 不过也不能算是白做,还是有颇多收获的. 先准确描述一下这个问题解决思路: 这题目本质就是计算排列: 定义一个函数 permutation(n.m) :从n个数中选m个进行全排列 我们要计算的就是        1. Σ permutation(9,i) (i从1到9

全局监听SCREEN_ON和SCREEN_OFF的替代方法--监听屏幕解锁事件

在做一个程序的时候,需要时刻保持某一服务是启动的,因此想到了通过监听屏幕SCREEN_ON和SCREEN_OFF这两个action.奇怪的是,这两个action只能通过代码的形式注册,才能被监听到,使用AndroidManifest.xml 完全监听不到.查了一下,发现这是PowerManager那边在发这个广播的时候,做了限制,限制只能有register到代码中的receiver才能接收. view plain private void registerScreenActionReceiver

Android Loader使用,屏幕解锁,重复荷载

正在使用AsyncTaskLoader时间.当手机被解锁,重复加载数据,码,如以下: static class CouponShopQueryLoader extends AsyncTaskLoader<List<CouponStore>> { private int couponId; public CouponShopQueryLoader(Context context, int couponId) { super(context); this.couponId = coup

移动页面HTML5自适应手机屏幕宽度

网上关于这方面的文章有很多,重复的东西本文不再赘述,仅提供思路,并解释一些其他文章讲述模糊的地方. 1.使用meta标签,这也是普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统. 首先解释该标签的含义: <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, max

firemonkey 手机屏幕自适应程序问题

我是新手.在我才学了2个星期的时候,那个白痴老板说什么手机屏幕自适应程序,我当时不能理解呀,觉得用Delphi的布局设计不就行了吗.结果他说:我就是想让控件内容什么的放在小屏幕手机上也不出来.我就说,那用布局layout.结果那个傻x又是画控件关于屏幕的位置,又是记录控件的位置,整了一大套.整个把我给整晕了,新手伤不起啊,我不知道Delphi xe5有一个控件布局叫ScaledLayout,结果捣鼓了很长时间.我在Delphi交流群里说这个功能时,大家都说我想多了.唉 ,没办法自己又把控件布局什

安卓手机屏幕投射到电脑以及一台电脑控制多台手机技术原理浅析

奥创软件研究院推出的奥创微群控让越来越多的人了解到了电脑控制手机的操作.自奥创软件研究院首家发布电脑批量控制手机的解决方案以来,有很多人开始探讨电脑控制手机技术在实际工作中的应用. 由于市场太大,仅靠奥创软件研究院一家也是做不过来的,现在将手机屏幕投射到到电脑的技术原理,以及一台电脑批量控制多台手机的技术(即所谓的手机反响控制)简单的给大家介绍下,在此抛砖引玉,希望能给大家一些思路上的指导. 说到安卓手机的屏幕投射,就不得不说安卓的adb,ADB的全称为Android Debug Bridge这

Android手机屏幕投射到电脑神器Vysor

做android开发的,经常要把手机屏幕投射到电脑,用来演示.普遍的解决方案是360或者豌豆荚的演示功能,缺点是延迟非常厉害,大概有3秒左右,非常影响演示效果.以下介绍Vysor,几乎0延迟,能与手机画面同步 Vysor是chrome浏览器的应用,因此先要下载原版的chrome,并且还要使用chrome应用商店,如何fq使用应用商店大家可以百度 软件打开后是这么个样子 PS:win10要安装最新的ADB驱动,软件界面下方有提供下载链接 然后是手机的准备,首先,开启usb调试模式 然后用usb线把

webapp开发——‘手机屏幕分辨率’与‘浏览器分辨率’不要混淆

关于webApp响应式设计遇到的问题,分享给大家,最近在做一个手机webApp,因为我手机是”米3“,屏幕截图大小是1080宽,所以css样式用@media screen and(min-width:1080px){  …… },来判断屏幕最小宽度是1080px的手机web显示什么样的样式,结果却不能正常显示我所指定的css样式,最后在网上查了一下,发现分辨率的范围不对. css代码如下: @media screen and (min-width:1080px){ ...............

Android Screen Monitor同步手机屏幕到PC

有时候我们需要在PC上显示真机的屏幕,Android的ADM只能静态的监听一桢图像,所以在Google Code上,Google提供了一个Android Screen Monitor工具来实时显示手机屏幕: http://code.google.com/p/android-screen-monitor/   点击打开链接 介于大部分的朋友无法翻墙,这里提供下CSDN的下载链接 点击打开 System Requirements Ver.2.00 - 2.50 JRE(JDK) 5 or 6 and