Canvas绘图(2D)

[注意]

必需设置 height, width 属性,因为 canvas 元素默认宽高为150px,300px;

<canvas id = "drawing" width = "200" height = "200"></canvas>

调用 getContext() 方法传入上下文的名字,需要确定浏览器支持 <canvas>

if (drawing.getContext){
       var context = drawing.getContext("2d");
}

2D上下文

1.填充描边

  • 填充属性: fillStyle( )
  • 描边属性: strokeStyle( )

2.绘制矩形
fillRect( )、strokeRect( )、clearRect( )
接收四个参数:矩形的x坐标、矩形的y坐标、矩形的宽度、矩形的高度

绘制路径

必需首先调用beginPath( )方法

  • arc(x,y,半径,起始角度,结束角度,旋转方向):
    用于绘制圆形路径,以(x,y)为圆心,旋转方向为一个bool值表示是否以逆时针方向绘制,起始角度以及结束角度的单位都是弧度
  • arcTo(x1,y1,x2,y2,半径):
    从(x1,x2)为起点绘制一条到(x2,y2)的弧线,且该圆弧的半径为指定值
  • bezierCurveTo(c1x,c1y,c2x,c2y,x,y):
    从上一个点为起点绘制一条到(x,y)点的曲线,并且以(c1x,c1y)和(c2x,c2y)两点为控制点(即绘制贝塞尔曲线)
  • lineTo(x,y):
    从上一点绘制一条到(x,y)点的直线
  • moveTo(x,y):
    起点移到(x,y)点,不画线
  • quadraticCurveTo(cx,cy,x,y):
    从上一点绘制一条到(x,y)点的二次曲线,以(cx,cy)为控制点
  • rect(x,y,width,height):
    从点(x,y)开始绘制一个矩形,宽度为 width 高度为
    height,这里绘制的是矩形路径,而不是一个独立的形状

路径绘制完成后的几种操作
1.closePath(): 如果希望绘制一条连接到路径起点的线条则可以调用该方法
2.fill(): 用fillStyle来填充图形
3.stroke(): 对路径描边
4.clip(): 在路径上创建一个剪切区域
举个栗子
绘制一个不带数字的时钟表盘

<script type="text/javascript">
		var drawing = document.getElementById('drawing');
		
		if(drawing.getContext){
			
			var context = drawing.getContext("2d");
			
			//开始路径
			context.beginPath();
			
			//绘制外圆
			context.arc(100,100,99,0,2 * Math.PI, false);
			
			//绘制内圆
			context.moveTo(194,100);
			
			context.arc(100,100,94,0,2 * Math.PI, false);
			
			//绘制分针
			context.moveTo(100,100);
			
			context.lineTo(100,15);
			
			//绘制时针
			context.moveTo(100,100);
			
			context.lineTo(35,100);
			
			//描边路径
			context.stroke();
		}
	</script>

为了方便我们对路径的控制, 2D上下文还提供了一个方法:

isPointInPath(x,y) 该方法用于判断(x,y)是否位于路径上,在路径关闭前有效

绘制文本

fillText( )和strokeText( )
接收4个参数:要绘制的文本字符串、x坐标、y坐标、可选的最大像素宽度

三个属性:

  • font:
    表示文本样式、大小及字体,用CSS中指定字体的格式来指定

  • textAlign:
    文本对齐方式
    可能的值:“start” “end” “left” “right” “center”

  • textBaseline:
    文本的基线
    可能的值:“top” “hanging” “middle” “alphabetic” “ideographic” “bottom”
    栗子
    表盘上绘制数字12


			context.font = "bold 14px Arial";
			
			context.textAlign = "center";
			
			context.textBaseline="bottom";
			
			context.fillText("12",100,20);

measureText( )方法辅助确定文本大小

变换

修改变换矩阵

  • rotate(angle):
    围绕原点旋转图像 angle 弧度;

  • scale(scaleX,scaleY):
    缩放图像,在x方向乘以 scaleX,在y方向乘以 scaleY,其默认值为1.0;

  • translate(x,y):
    将坐标原点移动到(x,y)。执行这个变换之后,坐标(0,0)会变成之前由(x,y)表示的点

  • transform(m1_1,m1_2,m2_1,m2_2,dx,dy):
    直接修改变换矩阵,方式是乘以如下矩阵:
    m1_1       m1_2         dx
    m2_1        m2_2         dy
        0                0            1

  • setTransform(m1_1,m1_2,m2_1,m2_2,dx,dy):
    将变换矩阵重置为默认状态,然后再调用 transform( )
    栗子
    绘制表针时,把原点变换到表盘中心

//变换原点
context.translate(100,100);
//绘制分针
context.moveTo(0,0);
context.lineTo(0,-85);
//绘制时针
context.moveTo(0,0);
context.lineTo(-65,0);

使用 rotate( ) 方法旋转时钟的表针

context.rotate(1);

save( )方法保存上下文的设置和变换(不包括上下文的内容);
restore( )方法向上返回一级;

绘制图像

drawImage( )方法

  1. 传入一个 HTML 元素;
  2. 传入另一个<canvas>元素作为其第一个参数;

阴影

属性

  1. shadowColor:
    用CSS颜色格式表示的阴影颜色,默认黑色;

  2. shadowOffsetX:
    形状或路径 x 轴方向的阴影偏移量,默认0;

  3. shadowOffsetY:
    形状或路径 y 轴方向的阴影偏移量,默认0;

  4. shadowBlur:
    模糊的像素数,默认0;

渐变

  1. createLinearGradient( )方法
  2. addColorStop( )方法:指定色标,0~1;
  3. createRadialGradient( )方法

模式

重复
createPattern( )方法:
第一个参数:HTML<img>元素、<video>元素、<canvas>元素
第二个参数:如何重复图像的字符串

使用图像数据

getImageData( )方法,putImageData( )方法

合成

globalAlpha: 指定所有绘制的透明度
globalCompositionOperation: 后绘制的图形如何与先绘制的图形结合

推荐一个超详细的 canvas 学习教程
https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Transformations

发布了26 篇原创文章 · 获赞 6 · 访问量 1460

猜你喜欢

转载自blog.csdn.net/qiao_xi/article/details/97642260