我有一个项目,其中svg文件的不同层需要着色。我尝试进行颜色转换,但它只是在svg图像的顶部放置了颜色叠加。在AS3中是否有任何可以通过编程方式为不同颜色的svg文件的各层着色?
提前致谢。
答案 0 :(得分:2)
SVG是一种XML格式,因此Flash可以读取它。但是,Adobe已经停止支持SVG(除了Illustrator和其他几个),所以无论你是否可以做一件特定的事情,这真的是一个混合包。
关于您正在使用的svgViewer,它在名为com.flowde.svg.svgViewer
的{{1}}类中使用递归方法来处理SVG的XML。这种方法要么吸取一些东西,要么递归,或者其他什么。
查看SVG,一些文件使用SVG组(read up on it here)。 。 。是你的意思是层?如果是,那么addSVGNodeToMC()
在addSVGNodeToMC()
命令中确实有一个条目用于switch()
标记。所以这就是你(可能)应该劫持着色代码的地方。
但是有一个关于如何使用颜色的问题。在SVG中,您可以使用属性方法或<g>
方法。 style="*style def*"
方法将此XML格式转换为通用对象(将其视为地图,样式名称为键,样式值为地图条目的值)。使用方法getStyle()
,将两种不同的样式组合在一起,getCombinedStyle(styleA, styleB)
中的所有条目都会覆盖styleB
中任何匹配的样式名称。您可以根据需要随时拨打styleA
。
此组合样式对象最终传递给getCombinedStyle()
,后者将其转换为AS3 / Flash样式。
所以看起来好的中断就是用你想要的样式颜色构建initSetStyle()
,然后使用Object
。此代码应具有一些区分不同组的功能,因此您可以使用组的id属性或其他来确定颜色。为笔划或填充着色:
getCombinedStyle(styleA, yourStyleObject)
您可以将该功能称为:
private function setYourGroupStyle(st, groupId){
var yourStyleObject:Object = new Object();
// for the stroke color:
// In place of simply setting the color value,
// you could create another method like
// someColorFunctionality(groupId) and call that here.
yourStyleObject['stroke'] = "#ff0000";
// for the fill color:
yourStyleObject['fill'] = "#ff0000";
return getCombinedStyle(st, yourStyleObject);
}
请注意,值[...]
case "g":
st = setYourGroupStyle(st, node.attribute("id"));
child=new Sprite();
for each(var el:XML in node.elements()){
var c2=addSVGNodeToMC(el,child,st);
if(c2) child.addChild(c2);
}
break;
[...]
可以是任何值,因此您可以将其设置为某种类型的计数器(例如groupId
),然后根据该值定义发生的事情。< / p>
但您可能希望获得使用此类的书面许可。我没有找到任何许可协议,这使你陷入法律困境。如果是商业项目,那么获得许可是非常值得的。
HTH!