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

yizhihongxing

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

背景介绍

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

实现步骤

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

  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日

相关文章

  • js常用函数 不错

    当提到JavaScript编程语言时,函数是其中最重要的一部分。函数可以帮助你简化代码,提高代码的复用性。在JavaScript编程中,有很多种类型的函数,但有些函数是非常常见的,可以被广泛使用。在本文中,我将会介绍几种js常用函数,让你在编写代码时能够更加轻松自如。 1. 时间函数 时间函数在JavaScript开发中有着重要的作用,可以用来创建、解析和操…

    JavaScript 2023年5月27日
    00
  • JavaScript异步编程常见面试题汇总

    JavaScript异步编程常见面试题汇总 什么是异步编程? 异步编程是 JavaScript 中的一种编程模式,是指在执行某个操作时,不会阻塞后续代码的执行,而是通过回调函数或者 Promise 等方式在异步操作完成后再进行后续的处理。 常见的异步编程方式 回调函数 回调函数是异步编程中最基础也是最常见的方式。在一个异步操作完成后,通过调用传递给该异步操作…

    JavaScript 2023年6月11日
    00
  • JS产生随机数的几个用法详解

    JS 产生随机数的几个用法详解 在前端开发中,生成随机数是常见的需求。在 JavaScript 中,我们有很多不同的方式来生成随机数,接下来将详细介绍常见的几种方式。 1. Math.random()方法 Math.random() 方法是 JavaScript 中生成伪随机数的默认方法。可以使用以下代码来生成 0 至 1 之间的随机小数。 const ra…

    JavaScript 2023年5月28日
    00
  • JavaScript 自定义属性 data-*使用介绍

    JavaScript 自定义属性 data-*使用介绍 在 HTML5 中,我们可以使用自定义属性 data-* 来为 HTML 元素添加自定义属性,这些自定义属性可以用来存储任意类型的数据,也可以用 Javascript 来对其进行读写操作。 基本用法 语法格式如下: <element data-attributeName="value&q…

    JavaScript 2023年6月10日
    00
  • JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)

    JavaScript字符串对象fromCharCode方法入门实例 简介 fromCharCode()是JavaScript中字符串对象的一个方法,用来将Unicode编码转换成实际字符串。 语法 String.fromCharCode(num1, num2, …, numN) 参数 num1 – 必选参数,当前要被转换的Unicode编码值 (必须在0…

    JavaScript 2023年5月19日
    00
  • React组件化的一些额外知识点补充

    当使用 React 进行开发时,组件是其最核心的元素。React 的组件化使得代码的管理变得更加容易,部件所需的功能通过 props 和 state 在组件层次结构中传递。但作为一个前端开发者,你还需要了解React 组件化的一些额外知识点,才能更洽肤的开发React应用。 一、PropTypes 组件可以是其他组件的子组件,父组件通常需要向子组件传递 pr…

    JavaScript 2023年6月10日
    00
  • JS实现深拷贝的几种方法介绍

    JS实现深拷贝的几种方法介绍 在 JavaScript 编程过程中,我们经常需要用到对象的复制。有时候,我们需要的是深度拷贝,即在内存中完全克隆一个对象,使得被克隆对象之后的操作互不干扰。JS实现深拷贝的几种方法主要包括: 使用 JSON.parse 和 JSON.stringify 方法进行深拷贝 使用递归方法进行深拷贝 使用第三方库进行深拷贝 下面将对以…

    JavaScript 2023年5月27日
    00
  • 一文搞懂如何避免JavaScript内存泄漏

    一文搞懂如何避免JavaScript内存泄漏 什么是JavaScript内存泄漏 JavaScript 内存泄漏 ( memory leak ) 指在程序中因为疏忽或错误,导致已经不再需要使用的垃圾对象一直被占用,无法被及时回收释放。这将一直占用着计算机的内存资源,降低程序运行效率。 JavaScript内存泄漏的原因 JavaScript 内存泄漏产生的原…

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