首页 前端知识 【html5】10-Canvas画布(2)

【html5】10-Canvas画布(2)

2024-06-14 23:06:01 前端知识 前端哥 159 370 我要收藏

目录

1 绘制虚线

2 绘制动画效果

 2.1绘制图形-快速绘制矩形

2.2 动画矩形

3 绘制文本

4 绘制图片

4.1 绘制图片1

4.2 绘制图片2

4.3 绘制图片3

4.4 解决绘制图片失真效果

5 绘制圆弧

5.1 绘制圆弧

5.2 绘制圆弧上任意一点

6 平移【坐标系圆点的平移】 

7 旋转【坐标系旋转】 

8 伸缩

9 练习


1 绘制虚线

原理:

设置虚线其实就是设置实线与空白部分直接的距离,利用数组描述其中的关系

例如: [10,10]  实线部分10px 空白部分10px

例如: [10,5]  实线部分10px 空白部分5px

例如: [10,5,20]  实线部分10px  空白5px  实线20px  空白部分10px 实线5px 空白20px....

绘制:

     ctx.setLineDash(数组);

     ctx.stroke();

例如:

    ctx.moveTo(100, 100);

    ctx.lineTo(300, 100);

    ctx.setLineDash([2,4]);

    ctx.stroke();

注意:

    如果要将虚线改为实线,只要将数组改为空数组即可。

 

<body>
	<canvas width="600" height="400"></canvas>
	<script type="text/javascript">
		//获取canvas画布对象
		var canvas = document.querySelector("canvas");
		//获取绘图上下文
		var ctx = canvas.getContext("2d");

		ctx.strokeStyle = "red";
		ctx.moveTo(100, 50);
		ctx.lineTo(400, 50);
		ctx.setLineDash([20, 20]);//1
		ctx.stroke();

		ctx.beginPath();
		ctx.strokeStyle = "blue";
		ctx.moveTo(100, 100);
		ctx.lineTo(400, 100);
		ctx.setLineDash([10, 5]);//2
		ctx.stroke();

		ctx.beginPath();
		ctx.strokeStyle = "green";
		ctx.moveTo(100, 150);
		ctx.lineTo(400, 150);
		ctx.setLineDash([10, 5, 20]);//3
		ctx.stroke();
	</script>
</body>

2 绘制动画效果

☞ 绘制一个描边矩形: content.strokeRect(x,y,width,height)

☞ 绘制一个填充矩形: content.fillRect(x,y,width,height) 

☞ 清除:content.clearRect(x,y,width,height) 

  

实现动画效果

1. 先清屏

2. 绘制图形

3. 处理变量

 2.1绘制图形-快速绘制矩形

1、ctx.strokeRect(100, 100, 200, 200);

2、ctx.fillRect(330, 100, 200,200);

<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");


	 	 //描边矩形
	 	 ctx.strokeStyle="red";
	 	 ctx.strokeRect(100, 100, 200, 200);
	 	 ctx.beginPath();

	 	 //填充矩形
	 	 ctx.fillStyle="red";
	 	 ctx.fillRect(330, 100, 200,200);

	 	 //清除效果
	 	 ctx.clearRect(340, 100, 10, 200);
	 </script>
</body>

2.2 动画矩形

  • x 是矩形开始位置的 x 坐标
  • step 是每次移动的距离
  • i 是方向变量,用于改变矩形的移动方向
  • 使用 setInterval 函数设置一个定时器,每隔 20 毫秒(即每秒 50 次)执行一次函数,该函数包含动画逻辑。
  • 动画逻辑
  • 清屏:使用 ctx.clearRect(0, 0, canvas.width, canvas.height); 清除画布上的所有内容。
  • 绘制矩形:使用 ctx.fillRect(x, 100, 100, 200); 在当前 x 坐标位置绘制一个矩形。
  • 更新变量:增加 x 的值以移动矩形。
  • 改变方向:如果矩形碰到画布的右侧或左侧边缘,则改变移动方向。(左侧x<0,反向;右侧x>canvas.width - 100,反向)

例:实现一个简单的“反弹”动画,矩形在画布上来回移动。

<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");


	 	 //开始位置
	 	 var x=0;

	 	 //处理的是一个增量
	 	 var step=5;

	 	 //改变的方向的
	 	 var i=1;
	 	 //创建一个定时器
	 	 setInterval(function(){

	 	 	//先清屏
	 	 	ctx.clearRect(0, 0, canvas.width, canvas.height);

	 	 	//开始绘制图形
	 	 	ctx.fillRect(x, 100, 100, 200);

	 	 	//开始处理变量
	 	 	x+=step*i;

	 	 	if(x>canvas.width-100){
	 	 		i=-1;

	 	 	}else if(x<0){
	 	 		i=1;
	 	 	}
	 	 	
	 	 },20);
	 </script>
</body>

3 绘制文本

绘制填充文本

        content.fillText(文本的内容,x,y)

☞ 绘制镂空文本

         content.strokeText();

☞ 设置文字大小:

         content.font="20px 微软雅黑"

         备注: 该属性设置文字大小,必须按照cssfont属性的方式设置

☞ 文字水平对齐方式【文字在圆心点位置的对齐方式】

         content.textalign="left | right | center"

☞文字垂直对齐方式

         content.textBaseline="top | middle | bottom | alphabetic(默认)"

☞文字阴影效果

  • ctx.shadowColor="red";  设置文字阴影的颜色
  • ctx.ShadowOffsetX=值;   设置文字阴影的水平偏移量
  • ctx.shadowOffsetY=值;   设置文字阴影的垂直偏移量
  • ctx.shadowBlur=值;      设置文字阴影的模糊度

样例代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		canvas {
			 border: 1px solid red;


		}
	</style>
</head>
<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");

	 	 ctx.moveTo(300, 0);
	 	 ctx.lineTo(300, 400);
	 	 ctx.stroke();

	 	 ctx.beginPath();

	 	 ctx.moveTo(0, 200);
	 	 ctx.lineTo(600,200);
	 	 ctx.stroke();


	 	 //设置文字大小: 与css设置文字一样
	 	 ctx.font="40px 微软雅黑";

	 	 //设置文字的对齐方式
	 	 ctx.textAlign="center";

	 	 //设置文字上下对齐方式
	 	 ctx.textBaseline="middle";

	 	 //设置带阴影的效果
	 	 ctx.shadowColor="red";
	 	 ctx.shadowOffsetX=5;
	 	 ctx.shadowOffsetY=5;
	 	 ctx.shadowBlur=10;

	 	 ctx.strokeText("撸起袖子加油干", 300, 200);
	 	 ctx.fillText("撸起袖子加油干", 300, 200);

	 </script>
</body>
</html>

 

4 绘制图片

4.1 绘制图片1

图片绘制到画布的指定位置

content.drawImage(图片对象,x,y);

<body>
	<canvas width="600" height="400"></canvas>
	<script type="text/javascript">
		//获取canvas画布对象
		var canvas = document.querySelector("canvas");
		//获取绘图上下文
		var ctx = canvas.getContext("2d");

		//将图片绘制到画布的指定区域
		var img = document.createElement("img");
		img.src = "1.jpg";
		//在图像加载完成后被触发
		img.onload = function () {
			ctx.drawImage(img, 0, 0);
		}

	</script>
</body>

按照原来图片的大小显示的

4.2 绘制图片2

图片绘制到指定区域大小的位置 

x,y指的是矩形区域的位置,width和height指的是图片的大小

 content.drawImage(图片对象,x,y,width,height);

<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		canvas {
			border: 1px solid red;
		}
	</style>
</head>

<body>
	<canvas width="600" height="400"></canvas>
	<script type="text/javascript">
		//获取canvas画布对象
		var canvas = document.querySelector("canvas");
		//获取绘图上下文
		var ctx = canvas.getContext("2d");

		var img = document.createElement("img");
		img.src = "1.jpg";

		img.onload = function () {
			ctx.drawImage(img, 0, 0, 300, 300);
		}
	</script>
</body>

可以设置插入图片的大小,及起点

4.3 绘制图片3

图片的指定区域绘制到指定矩形区域内

content.drawImage(图片对象,sx,sy,swidth,sheight,dx,dy,dwidth,dheight);

  • sx,sy 指的是要从图片哪块区域开始绘制,
  • swidth,sheight 是指截取图片区域的大小
  • dx,dy 是指矩形区域的位置,
  • dwidth,dheight是值矩形区域的大小
<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");

	 	 var img=document.createElement("img");
	 	     img.src="1.jpg";

	 	     img.onload=function(){

	 	     	ctx.drawImage(img, 810,0,387,331,0,0,387,331);
	 	     }
	 </script>
</body>

4.4 解决绘制图片失真效果

 解决图片绘制到某一个区域的按原比例缩放绘制

绘制宽:绘制高==原始宽:原始高

<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");

	 	 var img=document.createElement("img");
	 	 	 img.src="1.jpg";

	 	
	 	 img.onload=function(){
	 	 	 var img_width=img.width;
	 	 	 var img_height=img.height;
	 	 	 var drowHeight=200*img_height/img_width;
	 	 	 
	 	 	ctx.drawImage(img, 100, 50, 200,drowHeight);
	 	 }
	 </script>
</body>

5 绘制圆弧

content.arc(x,y,radius,startradian,endradian[,direct]);

x,y    圆心的坐标

  • radius 半径
  • startradian   开始弧度
  • endradian     结束弧度
  • direct        方向(默认顺时针 false)   true 代表逆时针

            

0度角在哪?

        以圆心为中心向右为0角 顺时针为正,逆时针为负       

☞ 备注:

         角度 和 弧度的关系: 角度:弧度= 180:pi

☞ 绘制圆上任意点: 

公式:

x=ox+r*cos( 弧度 )

y=oy+r*sin( 弧度 )

  • ox: 圆心的横坐标
  • oy: 圆心的纵坐标
  • r: 圆的半径

5.1 绘制圆弧

例:开始弧度为0 结束弧度为360

<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");

	 	 ctx.arc(300, 200, 100, 0, 2*Math.PI);
	 	 
	 	 ctx.stroke();
	 </script>
</body>

5.2 绘制圆弧上任意一点

绘制圆弧上任意一点:将点的圆心定位到圆弧上,设置的半径较小,开始弧度为0 结束弧度为360,设置为填充,则外观上则呈现出一个小圆点

 

<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		canvas {
			 border: 1px solid red;
		}
	</style>
</head>
<body>
	 <canvas width="600" height="400"></canvas>
	 <script type="text/javascript">
	 	 //获取canvas画布对象
	 	 var canvas =document.querySelector("canvas");
	 	 //获取绘图上下文
	 	 var ctx=canvas.getContext("2d");

	 	 ctx.moveTo(300, 0);
	 	 ctx.lineTo(300, 400);
	 	 ctx.moveTo(0, 200);
	 	 ctx.lineTo(600, 200);
	 	 ctx.stroke();

	 	 ctx.beginPath();
	 	 ctx.arc(300, 200, 100, 0, 2*Math.PI);
	 	 ctx.stroke();

	 	 ctx.beginPath();

	 	 var x=300+Math.cos(Math.PI/3)*100;
	 	 var y=200+Math.sin(Math.PI/3)*100;

	 	 ctx.arc(x, y, 10, 0, Math.PI*2);

	 	 
	 	 ctx.fillStyle="red";
	 	 ctx.fill();
	 </script>
</body>

6 平移【坐标系圆点的平移】 

ctx.translate(x,y);

 特点:通过该方法可以将原点的位置进行重新设置。

注意:

    1. translate(x,y) 中不能设置一个值

    2. 与moveTo(x,y) 的区别:

  • moveTo(x,y) 指的是将画笔的落笔点的位置改变,而坐标系中的原点位置并没有发生改变
  • translate(x,y) 是将坐标系中的原点位置发生改变

7 旋转【坐标系旋转】 

ctx.rotate(弧度)

8 伸缩

ctx.scale(x,y)

备注:

沿着x轴和y轴缩放

 x,y 为倍数  例如: 0.5  1

9 练习

制作一个在线播放器视频

 

转载请注明出处或者链接地址:https://www.qianduange.cn//article/12196.html
标签
评论
发布的文章

前端——12.表单标签

2024-06-21 00:06:57

src、href和url含义及区别

2024-06-21 00:06:56

CSS知识点大全

2024-06-21 00:06:16

JS垃圾回收机制(GC)

2024-06-21 00:06:03

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!