canvas画1px变粗 clearRect() beginPath()的中重要性

1.画1px结果变粗

画网格线,希望的效果如下,但是实际效果变粗。线宽为 1 px
在这里插入图片描述在这里插入图片描述
好像是我上下的线紧贴了边缘(像素整数)
原来,canvas绘制线条是从中间向两边绘制的,比如说你定义x坐标为1,它会以1为中心,向左0.5像素,向右0.5像素,但是渲染时不支持小于0.5像素,所以会绘制成1像素,然后左边右边各1像素,你得到得就是双倍加粗版线条 O(∩_∩)O哈哈~

解决方法:就是你把 x 的值加或者减0.5像素,这样它就可以完整渲染1像素了,希望对大家有帮助。

代码:ctx.translate(-0.5,-0.5);

2.清除脏画布

context.clearRect(x,y,width,height);

参数 描述:
x 要清除的矩形左上角的 x 坐标
y 要清除的矩形左上角的 y 坐标
width 要清除的矩形的宽度,以像素计
height 要清除的矩形的高度,以像素计

3.养成 save(),,restore() 习惯

4.beginPath()的中重要性

原文:
https://blog.csdn.net/jearbilove/article/details/38340141

var ctx = document.getElementById('cvs').getContext('2d');
ctx.beginPath();
ctx.moveTo(100.5,20.5);
ctx.lineTo(200.5,20.5);
ctx.stroke();
ctx.moveTo(100.5,40.5);
ctx.lineTo(200.5,40.5)
ctx.strokeStyle = '#f00';
ctx.stroke();

其中的0.5是为了避免”1px线条模糊问题“,你懂的。那么上面的代码会得到什么样的图形呢?是不是一条黑线一条红线呢?

从代码上看,我们的逻辑毫无问题,但结果是我们得到的是两条红线,并不是一黑一红。

如果你明白这是为什么,那后面的你就不用看了。这就是beginPath的重要性。

canvas中的绘制方法(如stroke,fill),都会以“上一次beginPath”之后的所有路径为基础进行绘制。比如上面的代码里面我stroke了两次,其实这两次都是以第一次beginPath后的所有路径为基础画的。也就是说第一条路径我们stroke了两下,第一下是黑的,第二下是红的,所以最终也是红的。

不管你用moveTo把画笔移动到哪里,只要不beginPath,那你一直都是在画一条路径。
fillRect与strokeRect这种直接画出独立区域的函数,也不会打断当前的path.
如果你画出的图形和你想像的不一样,记得查看是否有合理的beginPath.

说到beginPath,就不得不提到closePath,两者是不是有很“紧”的联系呢?答案是几乎没有关系。
closePath的意思不是结束路径,而是关闭路径,它会试图从当前路径的终点连一条路径到起点,让整个路径闭合起来。但是,这并不意味着它之后的路径就是新路径了!
我们在上面的代码的第一个lineTo后面加上closePath,可以发现还是得到了两条红线。
但如果我们在第一个stroke后面加上beginPath,则会如愿得到一条黑线一条红线。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值