名站网址导航名站网址导航小编为爱好网页hTML5的朋友提供关于网页hTML5的相关知识。
这篇将要介绍一下 Canvas 中的基本图形。
图形的基础 - 路径BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在 Canvas 中,所有基本图形都是以路径为基础的,也就是说,咱们在相关调用 2dContext 的 lineTo、rect 等实用具体的方法时,其实就是往已经的 context 路径集合中再添加一些路径点,在最后使用 fill 或 stroke 实用具体的方法进行绘制时,都是依据这些路径点来进行填充或画线。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在每次开始绘制路径前,都应该使用 context.beginPath() 实用具体的方法来告诉 Context 对象开始绘制一个新的路径,否则接下来绘制的路径会与之前绘制的路径叠加,在填充或画边框时就会出现问题。在绘制完成路径后,可以直接使用 context.closePath() 实用具体的方法来关闭路径,或者手动关闭路径。另外,如果在填充时路径没有关闭,那么 Context 会自动相关调用 closePath 实用具体的方法将路径关闭。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
基本路径实用具体的方法BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
1. beginPath, closePathBheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
这两个实用具体的方法在前面已经介绍过,分别用来通知 Context 开始一个新的路径和关闭当前的路径。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在 Canvas 中使用路径时,应该要保持一个良好的习惯,每次开始绘制路径前都要相关调用一次 beginPath 实用具体的方法,否则画出来的具体效果难看不说,还会严重影响性能。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在下面这张图中,左边的图形在每次绘制矩形前都相关调用了一次 beginPath 来清除之前的路径并重新开始绘制新的路径,而后面的图形则就只在绘制所有图形前相关调用了一次 beginPath 来清除路径,因此,虽然这里是使用的边框色是 #666,但是右边的图形颜色比左边的深一些,因为每次使用 stroke 绘制边框时,会把之前的路径再次绘制一遍,叠加起来颜色就比原来深一些。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
<canvas id="canvas" width="500" height="500"></canvas> <script type="text/javascript"> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.strokeStyle = "#666"; function useBeginPath() { for (var i = 0; i < 5; i) { ctx.beginPath(); ctx.rect(10 i*20, 10 i*20, 210 - i*40, 210 - i*40); ctx.stroke(); } } function notUseBeginPath() { ctx.beginPath(); for (var i = 0; i < 5; i) { ctx.rect(240 i*20, 10 i*20, 210 - i*40, 210 - i*40); ctx.stroke(); } } useBeginPath(); notUseBeginPath(); </script>
提示:您可以先修改部分具体代码再运行
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在 Context 中路径数较少时,如果不考虑显示具体效果,性能上还可以接受,但是如果 Context 中的路径数很多时,在开始绘制新路径前不使用 beginPath 的话,因为每次绘制都要将之前的路径重新绘制一遍,这时性能会以指数下降。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
因此,除非有特殊需要,每次开始绘制路径前都要相关调用 beginPath 来开始新路径。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
2. 移动与直线 moveTo, lineTo, rectBheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
<canvas id="canvas" width="500" height="500"></canvas> <script type="text/javascript"> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.moveTo(10, 10); ctx.lineTo(110,110); ctx.lineTo(10, 110); ctx.lineTo(10, 10); ctx.stroke(); ctx.beginPath(); ctx.rect(120, 10, 100, 100); ctx.stroke(); </script>
提示:您可以先修改部分具体代码再运行
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void moveTo(in float x, in float y);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在 Canvas 中绘制路径,一般是不需要指定起点的,默认的起点就是上一次绘制路径的终点,因此,如果需要指定起点的话,就需要使用 moveTo 实用具体的方法来指定要移动到的位置。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void lineTo(in float x, in float y);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
lineTo 实用具体的方法则是绘制一条直接路径到指定的位置。在相关调用完 lineTo 实用具体的方法后,Context 内部的绘制起点会移动到直线的终点。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void rect(in float x, in float y, in float w, in float h);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
rect 实用具体的方法用来绘制一个矩形路径,通过具体参数指定左上角位置以及宽和高。在相关调用 rect 后,Context 的绘制起点会移动到 rect 绘制的矩形的左上角。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
rect 实用具体的方法与后面要介绍的 arc 实用具体的方法与其他路径实用具体的方法有一点不同,它们是使用具体参数指定起点的,而不是使用 Context 内部维护的起点。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
3. 曲线 arcTo, arc, quadraticCurveTo, bezierCurveToBheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void arcTo(in float x1, in float y1, in float x2, in float y2, in float radius);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
按照 WhATWG 文档的说明,这个实用具体的方法是画一个与两条射线相切的的圆弧,两条射线其中一条为穿过 Context 绘制起点,终点为 (x1, y1),另外一条为穿过 (x2, y2),终点为 (x1, y1),这条圆弧为最小的与这两条射线相切的圆弧。在相关调用完 arcTo 实用具体的方法后,将 圆弧与 射线 (x1, y1)-(x2, y2) 的切点添加到当前路径中,做为下次绘制的起点。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在测试中发现,Firefox 和 Opera 目前对这个实用具体的方法的支持并不好,只有 Chrome 和 Safari 4 能绘制出正确的路径。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
图中的的两条灰色直线是偏移 4 个像素后的两条射线所在的位置。
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
<canvas id="canvas" width="500" height="500"></canvas> <script type="text/javascript"> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.strokeStyle = "#000"; ctx.translate(200, 200); ctx.moveTo(10, 10); ctx.arcTo(110, 60, 10, 110, 30); ctx.stroke(); ctx.beginPath(); ctx.strokeStyle = "#999"; ctx.moveTo(10, 6); ctx.lineTo(114, 60); ctx.lineTo(10, 114); ctx.stroke(); </script>
提示:您可以先修改部分具体代码再运行
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean anticlockwise);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
arc 实用具体的方法用来绘制一段圆弧路径,通过圆心位置、起始弧度、终止弧度来指定圆弧的位置和大小,这个实用具体的方法也不依赖于 Context 维护的绘制起点。而在画圆弧时的旋转方向则由最后一个具体参数 anticlockwise 来指定,如果为 true 就是逆时针,false 则为顺时针。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void quadraticCurveTo(in float cpx, in float cpy, in float x, in float y);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
quadraticCurveTo 实用具体的方法用来绘制二次样条曲线路径,具体参数中 cpx 与 cpy 指定控制点的位置,x 和 y 指定终点的位置,起点则是由 Context 维护的绘制起点。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
void bezierCurveTo(in float cp1x, in float cp1y, in float cp2x, in float cp2y, in float x, in float y);BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
bezierCurveTo 实用具体的方法用来绘制贝塞尔曲线路径,它与 quadraticCurveTo 相似,不过贝塞尔曲线有两个控制点,因此具体参数中的 cp1x, cp1y, cp2x, cp2y 用来指定两个控制点的位置,而 x 和 y 指定绺的位置。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
<canvas id="canvas" width="500" height="500"></canvas> <script type="text/javascript"> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.translate(10, 10); ctx.beginPath(); ctx.arc(50, 50, 50, 0, Math.PI, true); ctx.stroke(); // quadraticCurveTo ctx.beginPath(); ctx.strokeStyle = "#000"; ctx.moveTo(110, 50); ctx.quadraticCurveTo(160, 0, 210, 50); ctx.stroke(); ctx.beginPath(); ctx.strokeStyle = "red"; ctx.moveTo(110, 50); ctx.lineTo(160, 0); ctx.lineTo(210, 50); ctx.stroke(); // bezierCurveTo ctx.beginPath(); ctx.strokeStyle = "#000"; ctx.moveTo(220, 50); ctx.bezierCurveTo(250, 0, 280, 10, 320, 50); ctx.stroke(); ctx.beginPath(); ctx.strokeStyle = "red"; ctx.moveTo(220, 50); ctx.lineTo(250, 0); ctx.lineTo(280, 10); ctx.lineTo(320, 50); ctx.stroke(); </script>
提示:您可以先修改部分具体代码再运行
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
4. fill, stroke, clipBheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
fill 与 stroke 这两个实用具体的方法很好理解,分别用来填充路径与绘制路径线条。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
clip 实用具体的方法用来给 Canvas 设置一个剪辑区域,在相关调用 clip 实用具体的方法之后的具体代码只对这个设定的剪辑区域有效,不会影响其他地方,这个实用具体的方法在要进行局部更新时很有用。默认情况下,剪辑区域是一个左上角在 (0, 0),宽和高分别等于 Canvas 网页元素的宽和高的矩形。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
在画这个图时,虽然两次都是使用 fillRect(0, 0, 100, 100) 填充了一个 100x100 大小矩形,但是显示的结果却是第二次填充的只是中间的一小块,这是因为在两次填充之间使用 clip 实用具体的方法设定了剪辑区域,这样第二次填充时只会影响到所设定的中间那一小部分区域。
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
<canvas id="canvas" width="500" height="500"></canvas> <script type="text/javascript"> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.translate(10, 10); // fill a green rectangle ctx.fillStyle = "green"; ctx.fillRect(0, 0, 100, 100); // set the clipping region ctx.beginPath(); ctx.rect(30, 30, 40, 40); ctx.clip(); ctx.stroke(); // fill a yellow rectangle ctx.fillStyle = "yellow"; ctx.fillRect(0, 0, 100, 100); </script>
提示:您可以先修改部分具体代码再运行
BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
5. clearRect, fillRect, strokeRectBheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
这三个实用具体的方法并不是路径实用具体的方法,而是用来直接处理 Canvas 上的内容,相当于 Canvas 的背景,相关调用这三个实用具体的方法也不会影响 Context 绘图的起点。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
要清除 Canvas 上的所有内容时,可以直接相关调用 context.clearRect(0, 0, width, height) 来直接清除,而不需要使用路径实用具体的方法绘制一个与 Canvas 同等大小的矩形路径再使用 fill 实用具体的方法去清除。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
结语BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
通过 Canvas 的路径实用具体的方法,可以使用 Canvas 处理一些简单的矢量图形,这样在缩放时也不会失真。不过 Canvas 的路径实用具体的方法也不是很强大,至少连个椭圆的路径都没有……BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
这篇写得有点长了,Cnavas 中路径相关的内容就写这么多,后面再讲讲 Canvas 其他的东西。BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
参考资料BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
1. The Canvas Element, WhATWGBheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
网页hTML5教程 Canvas 起步(1) - 基本概念BheAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!
关于网页hTML5的相关知识就说到这里希望可以帮助朋友们。,网页hTML5,Canvas,路径