微信小程序开发实战教程之手势解锁

微信小程序开发实战教程之手势解锁攻略

背景介绍

在微信小程序开发中,手势解锁是一个非常实用的功能,例如在支付页面上,用户需要输入手势密码才能完成支付等操作。本攻略将介绍如何实现手势解锁的功能及其相关实现步骤。

实现步骤

手势解锁的实现步骤如下:

  1. 绘制手势密码锁屏界面,可使用canvas标签绘制,使用wx.createCanvasContext方法获取canvas的上下文
  2. 在手势解锁界面中监听手指的触控事件,包括touchstarttouchmovetouchend等事件
  3. 根据绘制手指轨迹进行密码验证
  4. 保存密码,下次打开手势解锁页面时直接到密码验证

接下来我们依次实现上述四个步骤。

第一步:绘制手势密码锁屏界面

<canvas id="gestureLock" class="canvas"></canvas>
const ctx = wx.createCanvasContext('gestureLock');

/*绘制圆形*/
function drawRound(x, y, r, f) {
  ctx.beginPath();
  ctx.arc(x, y, r, 0, 2 * Math.PI, true);
  ctx.fillStyle = f;
  ctx.fill();
  ctx.closePath();
}

/*绘制线段*/
function drawLine(x1, y1, x2, y2) {
  ctx.beginPath();
  ctx.moveTo(x1, y1);
  ctx.lineTo(x2, y2);
  ctx.stroke();
  ctx.closePath();
}

Page({
  onLoad: function () {
    /*获取canvas的位置及大小*/
    const query = wx.createSelectorQuery();
    query.select('#gestureLock').boundingClientRect();
    query.exec(function (res) {
      const rect = res[0];
      const radius = rect.width / (3 + 4 * Math.sqrt(2)); // 计算圆半径
      const roundList = []; // 圆心坐标列表

      /*初始化圆心列表*/
      for (let i = 0; i < 9; i++) {
        const x = (i % 3 + 1) * rect.width / 4;
        const y = Math.floor(i / 3) * rect.width / 4 + rect.height / 5;
        roundList.push({ x, y });
      }

      /*绘制圆形*/
      roundList.forEach(function (round) {
        drawRound(round.x, round.y, radius, '#FFF');
      });
    });
  }
})

第二步:监听手指的触控事件

Page({
  data: {
    touchRoundList: [], // 触摸到的圆心列表
  },
  touchStart: function (e) {
    /*触摸开始*/
  },
  touchMove: function (e) {
    /*触摸移动*/
  },
  touchEnd: function (e) {
    /*触摸结束*/
  },
})

在以上代码中,我们定义了touchStarttouchMovetouchEnd方法,同时在页面data中定义了一个touchRoundList列表,用于保存当前触摸到的圆心点。在touchStart方法中,我们需要获取当前触摸点距离canvas左上角的相对坐标,然后判断当前触摸到的圆心点是否在列表中;在touchMove方法中,我们需要根据当前触摸到的点,绘制出当前手指移动轨迹;在touchEnd方法中,我们需要保存手势密码,并进行密码验证。

第三步:根据绘制手指轨迹进行密码验证

例如我们可以通过实现以下方法,根据手势轨迹计算当前手势密码是否正确:

function checkPassword(touchRoundList, passwordList) {
  if (touchRoundList.length !== passwordList.length) {
    return false;
  } else {
    for (let i = 0; i < passwordList.length; i++) {
      if (touchRoundList[i].index !== passwordList[i]) {
        return false;
      }
    }
    return true;
  }
}

第四步:保存密码,下次打开手势解锁页面时直接到密码验证

我们可以通过wx.setStorageSync方法将手势密码保存在本地缓存中,下次打开手势解锁页面时从本地缓存中读取手势密码。

/*保存密码*/
const passwordList = [1, 2, 3, 4, 5, 6];
wx.setStorageSync('passwordList', passwordList);

/*读取密码*/
const passwordList = wx.getStorageSync('passwordList');

示例说明

示例1 :绘制手势密码锁屏界面

我们可以通过绘制圆心列表实现手势密码锁屏界面,代码如下:

/*绘制圆形*/
function drawRound(x, y, r, f) {
  ctx.beginPath();
  ctx.arc(x, y, r, 0, 2 * Math.PI, true);
  ctx.fillStyle = f;
  ctx.fill();
  ctx.closePath();
}

/*绘制线段*/
function drawLine(x1, y1, x2, y2) {
  ctx.beginPath();
  ctx.moveTo(x1, y1);
  ctx.lineTo(x2, y2);
  ctx.stroke();
  ctx.closePath();
}

Page({
  onLoad: function () {
    /*获取canvas的位置及大小*/
    const query = wx.createSelectorQuery();
    query.select('#gestureLock').boundingClientRect();
    query.exec(function (res) {
      const rect = res[0];
      const radius = rect.width / (3 + 4 * Math.sqrt(2)); // 计算圆半径
      const roundList = []; // 圆心坐标列表

      /*初始化圆心列表*/
      for (let i = 0; i < 9; i++) {
        const x = (i % 3 + 1) * rect.width / 4;
        const y = Math.floor(i / 3) * rect.width / 4 + rect.height / 5;
        roundList.push({ x, y });
      }

      /*绘制圆形*/
      roundList.forEach(function (round) {
        drawRound(round.x, round.y, radius, '#FFF');
      });
    });
  }
})

示例2 :密码验证实现

我们在手势解锁结束事件中,调用以下方法实现手势密码验证:

function checkPassword(touchRoundList, passwordList) {
  if (touchRoundList.length !== passwordList.length) {
    return false;
  } else {
    for (let i = 0; i < passwordList.length; i++) {
      if (touchRoundList[i].index !== passwordList[i]) {
        return false;
      }
    }
    return true;
  }
}

Page({
  data: {
    touchRoundList: [], // 触摸到的圆心列表
  },
  touchEnd: function (e) {
    const touchRoundList = this.data.touchRoundList;
    const passwordList = wx.getStorageSync('passwordList');
    if (checkPassword(touchRoundList, passwordList)) {
      console.log('密码正确');
    } else {
      console.log('密码错误');
    }
  },
})

总结

本攻略介绍了微信小程序中手势解锁的通过绘制canvas以及根据绘制轨迹验证密码等方面的实现。在实际开发中,我们还需结合具体业务逻辑,完善手势解锁的实现细节,实现更加完备、高效和安全的手势解锁功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序开发实战教程之手势解锁 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 微信小程序实现课程选择器

    下面就来详细讲解一下“微信小程序实现课程选择器”的完整攻略。 1. 准备工作 在开始实现课程选择器之前,我们需要进行一些前置工作:1. 准备一台电脑,并安装好微信开发者工具。2. 在微信开发者工具中注册一个小程序账号,并创建一个小程序项目。3. 确定选择器的UI样式和功能。 2. 实现方法 下面我们将分为以下几个步骤来实现课程选择器:1. 在小程序项目根目录…

    JavaScript 2023年5月28日
    00
  • JavaScript插件化开发教程(五)

    JavaScript插件化开发教程(五)是关于模板的进一步讲解,主要包括以下部分: 一、模板引擎 1.1 什么是模板引擎 模板引擎是一种将数据和模板结合起来生成HTML文档的工具。在JavaScript插件开发中,模板引擎是一个非常重要的部分,在将数据渲染到HTML中时起到了至关重要的作用。 常见的模板引擎有:Handlebars、Mustache、ejs、…

    JavaScript 2023年5月18日
    00
  • JavaScript cookie与session的使用及区别深入探究

    JavaScript Cookie与Session的使用及区别深入探究 概述 Web开发中,常常需要在用户与服务器之间保持状态,以便实现个性化的体验。在前后端分离的现代Web开发中,我们往往会在JavaScript中使用Cookie或Session来实现状态保持。而Cookie和Session虽然实现的目的相同,但它们的细节和机制存在很大的差异。在本文中,我…

    JavaScript 2023年6月11日
    00
  • jsp/javascript打印九九乘法表代码

    关于JSP/Javascript打印九九乘法表代码的完整攻略,步骤如下: 步骤一:编写JSP页面 我们可以创建一个类似下面这样的JSP页面: <!DOCTYPE html> <html> <head> <title>九九乘法表</title> <meta charset="UTF-8…

    JavaScript 2023年5月28日
    00
  • js关闭浏览器窗口及检查浏览器关闭事件

    要实现JavaScript关闭浏览器窗口以及检查浏览器关闭事件,可以使用window.close()方法和window.onbeforeunload事件。 使用window.close()方法关闭浏览器窗口 使用window.close()方法可以轻易地关闭当前窗口或打开的窗口。但要注意,在现代浏览器中,该方法只能关闭由JavaScript打开的窗口,不能关…

    JavaScript 2023年6月11日
    00
  • JavaScript Window窗口对象属性和使用方法

    JavaScript Window窗口对象属性和使用方法 JavaScript中的Window对象是浏览器窗口的根对象,可以通过Window对象来获取和操作窗口的各种属性和方法。 获取窗口属性 Window.innerHeight和Window.innerWidth属性 Window.innerHeight属性和Window.innerWidth属性分别用于…

    JavaScript 2023年5月27日
    00
  • javascript数组去重方法分析

    一、问题背景 在前端开发中,我们经常需要对JavaScript数组进行去重操作,以便保证数据的一致性和完整性。那么JavaScript数组去重的方法有哪些呢?本文将对目前主流的JavaScript数组去重方法进行详细的分析和讲解。 二、方法分析 利用Set数据结构 Set是ES6中的一种数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。我们可以通…

    JavaScript 2023年6月11日
    00
  • JavaScript如何监测数组的变化

    JavaScript提供了一些方法来监测数组的变化,包括改变数组的方法、监测数组的方法以及对数组进行监听的方法,下面将分别进行详细讲解: 改变数组的方法 JavaScript提供了一些方法用于改变数组,这些方法有可能会改变数组的原始结构,从而影响到程序的正确性。因此,JavaScript也提供了一些-API-来监测数组的变化,以便我们能够及时发现程序中的问题…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部