手勢(shì)解鎖是app上常見(jiàn)的解鎖方式,相比輸入密碼方式操作起來(lái)要方便許多。下面展示如何基于微信小程序?qū)崿F(xiàn)手機(jī)解鎖。最終實(shí)現(xiàn)效果如下圖:
手勢(shì)解鎖
整個(gè)功能基于canvas實(shí)現(xiàn),首先添加畫(huà)布組件,并設(shè)定樣式
<!--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; }
手勢(shì)解鎖實(shí)現(xiàn)代碼在gesture_lock.js中(完整源碼地址見(jiàn)末尾)。
初始化
constructor(canvasid, context, cb, opt){ this.touchPoints = []; this.checkPoints = []; this.canvasid = canvasid; this.ctx = context; this.width = opt && opt.width || 300; //畫(huà)布長(zhǎng)度 this.height = opt && opt.height || 300; //畫(huà)布寬度 this.cycleNum = opt && opt.cycleNum || 3; this.radius = 0; //觸摸點(diǎn)半徑 this.isParamOk = false; this.marge = this.margeCircle = 25; //觸摸點(diǎn)及觸摸點(diǎn)和畫(huà)布邊界間隔 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) { // 計(jì)算觸摸點(diǎn)的半徑長(zhǎng)度 this.radius = (this.width - this.marge * 2 - (this.margeCircle * (this.cycleNum - 1))) / (this.cycleNum * 2) this.radius = Math.floor(this.radius); // 計(jì)算每個(gè)觸摸點(diǎn)的圓心位置 this.calCircleParams(); } this.onEnd = cb; //滑動(dòng)手勢(shì)結(jié)束時(shí)的回調(diào)函數(shù) }
主要設(shè)置一些參數(shù),如canvas的長(zhǎng)寬,canvas的context,手勢(shì)鎖的個(gè)數(shù)(3乘3, 4乘4),手勢(shì)鎖的顏色,手勢(shì)滑動(dòng)結(jié)束時(shí)的回調(diào)函數(shù)等。并計(jì)算出手勢(shì)鎖的半徑。
計(jì)算每個(gè)手勢(shì)鎖的圓心位置
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) } } }
繪制手勢(shì)鎖
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);
接下來(lái)就是識(shí)別用戶的滑動(dòng)行為,判斷用戶劃過(guò)了哪些圓圈,進(jìn)而識(shí)別出用戶的手勢(shì)。
在touchstart
和touchmove
事件中檢測(cè)觸發(fā)并更新畫(huà)布
<p style="margin-bottom: 7px; margin-top: 14px;"> onTouchStart(e) {<br/> // 不識(shí)別多點(diǎn)觸控<br/> if (e.touches.length > 1){<br/> this.touchState = "unTouch";<br/> return;<br/> }<br/> this.touchState = "startTouch";<br/> this.checkTouch(e);<br/> let point = {x:e.touches[0].x, y:e.touches[0].y};<br/> this.drawCanvas(this.checkColor, point);<br/> }<br/><br/> onTouchMove(e) {<br/> if (e.touchState === "unTouch") {<br/> return;<br/> }<br/> if (e.touches.length > 1){<br/> this.touchState = "unTouch";<br/> return;<br/> }<br/> this.checkTouch(e);<br/> let point = {x:e.touches[0].x, y:e.touches[0].y};<br/> this.drawCanvas(this.checkColor, point);<br/> }<br/></p>
檢測(cè)用戶是否劃過(guò)某個(gè)圓圈
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; } } }
更新畫(huà)布
drawCanvas(color, point) { //每次更新之前先清空畫(huà)布 this.ctx.clearRect(0, 0, this.width, this.height); //使用不同顏色和形式繪制已觸發(fā)和未觸發(fā)的鎖 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) } } //繪制已識(shí)別鎖之間的線段 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]; } } //繪制最后一個(gè)識(shí)別鎖和當(dāng)前觸摸點(diǎn)之間的線段 if (this.lastCheckPoint && point) { this.drawLine(this.lastCheckPoint, point, color); } this.ctx.draw(true); }
當(dāng)用戶滑動(dòng)結(jié)束時(shí)調(diào)用回調(diào)函數(shù)并傳遞識(shí)別出的手勢(shì)
onTouchEnd(e) { typeof this.onEnd === 'function' && this.onEnd(this.checkPoints, false); } onTouchCancel(e) { typeof this.onEnd === 'function' && this.onEnd(this.checkPoints, true); }
重置和顯示手勢(shì)錯(cuò)誤
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); }
如何調(diào)用
在onload方法中創(chuàng)建lock對(duì)象并在用戶觸摸事件中調(diào)用相應(yīng)方法
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 //調(diào)用應(yīng)用實(shí)例的方法獲取全局?jǐn)?shù)據(jù) app.getUserInfo(function(userInfo){ //更新數(shù)據(jù) 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); }
以上是微信小程序開(kāi)發(fā)之手勢(shì)解鎖代碼實(shí)例的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

PHP是一種開(kāi)源的腳本語(yǔ)言,廣泛應(yīng)用于Web開(kāi)發(fā)和服務(wù)器端編程,尤其在微信開(kāi)發(fā)中得到了廣泛的應(yīng)用。如今,越來(lái)越多的企業(yè)和開(kāi)發(fā)者開(kāi)始使用PHP進(jìn)行微信開(kāi)發(fā),因?yàn)樗蔀榱艘豢钫嬲囊讓W(xué)易用的開(kāi)發(fā)語(yǔ)言。在微信開(kāi)發(fā)中,消息的加密和解密是一個(gè)非常重要的問(wèn)題,因?yàn)樗鼈兩婕暗綌?shù)據(jù)的安全性。對(duì)于沒(méi)有加密和解密方式的消息,黑客可以輕松獲取到其中的數(shù)據(jù),對(duì)用戶造成威脅

在微信公眾號(hào)開(kāi)發(fā)中,投票功能經(jīng)常被運(yùn)用。投票功能是讓用戶快速參與互動(dòng)的好方式,也是舉辦活動(dòng)和調(diào)查意見(jiàn)的重要工具。本文將為您介紹如何使用PHP實(shí)現(xiàn)微信投票功能。獲取微信公眾號(hào)授權(quán)首先,你需要獲取微信公眾號(hào)的授權(quán)。在微信公眾平臺(tái)上,你需要配置微信公眾號(hào)的api地址、官方賬號(hào)和公眾號(hào)對(duì)應(yīng)的token。在我們使用PHP語(yǔ)言開(kāi)發(fā)的過(guò)程中,我們需要使用微信官方提供的PH

隨著微信的普及,越來(lái)越多的企業(yè)開(kāi)始將其作為營(yíng)銷工具。而微信群發(fā)功能,則是企業(yè)進(jìn)行微信營(yíng)銷的重要手段之一。但是,如果只依靠手動(dòng)發(fā)送,對(duì)于營(yíng)銷人員來(lái)說(shuō)是一件極為費(fèi)時(shí)費(fèi)力的工作。所以,開(kāi)發(fā)一款微信群發(fā)工具就顯得尤為重要。本文將介紹如何使用PHP開(kāi)發(fā)微信群發(fā)工具。一、準(zhǔn)備工作開(kāi)發(fā)微信群發(fā)工具,我們需要掌握以下幾個(gè)技術(shù)點(diǎn):PHP基礎(chǔ)知識(shí)微信公眾平臺(tái)開(kāi)發(fā)開(kāi)發(fā)工具:Sub

微信是目前全球用戶規(guī)模最大的社交平臺(tái)之一,隨著移動(dòng)互聯(lián)網(wǎng)的普及,越來(lái)越多的企業(yè)開(kāi)始意識(shí)到微信營(yíng)銷的重要性。在進(jìn)行微信營(yíng)銷時(shí),客服服務(wù)是至關(guān)重要的一環(huán)。為了更好地管理客服聊天窗口,我們可以借助PHP語(yǔ)言進(jìn)行微信開(kāi)發(fā)。一、PHP微信開(kāi)發(fā)簡(jiǎn)介PHP是一種開(kāi)源的服務(wù)器端腳本語(yǔ)言,廣泛運(yùn)用于Web開(kāi)發(fā)領(lǐng)域。結(jié)合微信公眾平臺(tái)提供的開(kāi)發(fā)接口,我們可以使用PHP語(yǔ)言進(jìn)行微信

在微信公眾號(hào)開(kāi)發(fā)中,用戶標(biāo)簽管理是一個(gè)非常重要的功能,可以讓開(kāi)發(fā)者更好地了解和管理自己的用戶。本篇文章將介紹如何使用PHP實(shí)現(xiàn)微信用戶標(biāo)簽管理功能。一、獲取微信用戶openid在使用微信用戶標(biāo)簽管理功能之前,我們首先需要獲取用戶的openid。在微信公眾號(hào)開(kāi)發(fā)中,通過(guò)用戶授權(quán)的方式獲取openid是比較常見(jiàn)的做法。在用戶授權(quán)完成后,我們可以通過(guò)以下代碼獲取用

隨著微信成為了人們生活中越來(lái)越重要的一個(gè)通訊工具,其敏捷的消息傳遞功能迅速受到廣大企業(yè)和個(gè)人的青睞。對(duì)于企業(yè)而言,將微信發(fā)展為一個(gè)營(yíng)銷平臺(tái)已經(jīng)成為趨勢(shì),而微信開(kāi)發(fā)的重要性也逐漸凸顯。在其中,群發(fā)功能更是被廣泛使用,那么,作為PHP程序員,如何實(shí)現(xiàn)群發(fā)消息發(fā)送記錄呢?下面將為大家簡(jiǎn)單介紹一下。1.了解微信公眾號(hào)相關(guān)開(kāi)發(fā)知識(shí)在了解如何實(shí)現(xiàn)群發(fā)消息發(fā)送記錄之前,我

如何使用PHP實(shí)現(xiàn)微信公眾號(hào)開(kāi)發(fā)微信公眾號(hào)已經(jīng)成為了很多企業(yè)推廣和互動(dòng)的重要渠道,而PHP作為一種常用的Web語(yǔ)言,也可以用來(lái)進(jìn)行微信公眾號(hào)的開(kāi)發(fā)。本文將介紹一下使用PHP實(shí)現(xiàn)微信公眾號(hào)開(kāi)發(fā)的具體步驟。第一步:獲取微信公眾號(hào)的開(kāi)發(fā)者賬號(hào)在開(kāi)始微信公眾號(hào)開(kāi)發(fā)之前,需要先去申請(qǐng)一個(gè)微信公眾號(hào)的開(kāi)發(fā)者賬號(hào)。具體的注冊(cè)流程可以參見(jiàn)微信公眾平臺(tái)的官方網(wǎng)

隨著互聯(lián)網(wǎng)和移動(dòng)智能設(shè)備的發(fā)展,微信成為了社交和營(yíng)銷領(lǐng)域不可或缺的一部分。在這個(gè)越來(lái)越數(shù)字化的時(shí)代,如何使用PHP進(jìn)行微信開(kāi)發(fā)已經(jīng)成為了很多開(kāi)發(fā)者的關(guān)注點(diǎn)。本文主要介紹如何使用PHP進(jìn)行微信開(kāi)發(fā)的相關(guān)知識(shí)點(diǎn),以及其中的一些技巧和注意事項(xiàng)。一、開(kāi)發(fā)環(huán)境準(zhǔn)備在進(jìn)行微信開(kāi)發(fā)之前,首先需要準(zhǔn)備好相應(yīng)的開(kāi)發(fā)環(huán)境。具體來(lái)說(shuō),需要安裝PHP的運(yùn)行環(huán)境,以及微信公眾平臺(tái)提
