`

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();
	}
}

最后感谢老师的分享! 

分享到:
评论

相关推荐

    Html5 Canvas的充分运用:实用示例

    - `drawRect()`: 绘制矩形,是Canvas的基础操作之一。 - `fillStyle` 和 `strokeStyle`:设置填充色和边框色。 - `beginPath()`, `moveTo()`, `lineTo()`: 用于路径绘制,创建图形的轮廓。 2. **图形绘制** - ...

    Canvas入门实例01:猜字母

    在这个实例中,我们将学习Canvas的基本用法,包括画布的设置、文本渲染以及用户事件处理。Canvas是HTML5中的一个强大特性,允许开发者在网页上动态绘制2D图形,为网页增添丰富的视觉效果和交互性。 首先,Canvas是...

    canvas保存为data:image扩展功能的实现

    这篇博客"canvas保存为data:image扩展功能的实现"探讨了如何将Canvas的内容转化为data:image格式的图片,这是一种常见的数据URL模式,可以直接在浏览器中显示或用于网络传输。 在Web开发中,我们常常需要将用户在...

    Delphi6 Canvas画特效图片:颜色渐变

    说明:Delphi6 Canvas画特效图片:颜色渐变 核心技术:DelphiTColor(R,G,B:Integer):TColor; Google搜索:inttohex(,stringtocolor(,DelphiTColor(,ColortoRGB(,垂直翻转,Bitmap

    canvas学习(十六):绘制时钟

    在本篇【canvas学习(十六):绘制时钟】中,我们将探讨HTML5中的Canvas API,它是Web开发中用于在网页上动态绘制图形的强大工具...通过深入理解这些概念,你可以利用Canvas API创建更复杂、交互性更强的Web图形应用。

    html5 canvas交互式数据图表插件代码

    在这个“html5 canvas交互式数据图表插件代码”中,我们可以深入学习如何利用Canvas API来实现数据可视化。 1. HTML5 Canvas基础: HTML5 Canvas是一个基于矢量图形的画布元素,通过JavaScript API来控制绘图。...

    canvas学习(二):弹跳小球

    在本篇【canvas学习(二):弹跳小球】中,我们将深入探讨HTML5的Canvas元素以及如何利用它来创建动态的、交互式的弹跳小球效果。Canvas是HTML5的一个重要特性,允许开发者在网页上进行动态图形绘制,为网页增添了...

    canvas学习(十二):图形透明及交叠效果设置

    在canvas学习中,图形透明及交叠效果是两个重要的概念,它们可以让我们创建出丰富的视觉效果和动态交互。本文将详细解析这两个知识点,并通过提供的标签和文件名来具体阐述。 首先,我们来看“图形透明”这个概念。...

    canvas.ts:Node.js Canvas LMS客户端

    Canvas.ts选择Node.js作为基础,意味着开发者可以使用熟悉的JavaScript语法来处理与Canvas LMS的交互,大大降低了学习曲线。 Canvas LMS的API则是一套用于与系统进行数据交换的接口。通过API,开发者可以实现自动化...

    HTML5 Canvas核心技术源码技术代码

    Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、...

    html2canvas最新版本git下载的

    包含的有:...当浏览器不支持Canvas时,将采用Flashcanvas或ExplorerCanvas技术代替实现。以下浏览器能够很好的支持该脚本:Firefox 3.5+, Google Chrome, Opera新的版本, IE9以上的浏览器。

    HTML5Canvas开发详解(第2版)

    本书是Canvas的畅销图书,它在上一版的基础上,通过讲解如何开发可交互式多媒体应用,引导读者学习HTML5 Canvas。通过本书,你将学到如何使用Canvas进行绘图、渲染文字、处理图像、创建动画,而这些是开发交互式Web...

    html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片

    2. background(字符串类型,默认为"#fff"):Canvas的背景颜色,如果DOM中未指定则默认透明。 3. proxy(字符串类型,默认为undefined):跨域图片加载时使用的代理地址,如果留空则不会加载跨域图片。 4. ...

    HTML5 Canvas核心技术—图形、动画与游戏开发一书源代码

    - **绘图上下文**:Canvas API主要通过`&lt;canvas&gt;`元素和它的`2d`绘图上下文来操作,这个上下文提供了一系列方法用于画线、填充形状、绘制图像等。 - **坐标系统**:Canvas的坐标系统以左上角为原点,X轴向右,Y轴...

    html2canvas 1.0.0-rc.5

    低版本HTML2canvas 前端开发 生成海报 截图等功能 1.该脚本允许您直接在用户浏览器上对网页或其部分进行“截图”。屏幕截图基于 DOM,因此可能不是 100% 准确到真实表示,因为它不会制作实际的屏幕截图,而是根据...

    H5 Canvas鼠标粒子交互式特效.zip

    在本文中,我们将深入探讨如何使用HTML5 Canvas和JavaScript实现鼠标粒子交互式特效。这个特效允许用户自定义粒子的数量、...通过不断学习和实践,开发者可以进一步扩展这些效果,创建出更多令人惊叹的交互式网页元素。

    openlayers使用imageCanvas加载矢量元素

    OpenLayers 是一个强大的开源JavaScript库,用于在Web浏览器中创建交互式的地图应用。它支持多种数据源和图层类型,包括矢量数据。在OpenLayers中,你可以利用`ImageCanvas`策略来动态加载和渲染矢量元素。这种方法...

    小程序canvasDemo

    在微信小程序中,Canvas是一个非常重要的组件,它允许开发者在页面上进行动态绘图,创建丰富的交互体验。这个"小程序canvasDemo"项目就是一个用于展示如何使用canvas功能的实例。在这个项目中,我们将深入探讨以下几...

    WPF经典教程之Canvas、InkCanvas布局

    **WPF经典教程之Canvas布局** Canvas是WPF中一种特殊的布局控件,它允许开发者对子元素进行绝对定位。在Canvas中,每个子元素的位置是通过设置`Canvas.Left`、`Canvas.Right`、`Canvas.Top`和`Canvas.Bottom`属性来...

    HTML Canvas 学习过程中的一些代码.zip

    HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 ...

Global site tag (gtag.js) - Google Analytics