h5手势解锁(wap)

1.引入js文件,名称为 H5lock.js
<script type="text/javascript" src="./H5lock.js"></script>
复制代码
//H5lock.js(面向对象封装)
(function(){
    window.H5lock = function(obj){
        this.height = obj.height;
        this.width = obj.width;
        this.keyborderColor = obj.keyborderColor;
        this.lineColor = obj.lineColor;
        this.canvasBgColor = obj.canvasBgColor || '#fff';
        this.centerKeyborderColor = obj.centerKeyborderColor;
        this.width = obj.width || 300;
        this.height = obj.height || 300;
        this.callback = Object.prototype.toString.call(obj.callback) === "[object Function]"? obj.callback : function() { return true };
        console.log(this.callback)
        this.chooseType = Number(window.localStorage.getItem('chooseType')) || obj.chooseType;
    };
    H5lock.prototype.drawCle = function(x, y) { // 初始化解锁密码面板
        this.ctx.strokeStyle = this.keyborderColor || '#CFE6FF'; //数字圆颜色
        this.ctx.lineWidth = 2;
        this.ctx.beginPath();
        this.ctx.arc(x, y, this.r, 0, Math.PI * 2, true);
        this.ctx.closePath();
        this.ctx.stroke();
    }
    H5lock.prototype.drawPoint = function() { // 初始化圆心
        for (var i = 0 ; i < this.lastPoint.length ; i++) {
            this.ctx.fillStyle = this.centerKeyborderColor || '#CFE6FF'; //数字圆圆心颜色
            this.ctx.beginPath();
            this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.r / 2, 0, Math.PI * 2, true);
            this.ctx.closePath();
            this.ctx.fill();
        }
    }
    H5lock.prototype.drawStatusPoint = function(type) { // 初始化状态线条
        for (var i = 0 ; i < this.lastPoint.length ; i++) {
            this.ctx.strokeStyle = type;
            this.ctx.beginPath();
            this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.r, 0, Math.PI * 2, true);
            this.ctx.closePath();
            this.ctx.stroke();
        }
    }
    H5lock.prototype.drawLine = function(po, lastPoint) {// 解锁轨迹
        this.ctx.beginPath();
        this.ctx.lineWidth = 3;
        this.lineColor && (this.ctx.strokeStyle = this.lineColor);
        this.ctx.moveTo(this.lastPoint[0].x, this.lastPoint[0].y);
        console.log(this.lastPoint.length);
        for (var i = 1 ; i < this.lastPoint.length ; i++) {
            this.ctx.lineTo(this.lastPoint[i].x, this.lastPoint[i].y);
        }
        this.ctx.lineTo(po.x, po.y);
        this.ctx.stroke();
        this.ctx.closePath();
    };
    H5lock.prototype.createCircle = function() {// 创建解锁点的坐标,根据canvas的大小来平均分配半径
        var n = this.chooseType;
        var count = 0;
        this.r = this.ctx.canvas.width / (2 + 4 * n);// 公式计算
        this.lastPoint = [];
        this.arr = [];
        this.restPoint = [];
        var r = this.r;
        for (var i = 0 ; i < n ; i++) {
            for (var j = 0 ; j < n ; j++) {
                count++;
                var obj = {
                    x: j * 4 * r + 3 * r,
                    y: i * 4 * r + 3 * r,
                    index: count
                };
                this.arr.push(obj);
                this.restPoint.push(obj);
            }
        }
        this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
        for (var i = 0 ; i < this.arr.length ; i++) {
            this.drawCle(this.arr[i].x, this.arr[i].y);
        }
        //return arr;
    };
    H5lock.prototype.getPosition = function(e) {// 获取touch点相对于canvas的坐标
        var rect = e.currentTarget.getBoundingClientRect();
        var po = {
            x: e.touches[0].clientX - rect.left,
            y: e.touches[0].clientY - rect.top
          };
        return po;
    };
    H5lock.prototype.update = function(po) {// 核心变换方法在touchmove时候调用
        this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);

        for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
            this.drawCle(this.arr[i].x, this.arr[i].y);
        }
        this.drawPoint(this.lastPoint);// 每帧花轨迹
        this.drawLine(po , this.lastPoint);// 每帧画圆心
        for (var i = 0 ; i < this.restPoint.length ; i++) {
            if (Math.abs(po.x - this.restPoint[i].x) < this.r && Math.abs(po.y - this.restPoint[i].y) < this.r) {
                this.drawPoint(this.restPoint[i].x, this.restPoint[i].y);
                this.lastPoint.push(this.restPoint[i]);
                this.restPoint.splice(i, 1);
                break;
            }
        }
    };
    H5lock.prototype.checkPass = function(psw1, psw2) {// 检测密码
        var p1 = '',
        p2 = '';
        for (var i = 0 ; i < psw1.length ; i++) {
            p1 += psw1[i].index + psw1[i].index;
        }
        for (var i = 0 ; i < psw2.length ; i++) {
            p2 += psw2[i].index + psw2[i].index;
        }
        return p1 === p2;
    };
    H5lock.prototype.storePass = function(psw) {// touchend结束之后对密码和状态的处理
        if (this.pswObj.step == 1) {
            if (this.checkPass(this.pswObj.fpassword, psw)) {
                this.pswObj.step = 2;
                this.pswObj.spassword = psw;
                document.getElementById('title').innerHTML = '密码保存成功';
                this.drawStatusPoint('#2CFF26');
                window.localStorage.setItem('passwordxx', JSON.stringify(this.pswObj.spassword));
                window.localStorage.setItem('chooseType', this.chooseType);
            } else {
                document.getElementById('title').innerHTML = '两次不一致,重新输入';
                this.drawStatusPoint('red');
                delete this.pswObj.step;
            }
        } else if (this.pswObj.step == 2) {
            if (this.checkPass(this.pswObj.spassword, psw)) {
                
               if(this.callback(this.lastPoint)) {
                    document.getElementById('title').innerHTML = '解锁成功';
                    this.drawStatusPoint('#2CFF26');
               }
                console.log(this.lastPoint)
            } else {
                if(!this.callback(this.lastPoint)) {
                    this.drawStatusPoint('red');
                    document.getElementById('title').innerHTML = '解锁失败';
               }
              
            }
        } else {
            this.pswObj.step = 1;
            this.pswObj.fpassword = psw;
            document.getElementById('title').innerHTML = '再次输入';
        }

    };
    H5lock.prototype.makeState = function() {
        if (this.pswObj.step == 2) {
            document.getElementById('updatePassword').style.display = 'block';
            //document.getElementById('chooseType').style.display = 'none';
            document.getElementById('title').innerHTML = '请解锁';
        } else if (this.pswObj.step == 1) {
            //document.getElementById('chooseType').style.display = 'none';
            document.getElementById('updatePassword').style.display = 'none';
        } else {
            document.getElementById('updatePassword').style.display = 'none';
            //document.getElementById('chooseType').style.display = 'block';
        }
    };
    H5lock.prototype.setChooseType = function(type){
        chooseType = type;
        init();
    };
    H5lock.prototype.updatePassword = function(){
        window.localStorage.removeItem('passwordxx');
        window.localStorage.removeItem('chooseType');
        this.pswObj = {};
        document.getElementById('title').innerHTML = '绘制解锁图案';
        this.reset();
    };
    H5lock.prototype.initDom = function(){
        var wrap = document.createElement('div');         
        var str =   `<p id="title" class="title">绘制解锁图案</p>
                    <a id="updatePassword" style="position: absolute;right: 5px;top: 5px;color:#fff;font-size: 10px;display:none;">重置密码</a>
                    <canvas id="canvas" width="${this.width}" height="${this.height}" style="background-color:${this.canvasBgColor};display: inline-block;margin-top: 15px;"></canvas>`;
        wrap.setAttribute('style','position: absolute;top:0;left:0;right:0;bottom:0;');
        wrap.innerHTML = str;
        document.body.appendChild(wrap);
    };
    H5lock.prototype.reset = function() {
        this.makeState();
        this.createCircle();
    };
    H5lock.prototype.bindEvent = function() {
        var self = this;
        this.canvas.addEventListener("touchstart", function (e) {
            console.log(self.lastPoint)
            e.preventDefault();// 某些android 的 touchmove不宜触发 所以增加此行代码
             var po = self.getPosition(e);
             console.log(po);
             for (var i = 0 ; i < self.arr.length ; i++) {
                if (Math.abs(po.x - self.arr[i].x) < self.r && Math.abs(po.y - self.arr[i].y) < self.r) {
                    self.touchFlag = true;
                    self.drawPoint(self.arr[i].x,self.arr[i].y);
                    self.lastPoint.push(self.arr[i]);
                    self.restPoint.splice(i,1);
                    break;
                }
             }
         }, false);
         this.canvas.addEventListener("touchmove", function (e) {
            if (self.touchFlag) {
                self.update(self.getPosition(e));
            }
         }, false);
         this.canvas.addEventListener("touchend", function (e) {
            
             if (self.touchFlag) {
                 self.touchFlag = false;
                
                 self.storePass(self.lastPoint);
                
                 setTimeout(function(){
                    self.reset();
                }, 300);

             }
             console.log(self.lastPoint)


         }, false);
         document.addEventListener('touchmove', function(e){
            e.preventDefault();
         },false);
         document.getElementById('updatePassword').addEventListener('click', function(){
             self.updatePassword();
          });
    };
    H5lock.prototype.init = function() {
        this.initDom();
        this.pswObj = window.localStorage.getItem('passwordxx') ? {
            step: 2,
            spassword: JSON.parse(window.localStorage.getItem('passwordxx'))
        } : {};
        this.lastPoint = [];
        this.makeState();
        this.touchFlag = false;
        this.canvas = document.getElementById('canvas');
        this.ctx = this.canvas.getContext('2d');
        this.createCircle();
        this.bindEvent();
    };
})();
复制代码
2.在页面端初始化
 new H5lock({
    chooseType: 3,
    width: 260,
    height:260,
    keyborderColor: '#000',//数字圆颜色
    centerKeyborderColor: '#000', //数字圆圆心颜色
    lineColor: '#000',
    canvasBgColor: '#ccc',
    callback: function(data) {
        let pasw = ''
         data.map(item => {
            pasw += item.index
        })
        console.log(pasw-0, '======>data')
        return false //true
    }
}).init();
复制代码
3.效果图

![]( )

5.最后给个赞吧,熊跌!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值