当我发现这种奇怪之处时,我最近正在画布上玩一些代码。
给出以下代码
var pattern = ctx.createPattern(image, 'repeat');
ctx.fillStyle = pattern;
ctx.fillRect(10, 10, 500, 500);
您可能希望它将以点开始在画布上渲染带有此图像的图案x:10, y:10
。
但是,实际上似乎发生的是,它渲染的矩形起始于,x:10, y:10
但图案的起始于x:0, y:0
。
解决方法是翻译画布
ctx.translate(10,10);
然后从开始渲染矩形 x:0, y:0
ctx.fillRect(0, 0, 500, 500);
我在jsfiddle上建立了一个演示来说明问题。只需更改x和y偏移量即可查看默认情况,然后使用复选框启用转换以“解决”该问题。
所以我的问题是这样的:
为什么在大多数情况下考虑模式的直观性时,模式填充的行为rect
和fillRect
这种方式?
模式(CanvasPattern)是单独的全局对象(就画布的上下文而言),未绑定到将其用作样式的方法。
由于模式并不“意识到”是否正在使用该模式,并且,如果仅将其用于样式,而样式又没有绑定到使用该模式的方法,则坐标系将成为唯一可以这样说的锚点到哪里画和瓷砖的图案。
做一个,例如,矩形(X,Y,W,H)将只告知浏览器在那里要呈现的矩形本身,而不是如何来填补它这是什么风格的模式保存有关信息,并且是在执行什么使用当前样式(可以是纯色,图案或渐变-后者与图案具有相似的行为)合成/填充形状时的下一步。
另一个方面是可以累积路径。例如,如果您这样做:
ctx.fillStyle = myPattern;
ctx.rect(x1, y1, w, h);
ctx.rect(x2, y2, w, h);
ctx.fill();
两个rect中的哪个应该是填充操作的锚点?(fillRect只是rect + fill的简写,但使用的临时路径不影响当前的全局路径)。
rect(),arc()等仅创建路径,并且当您调用填充/描边时,这些路径将以设置的任何填充/描边样式栅格化到画布。
当调用填充/描边时,浏览器(或操作系统的图形子系统)可能会执行以下操作:
现在只有一个遮罩/遮罩,您再也没有定义的锚点了,唯一剩下的就是坐标系。
(不考虑使用不同算法的可能性,即多边形填充,路径仍然存在等。但是性能和图形系统会影响这些决策以及规范,而该规范的目标是实现跨浏览器和跨平台的相同行为)。我在写这篇文章时睡着了,所以希望我不要让它变得更加模糊。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句