【发布时间】:2012-03-13 17:05:56
【问题描述】:
我正在将RaphaelJS 用于需要矢量绘图以可视化某些数据的项目。
我无法弄清楚如何推送和弹出转换状态。 (相当于 html5 画布中的 context.save() 和 context.restore())
有人能指出正确的方向吗?
谢谢。
【问题讨论】:
我正在将RaphaelJS 用于需要矢量绘图以可视化某些数据的项目。
我无法弄清楚如何推送和弹出转换状态。 (相当于 html5 画布中的 context.save() 和 context.restore())
有人能指出正确的方向吗?
谢谢。
【问题讨论】:
您能解释一下为什么需要推送和弹出转换状态吗?
在 svg 中,您实际上不需要这样做,浏览器会为您完成。如果您希望将特定转换应用于元素,则只需向其添加 transform attribute。您可以使用 <g> 元素将变换应用于许多元素(在 Raphaël 中有 Paper.set,可以像 <g> 元素一样使用,并且您可以使用 Element.transform 方法来设置变换)。
更新:
context.save() - 在 svg 术语中,这将是在给定时间获取元素的当前转换矩阵 (CTM) 并将其存储在某个地方,在 Raphaël 我猜这可能是 Element.transform()(我不是 100 % 确定它是否包含整个转换堆栈,无论如何,在纯 svg 中,可以通过 getCTM() 方法获取 CTM,该方法适用于所有元素)。一种方法是插入一个 <g> 元素,其中包含您想要的转换。
context.restore() - 在 svg 中,这相当于从变换列表中删除变换,但请注意,在 svg 中,兄弟姐妹不会“继承”变换(这与 html5 画布或 OpenGL 不同,其中当前设置的矩阵仅应用于设置变换后绘制的任何内容)。如果您希望将转换应用于许多元素,那么您创建一个 <g>,它具有应该应用于该元素的所有子元素的转换,并且您只需将元素插入到 <g> 的父元素中即可。 Raphaël 没有对 <g> 元素的任何内置支持(除非您计算 Element.set,这是一个类似的概念),Raphaël 这样做的猜测是为了防止人们尝试做类似的事情这是因为它很容易在没有意识到的情况下使 DOM 膨胀(请记住,SVG 是一种retained mode 图形格式,与画布和 OpenGL 不同)。
【讨论】: