用Canvas绘制线段(2)

本文详细介绍了在HTML5 Canvas中绘制线段的方法,包括`ctx.moveTo()`、`ctx.lineTo()`、`ctx.stroke()`、`ctx.lineWidth`、`ctx.strokeStyle`等属性和方法的使用。此外,还讨论了`ctx.closePath()`、`ctx.fill()`以及`beginPath()`在路径绘制中的作用,解释了如何处理宽线段的闭合问题和创建新路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用Canvas绘制线段(2)

方法介绍

  • ctx.moveTo(x,y)

用于移动画笔到(x,y)坐标处,并以此为路径起点进行绘图

  • ctx.lineTo(x,y)

指定路径的下一个点的坐标,表示使用直线连接该点与上一个点

  • ctx.stroke()

绘制路径

  • ctx.lineWidth=20;

设置线段宽度,默认值为1px,较宽的线条在路径上居中,路径上下两边各有线宽的一半

这里写图片描述

  • ctx.strokeStyle=’red’

strokeStyle主要用于设置画笔绘制路径的颜色、渐变和模式。该属性的值可以是一个表示CSS颜色值的字符串。如果你的绘制需求比较复杂,该属性的值还可以是一CanvasGradient对象或者CanvasPattern对象

下面通过绘制一条线段来体验上述几个方法属性

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

ctx.moveTo(10, 10);
ctx.lineTo(100, 100);
ctx.lineWidth = 20;
ctx.strokeStyle = 'orange';
ctx.stroke();

如果不进行‘ctx.stroke()’操作,那么线段不会被绘制出来,因为‘ctx.moveTo(10, 10);与ctx.lineTo(100, 100);’仅仅确定了你想要绘制的线段的路径,而并不是实际去画,路径确定后需要通过stroke()将路径描出来

ctx.closePath()

用于闭合当前路径。即将当前路径的起点与终点连起来形成一个闭合区域

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.stroke();
/*上述路径并不会闭合*/

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.closePath();
ctx.stroke();
/*加入closePath后路径闭合*/

注意:如果我将‘ctx.closePath();’与‘ctx.stroke();’交换调用次序

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.stroke();
ctx.closePath();

你会发现路径不闭合了?

这是因为:一旦调用stroke方法,那么就相当于你告诉系统——这个路径我已经绘制完了,请你给我将这个路径描出来,既然你路径都已经绘制好了,那么系统也就将绘制路径这个操作关闭了,然后再执行描路径操作,路径描完后,等待下一次绘制路径的操作。所以当你调用closePath时,绘制路径操作已经关闭,因此你也就不能将路径闭合了

还有一点

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.lineTo(10,10);
ctx.lineWidth=20;
ctx.stroke();

当我们试图通过lineTo使路径回到起始点,从而形成一个封闭图形时,发现一旦线条太宽,那么就会缺角,这是我们用closePath解决这个问题

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.lineTo(10,10);
ctx.lineWidth=20;
ctx.closePath();
ctx.stroke();

ctx.fill()

配套该有‘ctx.fillStyle=’red’’来设置填充色

用于填充路径——如果所绘制的路径本身已经闭合,那么填充路径所围成的闭合区域;如果路径没有闭合,那么该方法自动将路径的起点与终点连起来(形式上连起来,实际并没有)在形式上形成一个闭合区域并填充这个闭合区域

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.fillStyle="purple";
ctx.fill();

上述路径未闭合,则fill在形式上将其闭合并填充

ctx.moveTo(10, 10);
ctx.lineTo(100, 10);
ctx.lineTo(100, 100);
ctx.closePath();
ctx.fillStyle="purple";
ctx.fill();

上述路径闭合,直接填充

其可以与stroke一起使用——用stroke描边,用fill填充。还要注意,无论fill在stroke之前还是之后调用都有效,因为其是填充,与绘制路径操作是否关闭无关

beginPath()

开始一个新的路径

/*绘制第一条线*/
ctx.moveTo(100, 100);
ctx.lineTo(200, 100);
ctx.strokeStyle = 'orange';
ctx.stroke();

/*绘制第二条线*/
ctx.moveTo(100, 200);
ctx.lineTo(200, 200);
ctx.strokeStyle = 'red';
ctx.stroke();

我们发现,第一、二条线都变为了1红色?

因为:虽然在绘制第二条线时,用moveTo重新设置了路径的起点,但是实际上,这条路径与第一条线依旧属于同一路径,所以他们动用red等路径信息。

要想使第二条线在新的路径绘制,与第一条线相分割,那么请使用beginPath

/*绘制第一条线*/
ctx.moveTo(100, 100);
ctx.lineTo(200, 100);
ctx.strokeStyle = 'orange';
ctx.stroke();

/*绘制第二条线*/
ctx.beginPath();
ctx.moveTo(100, 200);
ctx.lineTo(200, 200);
ctx.strokeStyle = 'red';
ctx.stroke();

看下一篇——用Canvas绘制矩形(3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值