婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > h5使用canvas畫布實現手勢解鎖

h5使用canvas畫布實現手勢解鎖

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

前言

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

原生實現還是其它方式實現?

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

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

原理分析

手勢解鎖

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

實現步驟

繪制密碼盤

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

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

//九宮格其實就是九個點,9個點的坐標對象
var lockCicle = {
    x: 0, //x坐標
    y: 0, //y坐標
    color: "#999999",
    state: "1" //狀態當前點是否已經被鏈接過
};

var offset = (width - height) / 2; //計算偏移量
var arr = []; //九個點的坐標數組

//計算九個點坐標的方法
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; //清除繪制狀態
        drawPointer(i);
    }
}

//繪制九宮格解鎖界面
function drawPointer(i) {
    ctx.save();
    var radius = 0;
    if (hastouch) {
        radius = width / 12;
    } else {
        radius = 24;
    }
    var _fillStyle = "#dd514c";
    var _strokeStyle = "#dd514c";
    //不同狀態顯示不同顏色
    if (arr[i].state == 1) {
        _strokeStyle = "#1bd6c5";
    }
    //繪制原點
    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 = []; //連接線點的坐標數組
var startX, startY; //線條起始點
var puts = []; //經過的九個點的數組
var currentPointer; //當前點是否已經連接
var pwd = []; //密碼
var confirmPwd = []; //確認密碼
var unlockFlag = false; //是否解鎖的標志

/**
 ** 繪制鏈接線的方法,將坐標數組中的點繪制在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); //繪制圓圈和原點
        if (ctx.isPointInPath(x, y) && currentPointer != i) {
            //判斷鼠標點擊是否在圓中
            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(移動端) 事件組合起來獲取當前位置的坐標放入數組中,然后將這些坐標渲染到界面上的過程。

  • touchstart (mousedown) 當手指(鼠標)按下時設置 isMouseDown=true,同時將該點的坐標保存到線條數組中,并將數組中的點繪制出來。
  • touchmove (mousemove) 當 isMouseDown=true 時 將手指(鼠標)移動過程中所有的坐標點都保存到蕭條數組中,并將數組中的點繪制出來。
  • mouseup (mouseup) 當手指(鼠標)松開后設置 isMouseDown=fasle.將數組中的所有點繪制出來,清空 pointerArr 數組,然后比較連接的點的數量如果小于 6(自己設置,一般密碼 6 位以上)給一個密碼長度不夠的提示,清空 puts 數組,重新調用 init 方法初始化界面,如果大于等于 6 則密碼設置成功。
//兼容移動觸摸的事件寫法
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);
});

//移動時候,將經過的坐標點全部保存起來
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 {
            //設置解鎖密碼
            settingUnlockPwd();
        }
    } else {
        if (puts.length >= 1) {
            alert("你的圖案密碼太簡單了~~~");
            init();
        }
    }
    puts = [];
});

實現解鎖邏輯

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

相關代碼

//設置解鎖密碼和解鎖測試
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("解鎖成功!頁面跳轉中......");
    } else {
        $("header").text("解鎖圖案不正確!!!");
        init();
    }
}
$("footer").click(function() {
    if ($(this).text() === "解鎖") {
        unlockFlag = true;
        init();
        $("header").text("繪制解鎖圖案");
    }
});
//比較兩個數組(Number)是否相等
function compareArr(arr1, arr2) {
    return arr1.toString() === arr2.toString();
}

后記

本文完整 demo 在線演示地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:阿壩 萍鄉 赤峰 金昌 盤錦 中山 聊城 綏化

巨人網絡通訊聲明:本文標題《h5使用canvas畫布實現手勢解鎖》,本文關鍵詞  使用,canvas,畫布,實現,手勢,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《h5使用canvas畫布實現手勢解鎖》相關的同類信息!
  • 本頁收集關于h5使用canvas畫布實現手勢解鎖的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩视频一区二区在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 欧美一级在线免费| 精品欧美久久久| 成人国产精品免费观看视频| 91.麻豆视频| 色国产精品一区在线观看| proumb性欧美在线观看| 亚洲欧美电影一区二区| 久久久精品中文字幕麻豆发布| 欧美裸体一区二区三区| 日韩限制级电影在线观看| 欧美精品一区二区三区蜜桃视频| 日韩一区二区在线看| 久久亚洲影视婷婷| 亚洲国产毛片aaaaa无费看 | 国内外成人在线| 午夜av一区二区三区| 国产一区二区三区免费看 | 韩国毛片一区二区三区| 国产成人av在线影院| 欧美亚洲自拍偷拍| 国产亚洲一区字幕| 亚洲一区二区视频| 91首页免费视频| 国产欧美一区二区精品性色| 99国产精品国产精品久久| 欧美日精品一区视频| 国产精品久久精品日日| 蜜桃av一区二区三区电影| 99久久国产综合色|国产精品| 在线这里只有精品| 国产精品美女久久久久久| 在线一区二区视频| 欧美午夜宅男影院| 欧美一区二区三区在线观看| 国产精品午夜免费| 91超碰这里只有精品国产| 国产色综合一区| 麻豆91精品视频| 粉嫩一区二区三区在线看| 久久人人爽人人爽| 精油按摩中文字幕久久| 国产精品福利一区| 在线日韩国产精品| 日韩精品福利网| 久久久久久久久岛国免费| 色婷婷亚洲精品| 日日摸夜夜添夜夜添精品视频| 777欧美精品| 久久99久久久欧美国产| 国产精品免费免费| 欧美绝品在线观看成人午夜影视| 亚洲va中文字幕| 色呦呦国产精品| 亚洲欧美日韩中文播放| 欧美午夜精品电影| 国产福利电影一区二区三区| 国产精品久久久久久久蜜臀| 3d动漫精品啪啪一区二区竹菊| 国产成a人无v码亚洲福利| 男人的j进女人的j一区| 1024国产精品| 一本一道波多野结衣一区二区 | 亚洲三级免费电影| 亚洲香肠在线观看| 337p亚洲精品色噜噜噜| 欧美一区二区视频在线观看 | 国产suv一区二区三区88区| 国产99精品视频| 日韩电影在线免费看| 韩国一区二区在线观看| 国产精品影视天天线| 欧美性受极品xxxx喷水| av高清久久久| 欧美成人女星排行榜| 亚洲视频在线一区二区| 亚洲精品老司机| 国产成人免费网站| 在线视频中文字幕一区二区| 欧美绝品在线观看成人午夜影视| 精品区一区二区| 日韩视频免费观看高清完整版在线观看| 99re这里只有精品首页| 日韩一区二区影院| 亚洲成人精品一区| 99久久综合国产精品| 欧美一区二区三区在线视频| 亚洲线精品一区二区三区| 91污片在线观看| 亚洲欧美二区三区| 欧洲亚洲国产日韩| 亚洲丶国产丶欧美一区二区三区| 91麻豆123| 偷拍日韩校园综合在线| 在线免费亚洲电影| 奇米精品一区二区三区在线观看| 欧美日韩国产成人在线91| 午夜精品久久久久久久久久久| 成人福利在线看| 一区二区三区不卡在线观看 | 91精品国产91热久久久做人人| 国产精品国产三级国产aⅴ原创| 国内偷窥港台综合视频在线播放| 亚洲国产婷婷综合在线精品| 高清日韩电视剧大全免费| 久久久一区二区三区| 丰满岳乱妇一区二区三区| 国产亚洲婷婷免费| 91女神在线视频| 日本欧洲一区二区| 欧美国产一区在线| 99国产精品久久久久久久久久久| 成人免费在线播放视频| 在线影院国内精品| 国产在线精品免费av| 亚洲人妖av一区二区| 欧美一区二区三区人| 成人av电影免费观看| 日韩av中文字幕一区二区三区| 国产精品久久久久久久浪潮网站| 在线观看www91| 成人高清av在线| 国产精品69毛片高清亚洲| 中文字幕日韩av资源站| 久久综合狠狠综合久久综合88| 一本高清dvd不卡在线观看| 国产一区二区精品久久91| 国产精品一卡二卡| 免费人成精品欧美精品| 亚洲高清不卡在线| 一个色综合网站| 亚洲风情在线资源站| 喷白浆一区二区| 国产91精品欧美| 欧美色偷偷大香| 日韩一区二区三区精品视频 | 久久精品一区二区三区不卡 | 日韩av电影免费观看高清完整版在线观看| 日本韩国欧美一区| 中文字幕欧美日韩一区| 欧美综合久久久| eeuss鲁片一区二区三区| 欧美色图免费看| 久草热8精品视频在线观看| 日韩欧美国产一区二区三区| 狠狠色伊人亚洲综合成人| 亚洲午夜电影在线观看| 久久精品在这里| 精品日本一线二线三线不卡| 4hu四虎永久在线影院成人| 色爱区综合激月婷婷| 北岛玲一区二区三区四区| 在线观看一区二区视频| 91蝌蚪porny成人天涯| 成人av在线资源网站| 国产东北露脸精品视频| 日韩在线一二三区| 五月开心婷婷久久| 另类调教123区| 国产盗摄一区二区| 99久久精品情趣| 欧美日韩一区二区在线观看视频| 夜夜嗨av一区二区三区| 日韩高清欧美激情| 国产一区二区在线看| 在线这里只有精品| 国产亚洲va综合人人澡精品| 久久久综合精品| 婷婷激情综合网| 国产精品77777竹菊影视小说| 国产成人在线免费观看| 成人av网站在线| 欧美精品乱码久久久久久按摩| 26uuu国产一区二区三区| 亚洲一区免费在线观看| 成人做爰69片免费看网站| 99久久精品国产一区| 精品国产一区二区三区四区四| 亚洲人成电影网站色mp4| 国产麻豆91精品| 亚洲电影激情视频网站| 成人激情视频网站| 久久久久久久精| 国产一区不卡视频| 日韩欧美一区电影| 香蕉久久夜色精品国产使用方法 | 亚洲色图另类专区| 国产精品一二三区在线| 欧美色爱综合网| 图片区小说区国产精品视频| 91免费版pro下载短视频| 精品久久久久久久久久久久久久久 | 国产不卡视频在线观看| 亚洲国产日韩av| 91精品婷婷国产综合久久性色| 亚洲一区二区在线视频| 成人av中文字幕| 国产精品久久免费看| 色综合咪咪久久|