1. 程式人生 > >九宮格解鎖的完全實現

九宮格解鎖的完全實現

前言

不記得在使用諾基亞的那些日子,為了一個九宮格解鎖,在應用商城裡下了多少流氓軟體。最後無功而返的時候,那種鬱悶的心情恨不得把手機給砸了!不得不承認,九宮格解鎖的一時風靡,以致於Android陣營的很多手機都內建了這一解鎖選項,比如華為。然,Apple官方卻沒有提供這方面的選擇。唉!誰叫人家肌肉壯碩呢?有錢任性呢?(ps:有了指紋解鎖還要這個?No kidding!)在網上Search了N久,沒有找到一個完整實現了九宮格解鎖的Demo或kit,或許是使用的搜尋引擎的手段太過low了。不過這並不妨礙想自己寫一個這樣的例子出來,於是便有了以下的內容!

提綱挈領

筆者用一個列舉來表述九宮格解鎖檢視的所可能對外呈現的狀態,如下:

typedef NS_ENUM(NSUInteger, ZNUnlockStatus) {
    ZNUnlockStatusSettingPWD = 1,//1
    ZNUnlockStatusSettingPWDFailed,
    ZNUnlockStatusSettingPWDSuccessed,
    ZNUnlockStatusEnsurePWD,
    ZNUnlockStatusInputPWD,//5
    ZNUnlockStatusFailed,
    ZNUnlockStatusSuccessed,
    ZNUnlockStatusResetPWD,//8
ZNUnlockStatusResetPWDFailed, ZNUnlockStatusErrorWaiting //waiting for 20s after five errors };

其中只有1、5、8對應的狀態是對外有效的訪問狀態,其他的只是在整個使用過程中可能會出現的用做提示的狀態資訊,將通過代理回撥的方式來進行資料傳遞,這些只能由解鎖檢視根據使用者的實際操作動態改變而不能通過對外介面預置。這裡筆者心恨了一點,如果你不“乖乖”聽話,程式就崩給你看:

- (void)setUnlockStatus:(ZNUnlockStatus)unlockStatus {
    if (unlockStatus
== 1 || unlockStatus == 5 || unlockStatus == 8)
{ if (_unlockStatus != unlockStatus) { _unlockStatus = unlockStatus; } } else { NSAssert(NO, @"only three status of ZNUnlockStatus can be setted:ZNUnlockStatusSettingPWD、ZNUnlockStatusInputPWD、ZNUnlockStatusResetPWD, others just be used to show ZNUnlockStatus information"); } }

Demo中預設的圖片(來自Iconfont)是簡單的樣式,所以當你將解鎖圖案設定為可見時,線條的顏色也是與預設圖片向匹配的。如果你錯誤繪製,線條顏色就只能是紅色的。當然每個宮格的圖片你可以自定義,包括普通狀態、選中狀態、錯誤狀態,不過在這裡建議錯誤狀態的圖片底色最好與線條相同。如果解鎖完成,你想要讓檢視消失,通過dismissUnlockView就可以完成後續的步驟。

抽絲剝繭

這個名為ZNNineGridsUnlockView的類將一切邏輯都封裝起來了,整個Demo的核心功能是通過touchesBegan:withEvent:、touchesMoved:withEvent:、touchesEnded:withEvent:、drawRect:這幾個方法的串接呼叫完成的。(ps:繪圖過程必須在drawRect:裡完成)

在跟隨使用者互動來畫線的實踐中,筆者的思路是通過在觸控檢視的過程中確定起點和終點(誠然,在確定畫線時這兩點必須是九宮格其中之一的終點)。如果畫線過程是可見的,那麼在觸控移動的過程中就需要不斷地重繪檢視,為了保持連貫性,就需要不斷更新終點(此時的終點只是一個過渡點)。畫線結束後,需要將終點更新為新的起點,不斷迭代,最終完成圖案的繪製。

最開始的時候,筆者將過渡線條以不斷建立UIBezierPath例項並畫線來實現,然後通過持有一個最終確定畫線的例項來確認畫線,卻發現了這樣的問題:線條會有一瞬間的出現(嗯,閃現),然後就消失了。下一次確定時,本次線條和上次線條均會閃現,說明實際的繪製過程是成功的,猜測原因可能是兩個路徑例項相互衝突。(ps:由於清空了廢紙簍,之前錄屏的bug的gif圖片就886,所以沒有給出一個直觀的描述圖,真是抱歉!)

後面在千辛萬苦找到一個例項之後,發現真正的效果是通過取巧的方式完成。原來實際的解鎖頁面下面還有一個UIImageView,在確定繪製的過程中,獲取記憶體的繪圖,並更新UIImageView即可看到最終流暢的線條效果。

在筆者使用九宮格解鎖之後,就一直覺得有一點不爽,也就是起點和終點之間如果有有效的繪製點(之前沒有被選中),那麼這個點也會被自動選中,使用者不能禁止這種行為。這個小例子中,筆者自己彌補了這個小缺憾,同時也是為了增加解鎖圖案的多樣性。、

總結

自我感覺這個Demo沒多少技術含量,所以在寫這篇文章時有點不知道怎麼寫的感覺,總覺得有點廢話的感覺。不過,這些都不是很重要,重要的是下面有完整的程式碼和效果圖。鑑於csdn的圖片大小限制,這裡筆者就只能錄小部分功能的演示:

這裡寫圖片描述

額!剛剛試了一下,發現錄了5秒就用了5.9MB,所以就只能降低畫質和PPI來減少大小了。這裡是程式碼地址,你可以去看看!謝謝!

相關推薦

九宮完全實現

前言 不記得在使用諾基亞的那些日子,為了一個九宮格解鎖,在應用商城裡下了多少流氓軟體。最後無功而返的時候,那種鬱悶的心情恨不得把手機給砸了!不得不承認,九宮格解鎖的一時風靡,以致於Android陣營的很多手機都內建了這一解鎖選項,比如華為。然,Apple官方卻

利用ActivityLifecycleCallBack監控app前後臺狀態切換,實現手勢密碼即九宮

轉載註明出處:http://blog.csdn.net/coderder/article/details/51063493 利用ActivityLifecycleCallbacks監控app前後臺狀態

uiautomator2 實現App九宮

App九宮格解鎖 之前在testerhome社群看見codeskyblue大佬寫過一種方法,但是這種辦法存在一個弊端,那就是多個點的座標是寫死的,也就是說要是換了部手機,九宮格解鎖就行不通了,於是就想著能不能做到自動去獲取多個點的座標,看了看uiautomator2的官方文件,發現有辦法,如下: 1 首

APP自動化--元素操作之九宮密碼圖案

APP自動化時,遇到九宮格不要慌。根據咱們長期的自動化經驗先進行一波分析。 當有多種情況的時候,例如: 1、 九宮格是由9個元素組成。那很簡單啦!可以直接定位到元素的位置,然後用模擬觸屏類(TouchAction類)的方法進行一波操作即可。 2、九宮格是正方形的元素。那

iOS 關於TouchID指紋實現

zip tails 其他 errors 上下 三次 imp event 開發   一直想玩玩指紋解鎖,近期時間比較閑,就研究了一下這個指紋解鎖。這個功能實現起來還是很簡單的,雖然看起來比較高大上,但是對於開發來說,越是高大上的東西一般都有封裝好的,我們只需要調用就可以實現相

fcode-頁面九宮自動屏jquery插件

china href 連續 art 支持 http 函數 背景圖片 pic fcode.js 自動鎖屏插件 fcode.js是什麽? fcode.js是一款web頁面九宮格自動鎖屏js插件,依賴於jquery, 會在設置的範圍裏,判斷用戶有無操作,然後執行鎖屏的功能。 就

CSS九宮的4種實現

文章目錄 實現效果 實現方法 1. float佈局 2. flex佈局 3. grid佈局 4. table佈局 總結

[原始碼]Android安卓應用手勢圖案實現

互動細節 使用者首先使用賬號/密碼進行登入。 登入成功後,判斷是否是第一次登入使用,如果是第一次則顯示建立手勢密碼的介面,要求使用者建立手勢鎖。 建立的過程中要求使用者連線至少四個點,並且繪製兩次以確認繪製正確並記住繪製的路徑。確認成功後進入APP首頁。 使

appium+python自動化33-九宮(TouchAction)

技術 init 註意 int cap 元素 pre nor 位置 TouchAction 1.源碼可以在這個路徑找到:Lib\site-packages\appium\webdriver\common\touch_action.py class TouchAction(ob

Appium九宮(TouchAction)

TouchAction 1.原始碼可以在這個路徑找到:Lib\site-packages\appium\webdriver\common\touch_action.py class TouchAction(object): def __init__(self, driver=None): self

Appium九宮滑動

info eight oca ESS 代碼實現 inf appium web element 1、適配各種機型,首先獲取整個解鎖元素的坐標 2、代碼實現 WebElement lockPattern = driver.findElement(By.id("com.

APP九宮滑動的處理

寫手機自動化測試指令碼關於APP九宮格滑動解鎖方面採用了appium API 之 TouchAction 操作。   先是用uiautomatorviewer.bat查詢APP元素座標:   手工計算九宮格每個點中心的座標及偏移的相對位移:   實現程式碼如下

android 九宮圖案

專案可能的需要,自己嘗試寫了一個九宮格解鎖,在此記錄,以作筆記。 先上效果圖                   

自定義九宮手勢

專案中用到手勢解鎖,然而沒有在GitHub上找到想要的樣式= =,只好自己來定義了,下面來看程式碼~~ 基本上很多應用的手勢解鎖全都是九宮格的,內部內就是九個小圈圈而已。那麼我們就先來自定義這個小圈圈吧~ 圈圈的顏色選擇狀態有大致有三種狀態,所以我定義了一個

九宮手機有多少種情況?

0、寫在前面: 本文的內容大概搬運自果殼和知乎的兩篇文章,在結尾有註明參考。 安卓手勢解鎖是安卓手機解除鎖定的密碼方案,究竟這種方式一定有多少種可能呢?這是本文要討論的問題。 1、問題定義 問題很簡單:安卓的手勢解鎖是3*3的點陣,在這個點陣上的

使用GridView和SimpleAdapter實現手機界面常見的九宮

adapt height lns androi code 兩個 sha itme find 首先是兩個XML界面: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi

IOS 自定義按鈕(代碼實現)+九宮

uifont 排列 end uiview height iyu void rec name 在一些下載應用裏整個頁面都是按鈕,有好多好多,但是仔細觀察不難發現他們很有規律。就像下面一樣?? 很有規律的排列在屏幕上,那麽這需要我們怎麽去做能。 正如標題,我們需要了解兩個知

實現:編輯短信,按power鍵屏後,再點亮屏幕,進入的還是編輯短信界面,按返回鍵才會進入界面。

亮屏 ram flags you creat att msu con sim 描寫敘述:在編輯短信界面按電源鍵鎖屏後,又一次按電源鍵點亮屏幕。並沒有進入到鎖屏界面而是在編輯短信界面。此時短信界面懸浮與鎖屏界面之上。這時按返回鍵關閉編輯短信界面。回到鎖屏界面,是怎樣實

css實現九宮

http order content image 九宮格 bili back lan osi 原理:浮動+margin負邊距 示例代碼: <!DOCTYPE html> <html lang="zh"> <head>

jquery實現簡單的滑動

ive mouseup type use utf title inner htm 僅供參考 jquery實現簡單的滑動解鎖,如下圖展示分別是滑動解鎖前和解鎖後的兩種效果: 解鎖前: 解鎖後: 附源碼:(源碼僅供參考) 1 <!DOCTYPE htm