canvas学习(十四):canvas交互之isPositonInPath

先说说用到的两个方法:

1、isPositonInPath(x,y):判断(x,y)是否在canvas绘制的图形所在路径中。不太理解的可以参考W3School中的“HTML5 canvas isPointInPath() 方法

2、getBoundingClientRect():这个方法用来用来获取元素位置,即获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。getBoundingClientRect是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)。该函数返回一个Object对象,该对象有6个属性:top,lef,right,bottom,width,height;这里的top、left和css中的理解很相似,width、height是元素自身的宽高,但是right,bottom和css中的理解有点不一样。right是指元素右边界距窗口最左边的距离,bottom是指元素下边界距窗口最上面的距离。

然后说说要实现的效果:

在canvas中绘制20个小球,当鼠标点击小球时,小球变红。

具体思路:先在canvas中绘制20个小球,然后在原来小球的位置处再绘制一遍小球但是不填充颜色,再根据鼠标点击的坐标判断是否在某个小球的绘制范围内,若在其中就将小球填充为红色,否则不填充。

具体html页面与以前的相同,这里就不多说了,直接上JS代码:

var ball = [];//用来存放小球
var canvas = null;//用来存放canvas对象,方便后面方法调用
var context2 = null;//用来存放context对象,方便后面方法调用

window.onload=function(){
	var myCanvas = document.getElementById("myCanvas");
	if(myCanvas.getContext("2d")){
		myCanvas.width = document.documentElement.clientWidth-20;
		myCanvas.height = document.documentElement.clientHeight-20;
		
		var context =myCanvas.getContext("2d");
		
		canvas = myCanvas;
		context2 = context;

		//生成20个小球
		var aBall=null;
		for(var i=0;i<20;i++){
			aBall={
				x:Math.random()*myCanvas.width,
				y:Math.random()*myCanvas.height,
				r:Math.random()*50+10
			}
			ball[i]=aBall;//添加到数组中
		}

		//在canvas中绘制小球
		drawBall(context);

		//添加事件:mouseup
		myCanvas.addEventListener("mouseup",detect);		
	}else{
		return false;
	}
}

//该方法用来绘制小球
function drawBall(cxt){
	for(var i=0;i<ball.length;i++){
		cxt.beginPath();
		cxt.arc(ball[i].x,ball[i].y,ball[i].r,0,Math.PI*2);

		cxt.fillStyle="#058";
		cxt.fill();
		cxt.closePath();
	}
}

//当鼠标点击小球时触发该事件
function detect(event){
	var x = event.clientX - canvas.getBoundingClientRect().left;
	var y = event.clientY - canvas.getBoundingClientRect().top;
	
	//每个小球都进行判断,判断(x,y)是否在其中
	for(var i=0;i<ball.length;i++){
		context2.beginPath();
		context2.arc(ball[i].x,ball[i].y,ball[i].r,0,Math.PI*2);
		
		//判断(x,y)是否在canvas绘制的路径中(绘制的每个图形算一个路径)
		if(context2.isPointInPath(x,y)){
			context2.fillStyle="red";
			context2.fill();
		}
	}

}

再来个更舒服点的效果:当鼠标经过某个小球时,小球变红否则小球还是原来的颜色。

实现思路与上个例子相同,代码除触发时间不一样之外其他都一样,因此雷同代码就不在赘述了。这里只粘贴鼠标经过事件及处理方法:

//添加事件:mouseover
myCanvas.addEventListener("mousemove",detect2);

//当鼠标经过小球时触发该事件
function detect2(event){
	var x = event.clientX - canvas.getBoundingClientRect().left;
	var y = event.clientY - canvas.getBoundingClientRect().top;
	//每个小球都进行判断,判断(x,y)是否在其中
	for(var i=0;i<ball.length;i++){
		context2.beginPath();
		context2.arc(ball[i].x,ball[i].y,ball[i].r,0,Math.PI*2);
		
		if(context2.isPointInPath(x,y)){//在其中
			context2.fillStyle="red";
		}else{
			context2.fillStyle="#058";
		}
		context2.fill();
	}
}

最后感谢老师的分享! 

相关推荐