canvas – 为什么省略beginPath()会重绘所有内容?

前端之家收集整理的这篇文章主要介绍了canvas – 为什么省略beginPath()会重绘所有内容?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
没有context.beginPath();顶部的10px红色笔划重新绘制为30px绿色笔划,即使在已经绘制笔划之后才调用30px和绿色上下文属性.这是为什么?
window.onload = function() {
var canvas = document.getElementById("drawingCanvas");
var context = canvas.getContext("2d");  

context.moveTo(10,50);
context.lineTo(400,50);
context.lineWidth = 10;
context.strokeStyle = "red";
context.stroke();

//context.beginPath();
context.moveTo(10,120);
context.lineTo(400,120);
context.lineWidth = 30;
context.strokeStyle = "green";
context.stroke();
};

解决方法

默认的内部Path对象在内部累积所有路径方法调用,例如lineTo,rect,arc等等(有一些例外,例如fillRect,strokeRect,fillText等,它们直接根据当前设置进行栅格化).这些只是矢量表示.

每次调用stroke()或fill()时,Path对象都会使用当前笔触和/或填充颜色设置进行栅格化.

栅格化路径后,它不会自行清除,您可以继续累积路径.

beginPath()是丢弃现有(子)路径并重新开始的唯一方法.由于它只清除内部路径而不是画布上的栅格化结果,因此除非您想重用这些路径,否则这通常不会成为问题.

当Path对象在更多浏览器中公开时,还有另一种方法可以在不使用beginPath()的情况下执行此操作(目前只有Chrome允许您直接使用Path对象,但似乎还没有将它集成到画布使用中).

您可以创建不同的Path对象并单独栅格化它们:

var path1 = new Path();
var path2 = new Path();

path1.moveTo(10,50);
path1.lineTo(400,50);

context.lineWidth = 10;
context.strokeStyle = "red";
context.stroke(path1);

path2.moveTo(10,120);
path2.lineTo(400,120);

context.lineWidth = 30;
context.strokeStyle = "green";
context.stroke(path2);

在这里你不需要beginPath(),你可以重用那些对象 – 结合translate等等你基本上有一个更面向对象的画布.

作为旁注:许多人认为closePath()将“结束”路径,但它所做的就是关闭连接第一个点和最后一个点的“循环”.您仍然可以添加新路径.

原文链接:https://www.f2er.com/html5/168835.html

猜你在找的HTML5相关文章