`

canvas学习(十三):clip之图形剪辑

阅读更多

clip方法描述:

canvas本来是一个大的画布,clip方法用来从原始画布中剪切任意形状和尺寸,但是一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内而不能再访问画布上的其他区域。

 

简单实例1:圆形的探照灯

效果如图:

代码如下:

var circular ={x:300,y:300,radius:150,vx:Math.random()*5+5,vy:Math.random()*5+5};
window.onload=function(){
	var myCanvas = document.getElementById("myCanvas");
	if(myCanvas.getContext("2d")){
		myCanvas.width = 600;
		myCanvas.height = 600;
		var context =myCanvas.getContext("2d");
		drawBall(context);			
	}else{
		return false;
	}
}

//该方法用来绘制图形
function drawBall(cxt){
	var canvas = cxt.canvas;
	//清空画布
	cxt.clearRect(0,0,canvas.width,canvas.height);
	
	cxt.save();

	//绘制一个与当前canvas一样大的矩形
	cxt.beginPath();
	cxt.fillStyle="#000";//黑色背景
	cxt.fillRect(0,0,canvas.width,canvas.height);
	cxt.closePath();
	
	//从原来的画布中剪辑出一个圆形
	cxt.beginPath();
	cxt.arc(circular.x,circular.y,circular.radius,0,Math.PI*2);
	cxt.fillStyle="#fff";//白色背景
	cxt.fill();
	//clip():从原始画布中剪切任意形状和尺寸。
	//一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)
	cxt.clip();
	cxt.closePath();

	//绘制内容
	cxt.font="bold 120px Arial";
	cxt.textAlign = "center";
	cxt.textBaseline = "middle";
	cxt.fillStyle = "#058";
	cxt.fillText("CANVAS",canvas.width/2,canvas.height/4);
	cxt.fillText("CANVAS",canvas.width/2,canvas.height/2);
	cxt.fillText("CANVAS",canvas.width/2,canvas.height*3/4);

	cxt.restore();
}

 

简单实例2:动态的圆形探照灯

这个实例效果与第一个实例大同小异,只是第一个是静态的,这个是动态的。所以就直接上代码吧:

var circular ={x:300,y:300,radius:150,vx:Math.random()*5+5,vy:Math.random()*5+5};
//....获取canvas对象与绘制圆形代码与上面的相同,此处就一一省略了
window.setInterval(function(){
	drawBall(context);
	update(myCanvas.width,myCanvas.height,0);
},40);
//更新圆形运动路径
function update(width,height){
	circular.x +=circular.vx;
	circular.y +=circular.vy;

	if(circular.x-circular.radius<=0){
		circular.vx = -circular.vx;
		circular.x=circular.radius;
	}

	if(circular.x+circular.radius>=width){
		circular.vx = -circular.vx;
		circular.x=width-circular.radius;
	}

	if(circular.y-circular.radius<=0){
		circular.vy = -circular.vy;
		circular.y=circular.radius;
	}

	if(circular.y+circular.radius>=height){
		circular.vy = -circular.vy;
		circular.y=height-circular.radius;
	}
}

 

简单实例3:动态的五角星探照灯(旋转角度发生变化)

 效果如图:


代码如下:(获取canvas对象等代码与第一个实例相同,此处就不赘述了)

var circular ={x:300,y:300,radius:150,vx:Math.random()*5+5,vy:Math.random()*5+5};
var rot=0;
window.setInterval(function(){
	drawStar(context);
	//改变旋转角度
	update(myCanvas.width,myCanvas.height);
},40);

//绘制一个五角星的探照灯
function drawStar(cxt){		
	var canvas = cxt.canvas;
	//清空画布
	cxt.clearRect(0,0,canvas.width,canvas.height);
	
	cxt.save();

	//绘制一个与当前canvas一样大的矩形
	cxt.beginPath();
	cxt.fillStyle="#000";//黑色背景
	cxt.fillRect(0,0,canvas.width,canvas.height);
	cxt.closePath();
	
	//从原来的画布中剪辑出一个五角星
	cxt.save();
	cxt.translate(circular.x,circular.y);//设置偏移量
	cxt.rotate(rot/180*Math.PI);//设置旋转弧度
	//将每个星星的宽度和高度都缩放R倍
	cxt.scale(circular.radius,circular.radius);//使用缩放让每个星星的大小不一样(因为scale会使lineWidth随着缩放,所以此处不再设置边框的一些属性)
	drawStarPath(cxt);//绘制一个大小相同的五角星
	
	cxt.fillStyle="#fff";//白色背景
	cxt.lineJoin="round";//边角		
	//先填充,后描边
	cxt.fill();
	cxt.restore();
	cxt.clip();

	//绘制内容
	cxt.font="bold 120px Arial";
	cxt.textAlign = "center";
	cxt.textBaseline = "middle";
	cxt.fillStyle = "#058";
	cxt.fillText("CANVAS",canvas.width/2,canvas.height/4);
	cxt.fillText("CANVAS",canvas.width/2,canvas.height/2);
	cxt.fillText("CANVAS",canvas.width/2,canvas.height*3/4);

	cxt.restore();
}

/**
*该方法用来绘制一个没有偏移量的五角星的各条边
*@param cxt:canvas的上下文环境
*/
function drawStarPath(cxt){
	//绘制五角星
	cxt.beginPath();
	for(var i=0;i<5;i++){
		//绘制大圆中的五个角
		//第一个角为18度,以后大圆的每个角都是(18+72的倍数)度
		//(18+i*72)/180*Math.PI:将角度转换成弧度
		//因为绘制五角星的坐标系y轴与普通的坐标系相反,x轴以上为负数,x轴以下为正数,所以此处y轴的坐标为负数
		cxt.lineTo(Math.cos((18+i*72)/180*Math.PI),-Math.sin((18+i*72)/180*Math.PI));
		//绘制小圆中的五个角
		//与大圆的各个角一致,第一个角为54度,以后每个角都是(54+72的倍数)度
		//每个星星的小圆半径默认为大圆半径的一半
		cxt.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5,-Math.sin((54+i*72)/180*Math.PI)*0.5);
	}
	cxt.closePath();
}

//update方法与实例2中的update方法相同,只是在第一行添加代码:
rot += Math.random()*2;

 

简单实例4:动态的五角星探照灯(半径发生变化)

效果如图:

 代码如下:(获取canvan对象、绘制五角星以及调用方法与实例3相同,此处就不赘述了,只写update代码)

//修改五角星的半径
function update2(width,height){
	if(circular.radius>400){
		isIncrease = false;
	}else if(circular.radius<150){
		isIncrease = true;
	}

	if(isIncrease){circular.radius +=5;}
	else{circular.radius -=5;}
}

完整代码已经上传到附件,有需要的可以下载。

最后,感谢老师的分享!

  • 大小: 17.6 KB
  • 大小: 15.8 KB
  • 大小: 13.4 KB
  • 大小: 31.6 KB
分享到:
评论

相关推荐

    HTML5 Canvas核心技术 图形、动画与游戏开发

    - **1.2.1 2D绘图环境**:这是`canvas`中最常用的一种绘图环境,提供了一系列方法用于绘制基本图形,如线条、矩形等。 - **1.2.2 canvas状态的保存与恢复**:为了便于多次修改绘图环境而不丢失原始状态,可以使用`...

    5.6 应用canvas中clip剪辑区域|在PC端实现项目主体逻辑|canvas项目综合实战|Canvas图形、动画、游戏开发从入门到精通全系列课程

    5.6_应用canvas中clip剪辑区域|在PC端实现项目主体逻辑|canvas项目综合实战|Canvas图形、动画、游戏开发

    2.33 clip和剪辑区域|Canvas高级内容|Canvas图形、动画、游戏开发从入门到精通全系列课程

    2.33_clip和剪辑区域|Canvas高级内容|Canvas图形、动画、游戏开发从入门到精通全系列课程

    HTML5 Canvas核心技术 图形、动画与游戏开发.pdf

    - 剪辑区域(clip())限制绘制的区域。 通过这本书,读者将能够掌握HTML5 Canvas的核心概念和技术,为创建复杂的图形应用和游戏打下坚实的基础。无论是初学者还是有经验的开发者,都能从中受益,提升自己的Web开发...

    canvas裁剪

    除了基本的裁剪,Canvas还提供了`clip()`方法,它可以创建一个剪辑区域。这个剪辑区域定义了后续绘图操作的限制范围。当调用`clip()`后,所有在Canvas上的绘制都会被限制在这个区域内,直到新的路径或清除剪辑区域的...

    基于canvas剪辑区域功能实现橡皮擦效果

    本教程将深入探讨如何利用Canvas的剪辑区域(clip())功能来实现橡皮擦效果,这对于创建交互式绘图应用或在线编辑器非常有用。 首先,我们需要在HTML文档中创建一个Canvas元素,并为其设置合适的样式。以下是一个...

    canvas红包照片实例分享

    - 使用`context.beginPath()`开始一个新的路径,并用`context.arc()`画出圆形的剪辑区域,然后使用`context.clip()`裁剪画布,只保留圆形区域内图像。 - 再次调用`context.drawImage()`,这次仅绘制剪辑后的部分,...

    html5 课件资源

    ### HTML5 Canvas 知识点详解 #### 一、Canvas 概述与基本概念 - **Canvas** 是 ...通过以上知识点的学习,我们可以更好地理解 HTML5 Canvas 的绘图机制,并能够利用这些工具来创作出各种复杂的图形和动画效果。

    图片的剪裁

    这个对象包含了对canvas进行绘图的各种方法,比如`drawImage`用于绘制图片,`clip`用于定义剪裁区域,以及`draw`用于将所有操作提交并显示在界面上。 图片剪裁的核心步骤如下: 1. **加载图片**:使用`wx....

    flash 教程笔记

    - **影片剪辑元件**(Movie Clip Symbols):包含动画序列的独立实体。 #### 二、创建与编辑图形 **知识点6:画布设置** - **画布尺寸**(Canvas Size):通常设置为800x600像素或468x60标准Banner尺寸。 **知识...

    flash 快速入门

    理解影片剪辑(Movie Clip)、图形(Shape)和按钮(Button)三种符号类型的区别,以及如何创建、编辑和实例化符号,能提高工作效率。 四、时间轴与动画 时间轴是Flash中制作动画的关键。学习如何在时间轴上创建...

    flash图片轮播广告代码

    - **MC(Movie Clip)**:电影剪辑,是可重复使用的动画或静态图形,可以在时间轴上独立播放。 2. **实现步骤**: - **创建舞台和帧**:首先,在Flash中创建一个新的文档,设置舞台大小,然后根据需求在时间轴上...

    unity3dsd.rar

    通过学习这两个文档,开发者不仅可以掌握Unity的基础操作,还能深入理解其工作原理,从而提高项目开发效率,创造出更加丰富和生动的游戏世界。无论是初学者还是有经验的开发者,都能从中受益匪浅。

    unity3d中文api

    4. **图形渲染**:介绍Mesh、Material、Shader等内容,帮助开发者理解如何构建和控制游戏画面的显示效果。 5. **物理系统**:包括Rigidbody、Collider、Joint等,用于模拟现实世界的物理行为。 6. **动画系统**:...

    Silverlight2.0功能展示Demo源码

    1、Silverlight(3) - 2.0控件之Border, Button, Calendar, Canvas, CheckBox, ComboBox 介绍 Silverlight 2.0 控件一览:Border, Button, Calendar, Canvas, CheckBox, ComboBox 2、Silverlight(4) - 2.0控件之...

    用HTML5 实现橡皮擦的涂抹效果的教程

    总的来说,通过本次教程的学习,读者应该能够理解HTML5 Canvas API实现橡皮擦效果的基本原理,包括如何通过设置剪辑区域来控制清除区域,以及如何处理鼠标或触摸事件来实现连续的涂抹效果。这些知识将有助于开发者...

Global site tag (gtag.js) - Google Analytics