点击不能实现画圆划线

点击不能实现画圆划线

(function(){
	window.canvasLock= function(obj){
		this.height = obj.height;
		this.width = obj.width;
		this.chooseType = obj.chooseType;
	};
	//动态生成dom
	canvasLock.prototype.initDom = function(){
		var wrap=document.createElement('div');
		var str='<h4 id="title" class="title">绘制解锁图案</h4>';
		wrap.setAttribute('style','position: absolute;top:0;left:0;bottom:0;');


		var canvas= document.createElement('canvas');
		canvas.setAttribute('id','canvas');
		canvas.style.cssText= 'background-color:#305066;display:inline-block;margin-top:15px;';


		wrap.innerHTML=str;
		wrap.appendChild(canvas);

		var width = this.width || 300;
		var height = this.height || 300;
       
       document.body.appendChild(wrap);

       //高清屏锁放
       canvas.style.width= width+"px";
       canvas.style.height=height+"px";

       canvas.width = width;
       canvas.height = height;
	}

	canvasLock.prototype.drawCle =function(x,y){//初始化解锁密码面板
		this.ctx.strokeStyle = '#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();
	}
	canvasLock.prototype.createCircle =function(){//创建解锁点的坐标,根 
		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.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);
		}
	}

	//程序初始化
	canvasLock.prototype.init= function(){
		this.initDom();
		this.canvas = document.getElementById('canvas');
		this.ctx = this.canvas.getContext('2d');

		//1.确定半径
		//2.确定每个圆心坐标
		//3.14个半径一行 
		this.createCircle();
		this.bindEvent();
	}
	canvasLock.prototype.bindEvent = function(){
		var self = this;

		this.canvas.addEventListener("touchstart",function(e){
			//判断点击的位置是否在圆内
			//lastpoint, 

			var po = self.getPosition(e);
			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.lastPoint.push(self.arr[i]);
					self.restPoint.splice(i,1);
					break;
				}
			}
		},false);

		this.canvas.addEventListener("touchmove",function(e){
			console.log(111)
			if(self.touchFlag){
				self.update(self.getPositon(e));
			}
		},false);

		this.canvas.addEventListener("touchend",function(e){},false);

		canvasLock.prototype.getPosition = function(e){
			var rect=e.currentTarget.getBoundingClientRect();
			var po ={
				//触摸点的到视口位置
				x:(e.touches[0].clientX-rect.left),
				y:(e.touches[0].clientY-rect.top)
			};
			return po;
		}
		
		canvasLock.prototype.update = function(po){
           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.drawLine(po);//
		}
		canvasLock.prototype.drawPoint = function(){
			//初始化圆心
			for(var i = 0 ; i <this.lastPoint.length; i++){
				this.ctx.fillStyle = '#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();
			}
		};
		canvasLock.prototype.drawLine = function(){
			//
			this.ctx.beginPath();
			this.ctx.lineWidth = 3;
			this.ctx.moveTo(this.lastPoint[0].x,this.lastPoint[0].y);
			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();
		};

	}
})();


<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>Document</title>
<style>
body{
text-align: center;
background: #305066;
color
}
h4{
color: #22c3aa;
}
</style>
</head>
<body>

<script type="text/javascript" src="index.js"></script>
<script type="text/javascript">
//1.生成背景
//2.动态title生成
//3.用js动态生成canvas
//4.用js动态生成h3和
new canvasLock({chooseType:3}).init();
</script>
</body>
</html>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你好,如下,是可以绘制的呀,这里是要在移动端的,所以可以f12,可参考下图设置下。

http://img1.sycdn.imooc.com//climg/5af1175b0001fd9f09870512.jpg

祝学习愉快~

  • chenqianguan 提问者 #1
    非常感谢!
    2018-05-08 16:46:26
好帮手慕糖 2018-05-08 10:10:59

你好,1、如下,单词拼写错误,少了一个i,认真检查下代码。

http://img1.sycdn.imooc.com//climg/5af106c500011f6f04850095.jpg

2、drawLine这里要有参数po。且LineTo的o要是小写。

http://img1.sycdn.imooc.com//climg/5af106fd000105f205900378.jpg

祝学习愉快~

  • 提问者 chenqianguan #1
    谢谢,修改后点击还是不能绘制圆和直线
    2018-05-08 10:42:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师