canvas手勢解鎖思路

2021-07-31 23:17:54 字數 1962 閱讀 6696

參考:

基本要求是這樣的:將密碼儲存到 localstorage 裡,開始的時候會從本地讀取密碼,如果沒有就讓使用者設定密碼,密碼最少為五位數,少於五位要提示錯誤。需要對第一次輸入的密碼進行驗證,兩次一樣才能保持,然後是驗證密碼,能夠對使用者輸入的密碼進行驗證。

一:新建畫布,指定寬度,每行排列3個圓,計算圓的半徑,根據半徑確定圓心。用arc(x,y,r,0,2*pi,true)函式畫圓;

二:初始化密碼,如果window.localstorage.getitem("handlock")存在密碼,則切換到model=1,驗證密碼;否則為,設定密碼;

三:監聽touchstart事件,touchmove事件,touchend事件

touchstart事件:獲取觸點的相對位置,清空touchedcircle陣列,判斷觸點是否在圓內,若在新增在touchedcircle陣列中,同時從restcirle陣列中刪除,每次是對restcirle陣列進行

遍歷,防止重複新增,然後設定touchflag和redraw為true。

touchmove事件(新增節流函式):通過乙個變數儲存觸點位置,判斷觸點的touchflag屬性,如果為true則:如果touchedcircle的長度大於等於1,則圓心與觸點連線,然後將判斷觸點是否在圓內,若redraw為true則畫實心圓,如果touchedcircle的長度大於等於2,則兩個實心圓之間連線,將redraw重置為false;

否則判斷該觸點是否在圓內。

touchend事件:清除動態畫布,防止有多餘線出現。判斷是哪個模式分別處理:

模式一:驗證密碼,將localstorage中值轉為陣列與touchedcircle長度比較,相等則迴圈比較每個圓的編號,都相等,則驗證通過,否則密碼錯誤。

模式二:設定密碼,如果touchedcircle陣列長度小於5則提示重新輸入,否則新建臨時陣列儲存設定密碼值,和確認密碼時比較,切換到模式三。

模式三:確認密碼,首先將臨時陣列儲存值與touchedcircle值比較,若相等則驗證通過,將值儲存在localstorage中,否則驗證不通過,切換到模式二,重新設定。

(2)將touchflag重置為false,並且將兩個陣列touchedcircle和restcirle初始化。

(3)重繪畫布(靜態和動態畫布都清除)。

優化兩點:

一、減少重繪次數

兩個canvas:1.靜態canvas:畫實心圓及兩個圓之間的連線。

2.上面的canvas畫圓心與觸點之間連線

二、解決touchmove頻繁觸發

這個時候我想到了防抖動和節流,首先防抖動肯定是不行的,萬一我一直處於 touch 狀態,重繪會延遲死的,這個時候節流會好一些。

防抖和節流

。具體:在延遲為 delay 的時間內,如果函式再次觸發,則重新計時,這個功能和防抖動是一樣的,第三個引數 mustrun 是乙個時間間隔,表示在時間間隔大於 mustrun 後的乙個函式可以立即直接執行。

節流函式最主要的不同在於它保證在 x 毫秒內至少執行一次我們希望觸發的事件 handler。

防抖函式確實不錯,但是也存在問題,譬如的懶載入,我希望在下滑過程中不斷的被載入出來,而不是只有當我停止下滑時候,才被載入出來。又或者下滑時候的資料的 ajax 請求載入也是同理。

這個時候,我們希望即使頁面在不斷被滾動,但是滾動 handler 也可以以一定的頻率被觸發(譬如 250ms 觸發一次),這類場景,就要用到另一種技巧,稱為節流函式(throttling)。

節流函式,只允許乙個函式在 x 毫秒內執行一次,只有當上一次函式執行後過了你規定的時間間隔,才能進行下一次該函式的呼叫。

與防抖相比,節流函式最主要的不同在於它保證在 x 毫秒內至少執行一次我們希望觸發的事件 handler。

手勢解鎖demo

import lsbackview.h inte ce lsbackview property nonatomic,strong nsmutablearray btnarray property nonatomic,strong nsmutablearray selectionarray prope...

Swift之手勢解鎖

1 繪製九宮格樣式的按鈕組 建立九宮格按鈕組 func createbutton var secret 0 for row in 0.2 for col in 0.2 設定九個按鈕的位置,let buttondistance 100 間距 let firstbtnpointx 0 第乙個按鈕的x l...

android手勢解鎖說明

購買了g1的發現自己的螢幕解鎖方式是按下menu鍵,似乎沒有看到android手勢解鎖這個比較酷的功能,我們完全可以自己設定t mobile g1來開啟手勢解鎖功能,在android作業系統中由9個點組成的,可以根據不同的方向連續滑動出圖形,所以在圖形組合上面有很多種方式,這樣可以不用 輸入繁瑣的密...