成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > h5使用canvas畫布實現(xiàn)手勢解鎖

h5使用canvas畫布實現(xiàn)手勢解鎖

熱門標(biāo)簽:欣鼎電銷機(jī)器人 效果 ok電銷機(jī)器人 黃石ai電銷機(jī)器人呼叫中心 地圖標(biāo)注軟件打印出來 智能電銷機(jī)器人被禁用了么 高德地圖標(biāo)注商戶怎么標(biāo) 電話機(jī)器人技術(shù) 如何查看地圖標(biāo)注 惡搞電話機(jī)器人

前言

最近做的一個app項目使用的 apicloud 來實現(xiàn)跨平臺開發(fā),現(xiàn)在需要為這個 app 添加手勢(九宮格)解鎖的功能,apicloud 已經(jīng)有一些第三方的原生實現(xiàn)的手勢解鎖插件,因為是原生的性能也比較好,調(diào)用也比較方便,但是都不能對它們的樣式做修改,所以就打算自己來實現(xiàn)這個功能。這篇文章將實現(xiàn)過程整理分享出來,希望有需要的可以了解。分享出來的代碼只實現(xiàn)了最基本的 設(shè)置密碼功能 、 解鎖功能 、 比較密碼 的功能等,一些高級功能例如:不能限制一個點(diǎn)最多經(jīng)過多少次、限制用戶設(shè)置密碼的長度。

原生實現(xiàn)還是其它方式實現(xiàn)?

1、使用 android 和 ios 對應(yīng)的平臺通過原生代碼來寫手勢解鎖插件。體驗好,但是開發(fā)周期長,需要處理各平臺的兼容性問題,并且需要學(xué)習(xí)apicloud平臺插件編寫方法。(放棄)

2、使用 html5 的 canvas 畫布來實現(xiàn)。開發(fā)周期短,不需要過多的處理兼容性問題,體驗好。(選擇)

原理分析

手勢解鎖

通過手指將屏幕上的九個點(diǎn)依次連接起來形成一個圖案,所以叫圖案解鎖。如上圖每一個解鎖圓圈后面其實都是一個數(shù)字,每次比較的并不是是用戶畫出來的圖案,而是每次手指經(jīng)過圖案時串聯(lián)起來的圓圈下的數(shù)字組成的密碼字符串,本質(zhì)上我們比較的還是字符串的密碼,只不過站在用戶的角度看是繪制出來的圖案。圖案的記憶遠(yuǎn)比數(shù)字字符串記的牢固。

實現(xiàn)步驟

繪制密碼盤

密碼盤的繪制比較簡單,唯一需要注意需要通過動態(tài)計算使九個點(diǎn)圍成的正方式始終在屏幕的中間位置,在手機(jī)上還需要減去狀態(tài)欄的高度。

var width = $(document).width();
var height = $(document).height() - 40; //減去手機(jī)狀態(tài)欄的高度

//九宮格其實就是九個點(diǎn),9個點(diǎn)的坐標(biāo)對象
var lockCicle = {
    x: 0, //x坐標(biāo)
    y: 0, //y坐標(biāo)
    color: "#999999",
    state: "1" //狀態(tài)當(dāng)前點(diǎn)是否已經(jīng)被鏈接過
};

var offset = (width - height) / 2; //計算偏移量
var arr = []; //九個點(diǎn)的坐標(biāo)數(shù)組

//計算九個點(diǎn)坐標(biāo)的方法
for (var i = 1; i <= 3; i++) {
    //每一行
    for (var j = 1; j <= 3; j++) {
        //每一行的每一個
        var lockCicle = {};
        //橫屏
        if (offset > 0) {
            lockCicle.x = (height / 4) * j + Math.abs(offset);
            lockCicle.y = (height / 4) * i;
            lockCicle.state = 0;
            //豎屏
        } else {
            lockCicle.x = (width / 4) * j;
            lockCicle.y = (width / 4) * i + Math.abs(offset);
            lockCicle.state = 0;
        }
        arr.push(lockCicle);
    }
}

//初始化界面的方法
function init() {
    ctx.clearRect(0, 0, width, height); //清空畫布
    pointerArr = []; //清楚繪制路徑
    for (var i = 0; i < arr.length; i++) {
        arr[i].state = 0; //清除繪制狀態(tài)
        drawPointer(i);
    }
}

//繪制九宮格解鎖界面
function drawPointer(i) {
    ctx.save();
    var radius = 0;
    if (hastouch) {
        radius = width / 12;
    } else {
        radius = 24;
    }
    var _fillStyle = "#dd514c";
    var _strokeStyle = "#dd514c";
    //不同狀態(tài)顯示不同顏色
    if (arr[i].state == 1) {
        _strokeStyle = "#1bd6c5";
    }
    //繪制原點(diǎn)
    ctx.beginPath();
    ctx.fillStyle = _fillStyle;
    ctx.arc(arr[i].x, arr[i].y, 6, 0, Math.PI * 2, false);
    ctx.fill();
    ctx.closePath();
    //繪制圓圈
    ctx.beginPath();
    ctx.strokeStyle = _strokeStyle;
    ctx.lineWidth = 0.3;
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    ctx.arc(arr[i].x, arr[i].y, radius, 0, Math.PI * 2, false);
    ctx.stroke();
    ctx.closePath();
    ctx.restore();
}

//初始化界面
init();

繪制連線

繪制連線的方法

var pointerArr = []; //連接線點(diǎn)的坐標(biāo)數(shù)組
var startX, startY; //線條起始點(diǎn)
var puts = []; //經(jīng)過的九個點(diǎn)的數(shù)組
var currentPointer; //當(dāng)前點(diǎn)是否已經(jīng)連接
var pwd = []; //密碼
var confirmPwd = []; //確認(rèn)密碼
var unlockFlag = false; //是否解鎖的標(biāo)志

/**
 ** 繪制鏈接線的方法,將坐標(biāo)數(shù)組中的點(diǎn)繪制在canvas畫布中
 **/
function drawLinePointer(x, y, flag) {
    ctx.clearRect(0, 0, width, height);
    ctx.save();
    ctx.beginPath();
    ctx.strokeStyle = "#1bd6c5";
    ctx.lineWidth = 5;
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    for (var i = 0; i < pointerArr.length; i++) {
        if (i == 0) {
            ctx.moveTo(pointerArr[i].x, pointerArr[i].y);
        } else {
            ctx.lineTo(pointerArr[i].x, pointerArr[i].y);
        }
    }
    ctx.stroke();
    ctx.closePath();
    ctx.restore();
    for (var i = 0; i < arr.length; i++) {
        drawPointer(i); //繪制圓圈和原點(diǎn)
        if (ctx.isPointInPath(x, y) && currentPointer != i) {
            //判斷鼠標(biāo)點(diǎn)擊是否在圓中
            pointerArr.push({
                x: arr[i].x,
                y: arr[i].y
            });
            currentPointer = i;
            puts.push(i + 1);
            startX = arr[i].x;
            startY = arr[i].y;
            arr[i].state = 1;
        }
    }
    if (flag) {
        ctx.save();
        ctx.beginPath();
        ctx.globalCompositeOperation = "destination-over";
        ctx.strokeStyle = "#e2e0e0";
        ctx.lineWidth = 5;
        ctx.lineCap = "round";
        ctx.lineJoin = "round";
        ctx.moveTo(startX, startY);
        ctx.lineTo(x, y);
        ctx.stroke();
        ctx.beginPath();
        ctx.restore();
    }
}

綁定事件

連線的過程就是將 3 個 touch(移動端) 事件組合起來獲取當(dāng)前位置的坐標(biāo)放入數(shù)組中,然后將這些坐標(biāo)渲染到界面上的過程。

  • touchstart (mousedown) 當(dāng)手指(鼠標(biāo))按下時設(shè)置 isMouseDown=true,同時將該點(diǎn)的坐標(biāo)保存到線條數(shù)組中,并將數(shù)組中的點(diǎn)繪制出來。
  • touchmove (mousemove) 當(dāng) isMouseDown=true 時 將手指(鼠標(biāo))移動過程中所有的坐標(biāo)點(diǎn)都保存到蕭條數(shù)組中,并將數(shù)組中的點(diǎn)繪制出來。
  • mouseup (mouseup) 當(dāng)手指(鼠標(biāo))松開后設(shè)置 isMouseDown=fasle.將數(shù)組中的所有點(diǎn)繪制出來,清空 pointerArr 數(shù)組,然后比較連接的點(diǎn)的數(shù)量如果小于 6(自己設(shè)置,一般密碼 6 位以上)給一個密碼長度不夠的提示,清空 puts 數(shù)組,重新調(diào)用 init 方法初始化界面,如果大于等于 6 則密碼設(shè)置成功。
//兼容移動觸摸的事件寫法
var hastouch = "ontouchstart" in window ? true : false,
    tapstart = hastouch ? "touchstart" : "mousedown",
    tapmove = hastouch ? "touchmove" : "mousemove",
    tapend = hastouch ? "touchend" : "mouseup";

//綁定按下事件
lockCnavs.addEventListener(tapstart, function(e) {
    isMouseDown = true;
    var x1 = hastouch
        ? e.targetTouches[0].pageX
        : e.clientX - canvas.offsetLeft;
    var y1 = hastouch ? e.targetTouches[0].pageY : e.clientY - canvas.offsetTop;
    drawLinePointer(x1, y1, true);
});

//移動時候,將經(jīng)過的坐標(biāo)點(diǎn)全部保存起來
lockCnavs.addEventListener(tapmove, function(e) {
    if (isMouseDown) {
        var x1 = hastouch
            ? e.targetTouches[0].pageX
            : e.clientX - canvas.offsetLeft;
        var y1 = hastouch
            ? e.targetTouches[0].pageY
            : e.clientY - canvas.offsetTop;
        drawLinePointer(x1, y1, true);
    }
});

//取消
lockCnavs.addEventListener(tapend, function(e) {
    drawLinePointer(0, 0, false);
    isMouseDown = false;
    pointerArr = [];
    if (puts.length >= 6) {
        alert("你的圖案密碼是: [   " + puts.join("    >   ") + "   ]");
        if (unlockFlag) {
            //解鎖
            unlock();
        } else {
            //設(shè)置解鎖密碼
            settingUnlockPwd();
        }
    } else {
        if (puts.length >= 1) {
            alert("你的圖案密碼太簡單了~~~");
            init();
        }
    }
    puts = [];
});

實現(xiàn)解鎖邏輯

通過上面幾步的操作,九宮格解鎖每一次繪圖之后的數(shù)據(jù)和顯示效果都有了,現(xiàn)在只需要在關(guān)鍵地方添加相應(yīng)邏輯代碼就可以了,這里主要介紹它的實現(xiàn)邏輯就不對代碼做封裝了。

相關(guān)代碼

//設(shè)置解鎖密碼和解鎖測試
function settingUnlockPwd() {
    if (pwd.length <= 0) {
        pwd = puts;
        init();
        $("header").text("再次繪制解鎖圖案");
    } else if (confirmPwd.length <= 0) {
        confirmPwd = puts;
    }
    console.log(pwd + "  " + confirmPwd);
    //筆記兩次密碼是否正確
    if (pwd.length > 0 && confirmPwd.length > 0) {
        if (compareArr(pwd, confirmPwd)) {
            $("header").text("解鎖圖案繪制成功");
            init();
        } else {
            $("header").text("兩次繪制的解鎖圖案不一致");
            init();
            confirmPwd = [];
        }
    }
}
//解鎖
function unlock() {
    console.log("解鎖密碼:" + puts + "  " + confirmPwd);
    if (compareArr(puts, confirmPwd)) {
        $("header").text("解鎖成功!頁面跳轉(zhuǎn)中......");
    } else {
        $("header").text("解鎖圖案不正確?。?!");
        init();
    }
}
$("footer").click(function() {
    if ($(this).text() === "解鎖") {
        unlockFlag = true;
        init();
        $("header").text("繪制解鎖圖案");
    }
});
//比較兩個數(shù)組(Number)是否相等
function compareArr(arr1, arr2) {
    return arr1.toString() === arr2.toString();
}

后記

本文完整 demo 在線演示地址

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:阿壩 萍鄉(xiāng) 赤峰 金昌 盤錦 中山 聊城 綏化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《h5使用canvas畫布實現(xiàn)手勢解鎖》,本文關(guān)鍵詞  使用,canvas,畫布,實現(xiàn),手勢,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《h5使用canvas畫布實現(xiàn)手勢解鎖》相關(guān)的同類信息!
  • 本頁收集關(guān)于h5使用canvas畫布實現(xiàn)手勢解鎖的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美色网一区二区| 另类ts人妖一区二区三区| 日韩精品免费视频一区二区三区| 一区二区视频播放| 精品视频高清无人区区二区三区| 色乱码一区二区三区88| 日韩亚洲欧美成人一区| av3级在线| 丁香桃色午夜亚洲一区二区三区| 亚洲国产精品久久久久久6q| 午夜免费欧美电影| 中文字幕在线视频观看| 久久久久久美女精品| av免费网站在线观看| 男人添女人下面高潮视频| 国产美女精品一区二区三区| 亚洲精选视频免费看| 成人黄色av网址| 黄色电影网站在线观看| 美女裸体自慰在线观看| 亚洲综合免费视频| 99视频在线观看免费| 看全色黄大色黄大片免责看的| 91国内精品久久久久| 免费不卡视频| 4hu四虎永久网址| 日韩wuma| 麻豆电影传媒二区| 精品欧美久久久| 97久久综合区小说区图片区| 精品97人妻无码中文永久在线| 国产精品久久久久久久久免费高清| 欧美一级久久久| 精品国产一区二区三区香蕉沈先生| 最新国产热播激情视频| 91免费在线看| 免费黄网站在线| 亚洲精品91在线| 欧美虐宫另类残忍视频| 成人www视频网站免费观看| 毛片基地一级大毛片| 中文字幕精品视频在线| 亚洲精品一二三四区| 天天射综合影视| 美女av免费看| www.精品av.com| 国产麻豆永久视频| 亚洲一区欧美激情| 一本色道久久综合精品竹菊| bt在线麻豆视频| 天天操 夜夜操| 播五月开心婷婷综合| 九九99久久精品在免费线bt| 日本免费一区二区视频| 97超级在线观看免费高清完整版电视剧| 精品日韩美女的视频高清| 国产精品水嫩水嫩| 欧美vide| 精品久久久久久久人人人人传媒| 51vv免费精品视频一区二区| 红桃av永久久久| 69久久夜色精品国产69蝌蚪网| 国产乱精品一区二区三区| 国产伦一区二区三区| 无码人妻精品一区二区三区99v| 国产91久久精品一区二区| 亚洲乱码国产一区三区| 日韩欧美亚洲国产| 91精品国产高清一区二区三蜜臀| 91精品国产综合久久精品| 污视频网址在线观看| 91精品国产自产精品男人的天堂| 国产妇女馒头高清泬20p多| 国产精久久久久久| 欧美主播福利视频| 中文字幕一区二区视频| 国产一卡二卡三卡四卡| 91九色综合| 91电影91视频| 国产日韩欧美日韩大片| 中文字幕久久熟女蜜桃| 国内自拍视频在线看免费观看| 亚洲美女淫视频| 亚洲国产日韩在线| 亚洲成人自拍视频| 日韩电影在线免费观看| 最近日韩中文字幕| 国产视频亚洲色图| 国产99久久精品一区二区| 黄色网页在线观看| 国产精品v欧美精品∨日韩| 欧美日韩在线播放一区| 日韩欧美视频在线免费观看| 美女视频黄a大片欧美| 清纯唯美亚洲激情| 大型av综合网站| 99这里只有精品视频| 国产亚洲综合在线| 少妇高潮大叫好爽喷水| 亚洲香蕉伊在人在线观| 成人免费区一区二区三区| 国产片侵犯亲女视频播放| 成人激情在线观看| 国产精品一二三产区| 国产精品视频公开费视频| 在线一区二区三区四区五区| 国产香蕉免费精品视频| 欧美日本在线看| 88在线观看91蜜桃国自产| 91成品人影院| 国产免费人人看| 亚洲高清在线看| 国产一级免费大片| 麻豆91精品91久久久的内涵| 中文字幕不卡三区| 国产激情久久久| 欧美精品二区三区| а天堂中文在线资源| 成年在线电影| 亚洲AV无码成人精品区明星换面| 精品一区二区三区在线观看| 国产精品中文字幕在线观看| 红杏一区二区三区| 久久综合在线观看| www.成人精品| 久久中文久久字幕| 国产精品9999久久久久仙踪林| 欧美日韩性在线观看| 8v天堂国产在线一区二区| 狂野欧美一区| 国产日韩三级| 国内精彩免费自拍视频在线观看网址| 最新中文在线视频| 欧美精品生活片| 国产福利三区| 国产精品盗摄久久久| 五月天中文字幕| av高清日电影| 在线观看的网站你懂的| 久久先锋资源| 欧美一区二区三区思思人| 欧美精品午夜视频| www.日韩av| 亚洲日本一区二区三区在线不卡| 社区色欧美激情 | 亚洲精品国产精品乱码不99| 大地资源第二页在线观看高清版| 久久久一区二区三区| 久久成人18免费网站| 日本欧美久久久久免费播放网| h视频在线免费观看| 欧美成人精品二区三区99精品| 精品国产乱码久久久久久天美| 成人国产在线观看| 欧美男男gaygay1069| 国产日产亚洲精品| 国内精品偷拍| 成人香蕉社区| sis001亚洲原创区| 亚洲精品视频一区| 欧美日韩mp4| 久久久亚洲国产天美传媒修理工| 欧美aa在线观看| 亚洲波多野结衣| 一区二区三区四区免费视频| 91精品国产99久久久久久| 欧美羞羞视频| 久久国产免费视频| 欧美高清视频不卡网| www在线视频观看| 本田岬高潮一区二区三区| 美女视频一区二区三区在线| 黄色激情视频网址| 亚洲精品国产美女| 国产综合亚洲精品一区二| 国产精品嫩草影院精东| 欧美12一14sex性hd| 77777亚洲午夜久久多人| 美足av综合网| 精品无码人妻一区| 欧美大片国产精品| 夜夜躁日日躁狠狠久久av| 狠狠色狠狠色综合网| 成人v精品蜜桃久久一区| 久久综合99| 国产精品剧情在线亚洲| 在线观看免费高清视频| 国模娜娜一区二区三区| 久久久久国产一区二区三区四区| 成人网在线免费观看| 亚洲1234区| 精品视频在线一区二区在线| 日韩在线一区二区视频| 欧美大成色www永久网站婷| 69堂视频在线观看国产| 国产精品久久在线| 波多野结衣成人在线| 美女诱惑黄网站一区| 成人一级片网站| jizzjizzjizz亚洲日本| 日韩av三级在线观看| 国产精品成人**免费视频| 久久久一区二区三区| 欧美破处大片在线视频| 国产黄色免费电影| 99视频一区二区| 中文字幕视频在线免费| √天堂中文在线| 亚洲五码在线观看视频| 亚洲成人亚洲激情| 91福利在线观看视频| 大奶在线精品| 久久综合久久鬼色中文字| 99视频精品视频高清免费| 福利所第一导航| 美日韩精品免费视频| 天天干 天天插| 国产精品视频流白浆免费视频| 狠狠色噜噜狠狠色综合久| 久久亚洲综合色一区二区三区| 久久九九影视网| 99国产精品久久一区二区三区| 欧美另类高清视频在线| 国产高清一区二区三区四区| 亚洲欧美日韩天堂一区二区| 黄色不卡一区| 国产ts在线观看| 天天av综合| 欧美jiizzhd精品欧美| 伊人www22综合色| 亚洲ab电影| 亚洲最大激情网| 天堂网站www天堂资源在线| 激情综合网五月天| 在线免费观看亚洲视频| 91久久精品美女| 欧美高清自拍一区| 日本簧片在线观看| 乱码第一页成人| 日韩av成人在线| 国产久一道中文一区| av一级亚洲| 亚洲青青青在线视频| 男人添女荫道口喷水视频| 亚洲国产精品va在线| 国产一级做a爱免费视频| 国产自产在线视频一区| 国产精品激情电影| 国产肉体ⅹxxx137大胆| 四虎国产成人精品免费一女五男| 欧美激情视频一区| 成人av电影天堂| av漫画网站| 国产高清视频网| 国产激情视频在线观看| 亚洲第一男人天堂| 正在播放木下凛凛xv99| 高清在线观看免费韩剧| 一本综合久久| 国产香蕉精品视频一区二区三区| 中文字幕第一页久久| 一女三黑人理论片在线| 欧美一区在线直播| 国产精品成久久久久| 视频一区二区综合| 亚洲女同中文字幕| 成人免费网站入口| 国产精品久久久久一区二区三区共| 四虎网站在线观看| 国产自产女人91一区在线观看| 五月综合久久| 日韩精品成人一区二区在线观看| 四虎精品欧美一区二区免费| 91久久国产精品91久久性色| 亚洲另类自拍| 久草免费在线视频观看| 影音先锋在线国产| 日本va欧美va欧美va精品| 免费看成年人视频在线观看| www.久久热.com| 精品久久久久久久久久中文字幕| 国产精品自拍网| 亚洲天堂资源| 色黄视频免费看| 国产精品免费网站在线观看| 欧美成人免费电影| 成人性生交大片免费看视频r| jizzjizz在线观看| 欧美在线播放视频| 四虎8848精品成人免费网站| 成av人电影在线观看| 色琪琪一区二区三区亚洲区| 青青草成人免费视频| 欧美日韩激情美女| 国产精品99一区二区三区| 日韩午夜在线影院| 欧美丝袜第三区| 欧洲av在线播放| 亚洲色图.com| 免费不卡在线视频| 男男gaygays亚洲| 精品入口麻豆88视频| 青青草原综合久久大伊人精品| 久久久午夜精品福利内容| 亚洲一区三区电影在线观看| 亚洲第一视频在线| 粉嫩久久久久久久极品| 免费观看精品视频| 欧美特黄一级片| 国产午夜精品理论片a级探花| 国产亚洲xxx| 久久99精品久久久久久久久久久久| 欧美狂野激情性xxxx在线观| 国产jk精品白丝av在线观看| 国产在线一区二区三区欧美| 久久爱www.| 最新中文字幕在线观看视频| 欧洲成人午夜精品无码区久久| 久久久久久欧美精品色一二三四| 色一情一区二区三区四区| 亚洲国产成人精品一区二区三区| 亚洲午夜性刺激影院| 国产精品无码电影| 黄污网站在线观看| 成年人免费视频观看| 九色porny丨国产首页在线| 日韩在线中文字| 国产精品久久久久aaaa九色|