SVG - это формат XML, поэтому Flash может его читать. Тем не менее, Adobe перестала поддерживать SVG в целом (за исключением Illustrator и нескольких других), так что это действительно смешанный пакет, можете ли вы сделать то или иное конкретное действие.
Что касается используемого svgViewer, он использует рекурсивный метод в классе com.flowde.svg.svgViewer
с именем addSVGNodeToMC()
для обработки XML SVG. Этот метод либо рисует что-то, рекурсы, либо что-то еще.
Глядя на SVG, некоторые файлы используют SVG-группы ( читайте здесь ). , , это то, что вы подразумеваете под слоями? Если так, то у этого addSVGNodeToMC()
есть запись в команде switch()
для <g>
разметок. Так что именно здесь вы (вероятно) должны взломать код для раскраски.
Но возникает вопрос о том, как используются цвета. В SVG вы можете использовать метод атрибута или метод style="*style def*"
. Метод getStyle()
преобразует это форматирование XML в универсальный объект (думайте о нем как о карте с именем стиля в качестве ключа и значением стиля в качестве значения записи в карте). Используя метод getCombinedStyle(styleA, styleB)
, объединяются два разных стиля, при этом все записи в styleB
перезаписывают любое соответствующее имя стиля в styleA
. И вы можете звонить getCombinedStyle()
так часто, как вы хотите.
Этот объединенный объект стиля в конечном итоге передается в initSetStyle()
, который преобразует его в стили AS3 / Flash.
Похоже, что хорошим прерыванием было бы создание Object
с нужной вам раскраской стиля и использование getCombinedStyle(styleA, yourStyleObject)
. Этот код должен иметь некоторую функциональность, чтобы различать разные группы, чтобы вы могли использовать атрибут id группы или что-то еще, чтобы установить цвет. Чтобы закрасить обводку или заливку:
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
может быть любым, поэтому вы можете установить его в качестве счетчика некоторого вида (например, st = setYourGroupStyle(st, level++);
), а затем определить, что происходит на основе этого значения.
Но вы можете получить письменное разрешение на использование этого класса. Я не нахожу никакого лицензионного соглашения для этого, которое ставит вас в юридическую неопределенность. Если это коммерческий проект, то стоит потратить время на получение разрешения.
НТН!