|
|
|||||
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
AIR: шрифт и тексты в разных swf
Всем привет! Давно я здесь не появлялся
Имеется AIR приложение. В отдельном файле у нас заембежены шрифты (fonts.swf), ещё в одном файле компоненты (кнопочки, текст, экраны, components.swf) которые этот шрифт используют. Нужно это всё загрузить, кнопочки разместить на экране и всё должно выглядеть прекрасно. Промучался я изрядно над этой задачей (раньше со шрифтами не работал) - вся работа со шрифтами похожа на некоторую магию, несмотря на результаты тестов, чёткой картины как это всё работает так и не вырабаталось. Основная проблема вот в чём - даже если всё загрузить в один ApplicationDomain и прорегистрировать нужные шрифты где только можно, всё равно текст в текстфилдах, сконструированных в недрах components.swf, не отображается. Где конструируются текстфилды, как оказалось, это очень важный момент, потому как в итоге обнаружил один из вариантов (и в тоже время единственный из известных мне) решения задачи — это создать статичный фабричный метод createTextField() в сфке со шрифтами, либо в AIR приложении (после регистрации в нём шрифтов) и использовать его для генерации текстовых полей в загружаемой swf с компонентами. Метод на мой взгляд довольно таки костыльный, но Flex, например, так и работает (proof). Если делать тесты не в AIR, а в обычном плеере, то работает ещё такой вариант: Эмбедим шрифты в корневую флешку, грузим в неё дочернюю. Затем передаем классы шрифтов из главной флешки в дочернюю и там регистрируем. Но данный способ работает в плеере, но почему-то уже не работает в AIR. Очень интересно было бы понять как эта система работает на самом деле. Как-то на мой взгляд всё чрезмерно перемудрено и работает неочевидно. Буду благодарен за любую информацию. |
|
|||||
[+4 06.05.14]
|
ВОобще странная у вас проблема честно говоря. У меня никогда не возникало проблемы между взаимодействиями 3х swf один из которых шрифты. Что имеем : загружаем файл со шрифтами - трейсим, видим какие шрифты у нас есть ( через font listning ) . Далее либо создаем программно текстфилды добавляя туда нужный шрифт и форматирование ( можно и статичный класс - я лично так делаю ) , не забываем про embedfonts = true. Все работает. Но можно тоже самое проделать и с полями загруженной 3ей свфки , просто указать форматирование, нужный фонт нейм и не забыдь про эмбед - работать должно, и аппликейшн домейн поидее непричем.
__________________
Марк Tween |
|
|||||
.
|
Цитата:
Добавлено через 5 минут Перевожу. "Я с этим не сталкивался". |
|
|||||
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
Вау как быстро ответили!
Цитата:
Цитата:
// Main.swf [Embed (font.swf, fontName="Quadrat")] private static class quadrat; public function Main() { // грузим дочернюю флешку loader = new Loader(); loader.loaderInfo.addEventListener(Event.COMPLETE, onLoad); loader.load(new UrlRequest("Child.swf")); } private function onLoad(e:Event):void { var Child:Class = Class(LoaderInfo(e.target).applicationDomain.getDefinition("::Child")); Child["registerFont"](quadrat); } // Child.swf public function Child { var text:TextField = new TextField(); text.embedFonts = true; text.defaultTextFormat = new TextFormat("Quadrat", 12); addChild(text) } public static function registerFont(font:Class):void { Font.registerFont(font); } |
|
|||||
.
|
Поговаривают, третий плюс ведет к новой регистрации персонажа. Врут, наверное. Так не хотелось бы терять такого грамотного специалиста.
Добавлено через 29 минут К делу пока не относится. Разве Класс-объект Font не один ли и тот же на данный Security Domain? Можно, по такой идее, и не делегировать дочернему аппдомену из _того_же_ Security Domain вызов метода класса, а дернуть из себя, с нужным параметром. Эффект должен быть одинаковым (там в самом начале речь идет о XML.prettyIndent). Font.registerFont _вроде_бы_ привязывает дефинишин фонта из целевого домена в (тот, в котором был вызван Font.registerFont?) или в тот, что является чайлдом системного, в котором находится вызвавший Font.registerFont? Что-то я тоже запутался. Цитата:
Последний раз редактировалось dimarik; 27.10.2012 в 02:35. |
|
|||||
[+4 06.05.14]
|
Цитата:
__________________
Марк Tween |
|
|||||
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
dimarik, спасибо за статью! Многое проясняет.
Цитата:
Добавлено через 3 часа 7 минут Протестировал секьюрные домены, проверил loadBytes() - ни один способ не работает. В обычном плеере - локально запускаю демку, работает как предполагалось - если текстфилды и шрифты в одном домене, где и были зарегистрированы - всё работает. Тот же способ в AIR не работает. Гружу флешку в домен приложения, проверил наличие в домене загруженных классов - всё ок. Зарегистрировал шрифты - они в enumerateFonts() появились и там и там. Но в TextField'ах, созданных в дочерней флешке, не отображаются текст - если создавать текстфилды в классах AIR приложения, текст отображается. Добавлено через 12 часов 55 минут Появилась версия, что всё дело вовсе не в AIR и в доменах секьюрности. Обнаружил статью, в которой человек сталкивается с проблемой при использовании текстов, выгруженных из Flash CS link. У меня как раз похожий случай, поскольку изначальный дизайн компонентов (кнопочки и т.д.) создаётся во Flash CS и выгружается в swf. Добавлено через 28 часов 54 минуты Всё - задача решена! Проблема действительно была в Flash CS. Он при экспорте swf, в котором есть текстовые поля с некоторым шрифтом, создаёт в этом swf пустое описание данного шрифта. Из-за того, что шрифт в такой флешке уже как-бы есть, все вызовы registerFonts() с попыткой заменить их, игнорируются. Что в-общем противоречит документации - новая версия шрифта должна заменять старую. В итоге решили задачу следующим образом: Эмбедим шрифты в проект с изменённым именем fontName: В текстовых полях, используем новое имя. В этом случае конфликта шрифтов не происходит и всё работает как предполагалось. |
Часовой пояс GMT +4, время: 15:04. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|