绘制形状
画布坐标
<canvas>
元素有一个叫做 getContext()
的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()
只有一个参数,上下文的格式。
var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');
12
绘制矩形
fillRect(x, y, width, height)
fillRect()
方法绘制一个填充的矩形
- x
- 矩形起始点的 x 轴坐标
- y
- 矩形起始点的 y 轴坐标
- width
- 矩形的宽度
- height
- 矩形的高度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (100, 50, 100, 100);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (0, 0, 100, 100);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
strokeRect(x, y, width, height)
strokeRect()
方法绘制一个描边矩形,其起点为(x, y)
,其大小由宽度和高度指定
- x
- 矩形起点的 x 轴坐标。
- y
- 矩形起点的 y 轴坐标。
- width
- 矩形的宽度。正值在右侧,负值在左侧。
- height
- 矩形的高度。正值在下,负值在上。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
//颜色
ctx.fillStyle = "rgb(200,0,0)";
//矩形
ctx.fillRect (0, 0, 180, 180);
//描边
ctx.strokeRect(50, 50, 45, 45);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
clearRect(x, y, width, height)
clearRect()
方法清除指定矩形区域,让清除部分完全透明。
- x
- 矩形起始点的 x 轴坐标
- y
- 矩形起始点的 y 轴坐标
- width
- 矩形的宽度
- height
- 矩形的高度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
//颜色
ctx.fillStyle = "rgb(200,0,0)";
//矩形
ctx.fillRect (0, 0, 100, 100);
//透明
ctx.clearRect(50, 50, 100, 100);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
//颜色
ctx.fillStyle = "rgb(200,0,0)";
//矩形
ctx.fillRect (0, 0, 180, 180);
//透明
ctx.clearRect(50, 50, 45, 45);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
绘制路径
- 首先,你需要创建路径起始点。
- 然后你使用画图命令去画出路径。
- 之后你把路径封闭。
- 一旦路径生成,你就能通过描边或填充路径区域来渲染图形
生成路径的第一步叫做beginPath()。本质上,路径是由很多子路径构成,这些子路径都是在一个列表中,所有的子路径(线、弧形、等等)构成图形。而每次这个方法调用之后,列表清空重置,然后我们就可以重新绘制新的图形。
注意:当前路径为空,即调用beginPath()之后,或者canvas刚建的时候,第一条路径构造命令通常被视为是moveTo(),无论实际上是什么。出于这个原因,你几乎总是要在设置路径之后专门指定你的起始位置。
第二步就是调用函数指定绘制路径。
第三,就是闭合路径closePath(),不是必需的。这个方法会通过绘制一条从当前点到开始点的直线来闭合图形。如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做。
注意:当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你不需要调用closePath()函数。但是调用stroke()时不会自动闭合
方法 | 描述 |
---|---|
fill() | 填充当前绘图(路径) |
stroke() | 绘制已定义的路径 |
beginPath() | 起始—条路径,或重置当前路径 |
moveTo() | 把路径移动到画布中的指定点,不创建线条 |
closePath() | 创建从当前点回到起始点的路径 |
lineTo() | 添加一个新点,然后在画布中创建从该点到最后指定点的线条 |
clip() | 从原始画布剪切任意形状和尺寸的区域 |
quadraticCurveTo() | 创建二次贝塞尔曲线 |
bezierCurveTo( | 创建三次方贝塞尔曲线 |
arc() | 创建弧/曲线(用于创建圆形或部分圆) |
arcTo() | 创建两切线之间的弧/曲线 |
isPointInPath() | 如果指定的点位于当前路径中,则返回true,否则返回false |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(75, 50);
ctx.lineTo(100, 75);
ctx.lineTo(100, 25);
ctx.fill();
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
圆弧
arc(x, y, radius, startAngle, endAngle, anticlockwise)
画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成
注意:arc()函数中表示角的单位是弧度,不是角度。角度与弧度的js表达式: 弧度=(Math.PI/180)*角度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
for(var i = 0; i < 4; i++){
for(var j = 0; j < 3; j++){
ctx.beginPath();
var x = 25 + j * 50; // x 坐标值
var y = 25 + i * 50; // y 坐标值
var radius = 20; // 圆弧半径
var startAngle = 0; // 开始点
var endAngle = Math.PI + (Math.PI * j) / 2; // 结束点
var anticlockwise = i % 2 == 0 ? false : true; // 顺时针或逆时针
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
if (i>1){
ctx.fill();
} else {
ctx.stroke();
}
}
}
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
移动笔
该功能是一个会成为上述路径列表的一部分moveTo()
您可能最能想到的是将笔或铅笔从一张纸上的一个位置提起,然后放在另一张纸上。
moveTo(x, y)
移动笔由指定的坐标x
和y
。
初始化或beginPath()
调用画布时,通常将需要使用该moveTo()
函数将起点放置在其他位置。我们还可以moveTo()
用来绘制未连接的路径。看看下面的笑脸。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body onload="draw();">
<canvas id="canvas" width="400" height="400"></canvas>
</body>
<script type="application/javascript">
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // Outer circle
ctx.moveTo(110, 75);
ctx.arc(75, 75, 35, 0, Math.PI, false); // Mouth (clockwise)
ctx.moveTo(65, 65);
ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // Left eye
ctx.moveTo(95, 65);
ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // Right eye
ctx.stroke();
}
}
</script>
</html>
运行结果:
线数
lineTo()方法来绘制直线
lineTo(x, y)
绘制一条从当前绘图位置到所指定的位置的线x
和y
。
案例:
绘制两个三角形一个实心的一个空心的
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body onload="draw();">
<canvas id="canvas" width="400" height="400"></canvas>
</body>
<script type="application/javascript">
function draw() {
var canvas=document.getElementById('canvas');
if(canvas.getContext){
var ctx=canvas.getContext('2d');
//绘制实心的
ctx.beginPath();
ctx.moveTo(25,25)
ctx.lineTo(105,25);
ctx.lineTo(25,105);
// 绘制实心的
ctx.fill();
//绘制空心的
ctx.beginPath();
ctx.moveTo(125, 125);
ctx.lineTo(125, 45);
ctx.lineTo(45, 125);
// 连接起始点
ctx.closePath();
//绘制形状
ctx.stroke();
}
}
</script>
</html>
效果如下:
弧线
要绘制圆弧或圆,我们使用arc()
或arcTo()
方法。
语法:
void ctx.arc(x, y, radius, startAngle, endAngle [, anticlockwise]);
该arc()
方法创建一个以(x, y)
半径为中心的圆弧。路径从开始于,在结束于,并按照给出的方向(默认为顺时针)行进
-
参量
x
圆弧中心的水平坐标
y
圆弧中心的垂直坐标。
radius
圆弧的半径。必须是积极的。
startAngle
从正x轴开始测量的弧度起始弧度的角度(以弧度表示)。
endAngle
从正x轴开始测量,弧结束的弧度角(以弧度表示)
anticlockwise
可选的可选的
Boolean
。如果为true
,则在起始角度和终止角度之间逆时针绘制圆弧。默认值为false
(顺时针)。 -
例子
画一个完整的圆
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body onload="draw();"> <canvas id="canvas" width="400" height="400"></canvas> </body> <script type="application/javascript"> function draw() { const canvas = document.querySelector('canvas'); const ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.arc(100, 75, 50, 0, 2 * Math.PI); ctx.stroke(); } </script> </html>