逍遥手游网:为用户提供海量热门软件、游戏等手机资源下载服务!

装机必备热门标签玩游戏装软件BT游戏H5游戏看教程专题游戏盒子手机版

逍遥手游网

所在位置:首页 > 资讯教程 > 软件教程 >  > 详情

如何用微信小程序开发手势解锁?

文章来源:网络作者:情殇发布时间:2026-05-30 19:01:55

GM盒子
GM盒子(高返利版)
GM手游福利平台,免费送首充,上线送VIP,免费领元宝和代金券。
Ready

  对于如何微信小程序开发手势解锁?还不明白的朋友们,一起来看看小编为大家准备的这篇教程吧。

  整个功能基于canvas实现,首先添加画布组件,并设定样式

  

  

  

  bindtouchmove="onTouchMove" bindtouchend="onTouchEnd">

  

  .gesture-lock {

  margin: 100rpx auto;

  width: 300px;

  height: 300px;

  background-color: #ffffff;

  }
 手势解锁实现代码在gesture_lock.js中(完整源码地址见末尾)。

  初始化

  constructor(canvasid, context, cb, opt){

  this.touchPoints = [];

  this.checkPoints = [];

  this.canvasid = canvasid;

  this.ctx = context;

  this.width = opt && opt.width || 300; //画布长度

  this.height = opt && opt.height || 300; //画布宽度

  this.cycleNum = opt && opt.cycleNum || 3;

  this.radius = 0; //触摸点半径

  this.isParamOk = false;

  this.marge = this.margeCircle = 25; //触摸点及触摸点和画布边界间隔

  this.initColor = opt && opt.initColor || \'#C5C5C3\';

  this.checkColor = opt && opt.checkColor || \'#5AA9EC\';

  this.errorColor = opt && opt.errorColor || \'#e19984\';

  this.touchState = "unTouch";

  this.checkParam();

  this.lastCheckPoint = null;

  if (this.isParamOk) {

  // 计算触摸点的半径长度

  this.radius = (this.width - this.marge * 2 - (this.margeCircle * (this.cycleNum - 1))) / (this.cycleNum * 2)

  this.radius = Math.floor(this.radius);

  // 计算每个触摸点的圆心位置

  this.calCircleParams();

  }

  this.onEnd = cb; //滑动手势结束时的回调函数

  }

  主要设置一些参数,如canvas的长宽,canvas的context,手势锁的个数(3乘3, 4乘4),手势锁的颜色,手势滑动结束时的回调函数等。并计算出手势锁的半径。

  计算每个手势锁的圆心位置

  calCircleParams() {

  let n = this.cycleNum;

  let count = 0;

  for (let i = 0; i < n; i++) {

  for (let j = 0; j < n; j++){

  count++;

  let touchPoint = {

  x: this.marge + i * (this.radius * 2 + this.margeCircle) + this.radius,

  y: this.marge + j * (this.radius * 2 + this.margeCircle) + this.radius,

  index: count,

  check: "uncheck",

  }

  this.touchPoints.push(touchPoint)

  }

  }

  }
 绘制手势锁

  for (let i = 0; i < this.touchPoints.length; i++){

  this.drawCircle(this.touchPoints[i].x, this.touchPoints[i].y, this.radius, this.initColor)

  }

  this.ctx.draw(true);

  接下来就是识别用户的滑动行为,判断用户划过了哪些圆圈,进而识别出用户的手势。

  在touchstart和touchmove事件中检测触发并更新画布

  onTouchStart(e) {

  // 不识别多点触控

  if (e.touches.length > 1){

  this.touchState = "unTouch";

  return;

  }

  this.touchState = "startTouch";

  this.checkTouch(e);

  let point = {x:e.touches[0].x, y:e.touches[0].y};

  this.drawCanvas(this.checkColor, point);

  }

  onTouchMove(e) {

  if (e.touchState === "unTouch") {

  return;

  }

  if (e.touches.length > 1){

  this.touchState = "unTouch";

  return;

  }

  this.checkTouch(e);

  let point = {x:e.touches[0].x, y:e.touches[0].y};

  this.drawCanvas(this.checkColor, point);

  }

  检测用户是否划过某个圆圈

  checkTouch(e) {

  for (let i = 0; i < this.touchPoints.length; i++){

  let point = this.touchPoints[i];

  if (isPointInCycle(e.touches[0].x, e.touches[0].y, point.x, point.y, this.radius)) {

  if (point.check === \'uncheck\') {

  this.checkPoints.push(point);

  this.lastCheckPoint = point;

  }

  point.check = "check"

  return;

  }

  }

  }
 更新画布

  drawCanvas(color, point) {

  //每次更新之前先清空画布

  this.ctx.clearRect(0, 0, this.width, this.height);

  //使用不同颜色和形式绘制已触发和未触发的锁

  for (let i = 0; i < this.touchPoints.length; i++){

  let point = this.touchPoints[i];

  if (point.check === "check") {

  this.drawCircle(point.x, point.y, this.radius, color);

  this.drawCircleCentre(point.x, point.y, color);

  }

  else {

  this.drawCircle(this.touchPoints[i].x, this.touchPoints[i].y, this.radius, this.initColor)

  }

  }

  //绘制已识别锁之间的线段

  if (this.checkPoints.length > 1) {

  let lastPoint = this.checkPoints[0];

  for (let i = 1; i < this.checkPoints.length; i++) {

  this.drawLine(lastPoint, this.checkPoints[i], color);

  lastPoint = this.checkPoints[i];

  }

  }

  //绘制最后一个识别锁和当前触摸点之间的线段

  if (this.lastCheckPoint && point) {

  this.drawLine(this.lastCheckPoint, point, color);

  }

  this.ctx.draw(true);

  }
 当用户滑动结束时调用回调函数并传递识别出的手势

  onTouchEnd(e) {

  typeof this.onEnd === \'function\' && this.onEnd(this.checkPoints, false);

  }

  onTouchCancel(e) {

  typeof this.onEnd === \'function\' && this.onEnd(this.checkPoints, true);

  }
 重置和显示手势错误

  gestureError() {

  this.drawCanvas(this.errorColor)

  }

  reset() {

  for (let i = 0; i < this.touchPoints.length; i++) {

  this.touchPoints[i].check = \'uncheck\';

  }

  this.checkPoints = [];

  this.lastCheckPoint = null;

  this.drawCanvas(this.initColor);

  }
 如何调用

  在onload方法中创建lock对象并在用户触摸事件中调用相应方法

  onLoad: function () {

  var s = this;

  this.lock = new Lock("id-gesture-lock", wx.createCanvasContext("id-gesture-lock"), function(checkPoints, isCancel) {

  console.log(\'over\');

  s.lock.gestureError();

  setTimeout(function() {

  s.lock.reset();

  }, 1000);

  }, {width:300, height:300})

  this.lock.drawGestureLock();

  console.log(\'onLoad\')

  var that = this

  //调用应用实例的方法获取全局数据

  app.getUserInfo(function(userInfo){

  //更新数据

  that.setData({

  userInfo:userInfo

  })

  that.update()

  })

  },

  onTouchStart: function (e) {

  this.lock.onTouchStart(e);

  },

  onTouchMove: function (e) {

  this.lock.onTouchMove(e);

  },

  onTouchEnd: function (e) {

  this.lock.onTouchEnd(e);

  }

  以上就是如何用微信小程序开发手势解锁的全部内容了,大家都学会了吗?

End
复制本文链接资讯文章为逍遥手游网所有,未经允许不得转载。
热门游戏MORE+
相关资讯MORE+
最新录入
热门资讯
新游新品榜
手机游戏
休闲益智
赛车竞速
棋牌桌游
角色扮演
动作射击
体育竞技
经营养成
策略塔防
冒险解谜
音乐游戏
手游辅助
H5游戏
BT游戏
手机软件
社交聊天
系统工具
时尚购物
旅游出行
影音播放
生活实用
办公学习
资讯阅读
拍摄美化
游戏辅助
健康医疗
地图导航
小说漫画
安全防护
育儿亲子
手游下载
梦想三国之勇往直前0....
炼仙传说0.1折
不可思议的刀剑与魔法...
逍遥浪人
奇幻梦旅人
玄影0.1折
点击冒险之旅(0.1折特...
天神赵子龙0.1折
九州异兽记0.1折
龙魂魔法0.1折
装机软件
爱奇艺电脑版
Steam下载管家 2026最...
360游戏大厅
GoLink加速器
3DM驱动大师
夸克
豆包电脑版
360C盘扩容大师
360录屏
360极速浏览器
精选专题
手机游戏专题
手机软件专题
电脑软件专题
电脑游戏专题
游戏排行榜
手游排行榜
软件排行榜
BT排行榜
电脑软件排行榜
电脑游戏排行榜