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

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

背景介绍

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

实现步骤

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

  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日

相关文章

  • vue实现路由跳转动态title标题信息

    下面是vue实现路由跳转动态title标题信息的完整攻略: 使用vue-router管理路由 在vue中,我们可以使用vue-router管理路由,对应的npm包名为vue-router。使用vue-router能够方便的实现从页面跳转到另外一个页面,同时在页面跳转时可以动态修改页面的标题信息。具体步骤如下: 安装vue-router 在项目中使用vue-r…

    JavaScript 2023年6月11日
    00
  • javascript回调函数详解

    JavaScript回调函数详解 在 JavaScript 中,函数可以被传递给另外一个函数作为参数,这个被传递的函数就被称为“回调函数”。回调函数可以在被传递的函数执行完毕后被调用,用来处理结果数据或实现其他功能。回调函数是 JavaScript 中常用的编程技巧之一,它们可以简化代码结构、提高代码可读性和可维护性。 回调函数的使用 在 JavaScrip…

    JavaScript 2023年5月27日
    00
  • JS将时间秒转换成天小时分钟秒的字符串

    要将时间秒转换成天小时分钟秒的字符串,可以分别计算出总共的天数、小时数、分钟数和剩余的秒数,并将其拼接成字符串。 下面是一条完整的攻略: 步骤1:计算总共的天数 首先,我们可以将总的时间秒转换成天数,可以使用以下公式: var day = Math.floor(seconds / (3600 * 24)); 这里使用了 Math.floor() 方法来将结果…

    JavaScript 2023年5月27日
    00
  • 微信小程序实现历史搜索功能的全过程(h5同理)

    好的!微信小程序实现历史搜索功能的全过程可以分为以下几个步骤: 1. 提供搜索框和搜索按钮 首先,在小程序页面中提供搜索框和搜索按钮。可以使用<input>元素和<button>元素实现。 <!– 在 wxml 文件中 –> <view class="search-box"> <i…

    JavaScript 2023年6月11日
    00
  • JavaScript 文件加载与阻塞问题之性能优化案例详解

    以下是“JavaScript 文件加载与阻塞问题之性能优化案例详解”的完整攻略。 什么是JavaScript文件加载与阻塞问题? 当我们为网站添加JavaScript代码时,我们通常需要在 HTML 文件中使用<script>标签引入 JavaScript 文件。但是,如果 JavaScript 文件非常大,它们可能会阻止页面的加载和渲染,导致用…

    JavaScript 2023年5月27日
    00
  • JavaScript SetInterval与setTimeout使用方法详解

    JavaScript SetInterval与setTimeout使用方法详解 SetInterval 语法 setInterval(function, delay, param1, param2, …) 参数 function:必需。要调用的函数或代码串。 delay:必需。该函数调用之间的时间间隔(以毫秒计)。 param1、param2和更多参数:…

    JavaScript 2023年6月10日
    00
  • JavaScript搜索字符串并将搜索结果返回到字符串的方法

    搜索字符串并将搜索结果返回到字符串有几种方法,下面我将介绍其中两种方法。 方法一:indexOf()方法 indexOf()方法可以在一个字符串中查找指定的文本,并返回首次出现的位置。如果没有找到指定文本,则返回-1。我们可以使用它来搜索字符串。下面是一个示例: const str = ‘Hello, World!’; const searchStr = ‘…

    JavaScript 2023年5月28日
    00
  • javascript中replace使用方法总结

    JavaScript中replace使用方法总结 replace()方法是JavaScript中字符串对象的一个常用方法,其作用是在字符串中搜索指定的子字符串或者正则表达式,并将其替换为新的子字符串。在本篇文章中,我们将对replace()方法进行详细的讲解和总结。 基本使用 replace()方法的基本语法如下: string.replace(search…

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