ホームページ >WeChat アプレット >ミニプログラム開発 >WeChat ミニプログラム開発におけるジェスチャーロック解除の概要
ジェスチャーによるロック解除はアプリの一般的なロック解除方法であり、パスワードを入力するよりも操作がはるかに便利です。この記事では主に WeChat アプレット開発チュートリアル - ジェスチャーロック解除の例を紹介します。興味のある方は学習してください。
ジェスチャーによるロック解除はアプリの一般的なロック解除方法であり、パスワードを入力するよりも操作がはるかに便利です。以下に、WeChat アプレットに基づいて電話のロックを解除する方法を示します。最終的な実装効果は次のとおりです。
関数全体は、最初にキャンバス コンポーネントを追加し、スタイルを設定します
<!--index.wxml--> <view class="container"> <canvas canvas-id="id-gesture-lock" class="gesture-lock" bindtouchstart="onTouchStart" bindtouchmove="onTouchMove" bindtouchend="onTouchEnd"></canvas> </view>
.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; //滑动手势结束时的回调函数 }
主に、キャンバスの長さと幅、キャンバスのコンテキスト、ジェスチャーロックの数(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); }
呼び出し方法
作成年onload メソッドはオブジェクトをロックし、ユーザー タッチ イベントで対応するメソッドを呼び出します
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); }
以上がこの記事の全内容です。その他の関連コンテンツについては、ご注目ください。 PHP中国語ウェブサイトへ!
関連する推奨事項:
WeChatミニプログラムのXiaodouban Booksの紹介
WeChatミニプログラムリストのプルアップロードとプルダウンリフレッシュの実装
以上がWeChat ミニプログラム開発におけるジェスチャーロック解除の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。