H5_Node4_Canvas1-基本路径&简单图形&文字&图形阴影 绘制

本文介绍Canvas的基本使用方法,包括创建画布、绘制路径、图形、文字及阴影效果,并通过实例展示了碰撞反弹和拖拽画画的功能。
-->Canvas的基础知识
-->基本路径的绘制
-->绘制简单图形
-->文字的绘制
-->图形的阴影



一、Canvas的基础知识

<canvas>标签的基本结构如下:
<canvas id="myCanvas" width="200" height="200">< /canvas>
canvas元素自身有两个属性:width和height,除此之外,canvas还拥有所有主要的HTML5属性,
比如说class、id和 name等。id属性被用在上面所示的代码中,JavaScript使用这里创建的canvas的id来表示要在上面绘画的画布。
JavaScript使用document.getElementById()方法来确定正确的画布,如下面代码所示:
var cvs = document.getElementById("myCanvas");

IE 6 7 8不支持 <canvas>标签

每个画布都必须要有一个context(上下文)的定义,
如下面代码所示。就目前的情况来说,官方规范只承认一个2D环境:
var ctx = cvs.getContext("2d");
在标识画布并指明了它的上下文之后,就可以开始绘画了
  

二、基本路径的绘制

ctx.beginPath() :开始一个路径
ctx.moveTo(x,y): 路径移到画布中的指定点 , 即起点
ctx.lineTo(x,y) :添加一个新点,画线
......
ctx.closePath() :关闭绘制路径
ctx.fillStyle:用来设置填充颜色
ctx.fill() :填充已定义好的路径
ctx.lineWidth:画线的宽度
ctx.strokeStyle:用来设置描边颜色
ctx.stroke() :绘制已定义好的路径


三、绘制简单图形


1、矩形的绘制

rect(x,y,w,h):

x、y为起始坐标,w、h为矩形的宽、高

支持这么写:

ctx.fillRect(x,y,w,h) 

ctx.strokeRect(x,y,w,h)



2、圆形的绘制
arc(x,y,r,sa,ea,true/false):
x、y为圆心坐标,r为半径,
sa、ea分别为起始角度和结束角度,
true是逆时针画圆,false是顺时针画圆;
360度角即2PI弧度,1度就是2PI/360=PI/180弧度,
90度就是2PI/360*90=PI/2弧度(其他的角度自行计算)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas-绘图流程</title>
<style>
*{margin:0;padding:0;list-style: none;}
#myCanvas{
	margin:20px auto 0;
	background: #eee;
	border:1px solid #666;
}
</style>
</head>
<body>
	<canvas id="myCanvas"width="800" height="800">亲,别再用古董浏览器了
	!</canvas>
</body>
<script>
/*绘制图形-流程*/
	//绘制三角形--填充颜色
	var cvs=document.getElementById('myCanvas');//画纸
	var ctx=cvs.getContext('2d');//画笔
	ctx.beginPath();//开始一个路径
	ctx.moveTo(50,50);//起点
	ctx.lineTo(350,50);//添加一个新点-画线
	ctx.lineTo(200,200);//路径点
	// ctx.lineTo(50,50);
	ctx.closePath();//关闭绘制路径--自动闭合终点和起点
	ctx.fillStyle='green';//设置填充颜色
	ctx.fill();//填充已定义好的路径
	//绘制三角形--边框
	ctx.beginPath();//开始一个路径
	ctx.moveTo(400,50);//起点
	ctx.lineTo(700,50);//添加一个新点-画线
	ctx.lineTo(550,200);//路径点
	// ctx.lineTo(50,50);
	ctx.closePath();//关闭绘制路径--自动闭合终点和起点
	ctx.lineWidth=4;//绘制线宽4px
	ctx.strokeStyle='red'//设置描边颜色
	ctx.stroke();//绘制已定义好的路径


	//绘制一个矩形
	ctx.beginPath();//开始一个路径
	ctx.moveTo(50,250);//起点
	ctx.lineTo(350,250);//添加一个新点-画线
	ctx.lineTo(350,400);//路径点
	ctx.lineTo(50,400);//路径点
	// ctx.lineTo(50,50);
	ctx.closePath();//关闭绘制路径--自动闭合终点和起点
	ctx.fillStyle='red';//设置填充颜色
	ctx.fill();//填充已定义好的路径
	ctx.lineWidth=4;//绘制线宽4px
	ctx.strokeStyle='#333'//设置描边颜色
	ctx.stroke();//绘制已定义好的路径
	//绘制矩形快速方法
	ctx.beginPath();
	ctx.rect(400,250,300,150);
	ctx.closePath();
	ctx.fillStyle='blue';//设置填充颜色
	ctx.fill();//填充已定义好的路径
	ctx.lineWidth=4;//绘制线宽4px
	ctx.strokeStyle='orange'//设置描边颜色
	ctx.stroke();//绘制已定义好的路径
	//绘制矩形快速方法
	ctx.beginPath();
	ctx.fillStyle='orange';//若不设置会继承上面动画的颜色
	ctx.fillRect(50,450,300,100);
	ctx.strokeStyle='blue';
	ctx.strokeRect(50,450,300,100);
	ctx.closePath();


	//圆形绘制
	ctx.beginPath();
	ctx.arc(450,500,80,0,2*Math.PI,false);
	ctx.closePath();
	ctx.fillStyle='red';
	ctx.fill();
	//半圆
	ctx.beginPath();
	ctx.arc(650,500,80,0,Math.PI,true);
	ctx.closePath();
	ctx.fillStyle='red';
	ctx.fill();
	//半圆
	ctx.beginPath();
	ctx.arc(650,500,80,0,Math.PI,false);
	ctx.closePath();
	ctx.fillStyle='blue';
	ctx.fill();
</script>
</html>
<!-- IE 6 7 8不支持 <canvas>标签 -->


3、贝塞尔曲线

quadraticCurveTo (cx,cy,ex,ey)
二次贝塞尔曲线,一个控制点,一个结束点


bezierCurveTo (cx1,cy1,cx2,cy2,ex,ey)
三次贝塞尔曲线,两个控制点,一个结束点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas-绘制贝塞尔曲线</title>
<style>
*{margin:0;padding:0;list-style: none;}
#myCanvas{
	margin:20px auto 0;
	background: #eee;
	border:1px solid #666;
}
</style>
</head>
<body>
	<canvas id="myCanvas"width="600" height="600">亲,别再用古董浏览器了
	!</canvas>
</body>
<script>
	var cvs=document.getElementById('myCanvas');//画纸
	var ctx=cvs.getContext('2d');//画笔
	//二次贝塞尔曲线,一个控制点,一个结束点
	ctx.beginPath();//开始一个路径
	ctx.moveTo(66,34);//起点
	ctx.quadraticCurveTo(551,50,220,57);
	ctx.lineWidth=4;
	ctx.strokeStyle='red';
	ctx.stroke();
	ctx.closePath();//关闭绘制路径--自动闭合终点和起点
	
	//三次贝塞尔曲线,两个控制点,一个结束点
	ctx.beginPath();//开始一个路径
	ctx.moveTo(62,180);//起点
	ctx.bezierCurveTo(398,333,56,100,277,151);
	ctx.lineWidth=4;
	ctx.strokeStyle='#666';
	ctx.stroke();
	ctx.closePath();
</script>
</html>
<!-- IE 6 7 8不支持 <canvas>标签 -->


四、文字的绘制

fillText(text,x,y,maxWidth): 填充绘制
text表示文字      x、y为坐标
maxWidth可选,为文字最大宽度,防止文字溢出

strokeText(text,x,y,maxWidth): 描边绘制
text表示文字      x、y为坐标
maxWidth可选,为文字最大宽度,防止文字溢出;


常用属性设置:
font 文本内容的当前字体属性
示例: ctx.font = 'bold 60px 微软雅黑';
textAlign 文本内容的当前对齐方式
示例: ctx.textAlign=“left/center/right”; 
textBaseline 绘制文本时使用的当前文本基线
示例: ctx.textBaseline=“ top/middle/ bottom ”;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas-filltext-绘制文字</title>
<style>
*{margin:0;padding:0;list-style: none;}
#myCanvas{
	background: #eee;
	border:1px solid #666;
}
.box{
	width:400px;
	height:200px;
	border:1px solid red;
	position: absolute;
	left:200px;
	top:100px;
}
</style>
</head>
<body>
	<!-- 画布宽高写在标签里- -->
	<canvas id="myCanvas" width="600" height="600">亲,别再用古董浏览器了
	!</canvas>
	<div class="box"></div>
	<button id="btn">清除</button>
</body>
<script>
	var cvs=document.getElementById('myCanvas');//画纸
	var ctx=cvs.getContext('2d');//画笔

	ctx.beginPath();
	ctx.font='bold 60px 微软雅黑';
	// ctx.textBaseline='bottom';//textBaseline 绘制文本时使用的当前文本基线
	ctx.textBaseline='middle';
	// ctx.textBaseline='top';
	// ctx.textAlign='center';//对齐方式
	ctx.fillText('画布填充文字',200,100);
	ctx.closePath();

	btn.onclick=function(){
		ctx.clearRect(0,0,400,200);//清除局部画布
		// ctx.clearRect(0,0,cvs.width,cvs.height);//清除局部画布
	}
</script>
</html>


五、图形的阴影

阴影属性:
shadowColor:设置阴影颜色
shadowBlur:设置阴影模糊级别
shadowOffsetX:设置阴影在x轴上距离图形的距离
shadowOffsetY:设置阴影在y轴上距离图形的距离
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas-图形的阴影</title>
<style>
*{margin:0;padding:0;list-style: none;}
#myCanvas{
	margin:20px auto 0;
	background: #eee;
	border:1px solid #666;
}
</style>
</head>
<body>
	<canvas id="myCanvas"width="600" height="600">亲,别再用古董浏览器了
	!</canvas>
</body>
<script>
	var cvs=document.getElementById('myCanvas');//画纸
	var ctx=cvs.getContext('2d');//画笔

	ctx.beginPath();
	ctx.arc(150,150,100,0,2*Math.PI,true);
	ctx.closePath();
	ctx.shadowColor='red';
	ctx.shadowBlur=20;
	ctx.shadowOffsetX=10;
	ctx.shadowOffsetY=10;
	ctx.fillStyle='blue';
	ctx.fill();

	ctx.beginPath();
	ctx.arc(400,150,100,0,2*Math.PI,true);
	ctx.closePath();
	ctx.shadowColor='red';
	ctx.shadowBlur=20;
	ctx.shadowOffsetX=5;
	ctx.shadowOffsetY=5;
	ctx.fillStyle='#fff';
	ctx.fill();

	ctx.beginPath();
	ctx.fillStyle='blue';
	ctx.shadowColor='#000';
	ctx.shadowBlur=10;
	ctx.shadowOffsetX=5;
	ctx.shadowOffsetY=5;
	ctx.fillRect(50,300,200,100);
	ctx.closePath();
	

	ctx.beginPath();
	ctx.fillStyle='green';
	ctx.shadowColor='#000';
	ctx.shadowBlur=10;
	ctx.shadowOffsetX=-5;
	ctx.shadowOffsetY=-5;
	ctx.fillRect(300,300,200,100);
	ctx.closePath();
	
</script>
</html>
<!-- IE 6 7 8不支持 <canvas>标签 -->


六、清除画布

ctx.clearRect(x,y,width,height):
x : 清除起点横坐标
y : 清除起点纵坐标
width : 清除长度
height : 清除高度

清除画布:
ctx.clearRect(0,0,cvs.width,cvs.height);

用canvas实现各种效果:

1-canvas-碰壁反弹:

<span style="font-size:14px;"><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas-碰壁反弹</title>
<style>
*{margin:0;padding:0;list-style: none;}
#myCanvas{
	background: #eee;
	border:1px solid #666;
}
.box{
	width:800px;
	height: 600px;
	margin:0 auto;
}
</style>
</head>
<body>
<div class="box">
	<canvas id="myCanvas"width="800" height="600">亲,别再用古董浏览器了
	!</canvas>
</div>
</body>
<script>
	var cvs=document.getElementById('myCanvas');//画纸
	var ctx=cvs.getContext('2d');//画笔
	var x=0,y=0;
	var flagh=true,flagv=true;//标记运动方向
	setInterval(function(){
		//每次画之前清除之前画的
		ctx.clearRect(0,0,cvs.width,cvs.height);
		if (flagh) {
			x++;
			if (x>=cvs.width-50) {
				flagh=false;
			}
		}else{
			x--;
			if (x<=0) {
				flagh=true;
			}
		}
		if (flagv) {
			y++;
			if (y>=cvs.height-50) {
				flagv=false;
			}
		}else{
			y--;
			if (y<=0) {
				flagv=true;
			}
		}
		ctx.beginPath();
		ctx.fillStyle='blue';
		ctx.fillRect(x,y,50,50);
		ctx.closePath();
	},2)
</script>
</html></span>


2-canvas-拖拽画画:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas-拖拽画画</title>
<style>
*{margin:0;padding:0;list-style: none;}
body{background: #000;}
#myCanvas{
	background: #eee;
	border:1px solid #666;
	cursor:pointer;
}
.box{
	width:1000px;
	height: 600px;
	margin:0 auto;
}
</style>
</head>
<body>
<div class="box">
	<canvas id="myCanvas"width="1000" height="600">亲,别再用古董浏览器了
	!</canvas>
	<button id="btn">清除</button>
</div>
</body>
<script>
	var cvs=document.getElementById('myCanvas');//画纸
	var ctx=cvs.getContext('2d');//画笔
	var x=0,y=0;
	var btn=document.getElementById('btn');
	btn.onclick=function(){
		ctx.clearRect(0,0,cvs.width,cvs.height);
	}
	cvs.onmousedown=function(ev){
		var e=ev||window.event;
		x=e.clientX-cvs.offsetLeft;//起点X
		y=e.clientY-cvs.offsetTop;//起点Y
		ctx.beginPath();
		ctx.moveTo(x,y);
		document.onmousemove=function(ev){
			var e=ev||window.event;
			x=e.clientX-cvs.offsetLeft;//移动点X
			y=e.clientY-cvs.offsetTop;//移动点Y
			ctx.lineTo(x,y);
			ctx.lineWidth=4;
			ctx.strokeStyle='red'
			ctx.stroke();
		}
		document.onmouseup=function(){
			// ctx.closePath();
			document.onmousemove=null;
		}
	}
</script>
</html>




















































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值