раскраска разных слоев SVG-файла в as3 - PullRequest
1 голос
/ 08 января 2012

У меня есть проект, в котором разные слои файла SVG должны быть окрашены. Я попытался сделать преобразование цвета, но он просто накладывает цвет поверх изображения SVG. Есть ли что-нибудь, что можно сделать, чтобы программно покрасить различные слои SVG-файла разными цветами в AS3?

Заранее спасибо.

1 Ответ

2 голосов
/ 09 января 2012

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++);), а затем определить, что происходит на основе этого значения.

Но вы можете получить письменное разрешение на использование этого класса. Я не нахожу никакого лицензионного соглашения для этого, которое ставит вас в юридическую неопределенность. Если это коммерческий проект, то стоит потратить время на получение разрешения.

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...