Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.10.2012, 00:51
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 1  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
По умолчанию AIR: шрифт и тексты в разных swf

Всем привет! Давно я здесь не появлялся

Имеется AIR приложение. В отдельном файле у нас заембежены шрифты (fonts.swf), ещё в одном файле компоненты (кнопочки, текст, экраны, components.swf) которые этот шрифт используют. Нужно это всё загрузить, кнопочки разместить на экране и всё должно выглядеть прекрасно.
Промучался я изрядно над этой задачей (раньше со шрифтами не работал) - вся работа со шрифтами похожа на некоторую магию, несмотря на результаты тестов, чёткой картины как это всё работает так и не вырабаталось.

Основная проблема вот в чём - даже если всё загрузить в один ApplicationDomain и прорегистрировать нужные шрифты где только можно, всё равно текст в текстфилдах, сконструированных в недрах components.swf, не отображается.
Где конструируются текстфилды, как оказалось, это очень важный момент, потому как в итоге обнаружил один из вариантов (и в тоже время единственный из известных мне) решения задачи — это создать статичный фабричный метод createTextField() в сфке со шрифтами, либо в AIR приложении (после регистрации в нём шрифтов) и использовать его для генерации текстовых полей в загружаемой swf с компонентами. Метод на мой взгляд довольно таки костыльный, но Flex, например, так и работает (proof).

Если делать тесты не в AIR, а в обычном плеере, то работает ещё такой вариант:
Эмбедим шрифты в корневую флешку, грузим в неё дочернюю. Затем передаем классы шрифтов из главной флешки в дочернюю и там регистрируем. Но данный способ работает в плеере, но почему-то уже не работает в AIR.

Очень интересно было бы понять как эта система работает на самом деле. Как-то на мой взгляд всё чрезмерно перемудрено и работает неочевидно. Буду благодарен за любую информацию.
__________________
TankiOnline
Я разработчик Alternativa3D

Старый 27.10.2012, 01:10
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Тут немного обсуждали проблему.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 27.10.2012, 01:14
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 3  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
ВОобще странная у вас проблема честно говоря. У меня никогда не возникало проблемы между взаимодействиями 3х swf один из которых шрифты. Что имеем : загружаем файл со шрифтами - трейсим, видим какие шрифты у нас есть ( через font listning ) . Далее либо создаем программно текстфилды добавляя туда нужный шрифт и форматирование ( можно и статичный класс - я лично так делаю ) , не забываем про embedfonts = true. Все работает. Но можно тоже самое проделать и с полями загруженной 3ей свфки , просто указать форматирование, нужный фонт нейм и не забыдь про эмбед - работать должно, и аппликейшн домейн поидее непричем.
__________________
Марк Tween

Старый 27.10.2012, 01:21
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Яски Посмотреть сообщение
Если делать тесты не в AIR, а в обычном плеере, то работает ещё такой вариант:
Эмбедим шрифты в корневую флешку, грузим в неё дочернюю. Затем передаем классы шрифтов из главной флешки в дочернюю и там регистрируем. Но данный способ работает в плеере, но почему-то уже не работает в AIR.
"передаем классы шрифтов из главной флешки в дочернюю". Это как сделано и зачем? Что-то мне казалось, что дочерние, из правильного дочернего аппдомена смогут воспользоваться дефинишинами, в т.ч. и шрифтами из домена родителя.

Добавлено через 5 минут
Цитата:
Сообщение от in4core Посмотреть сообщение
ВОобще странная у вас проблема честно говоря.
Перевожу. "Я с этим не сталкивался".
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 27.10.2012, 01:33
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 5  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Вау как быстро ответили!

Цитата:
Сообщение от in4core Посмотреть сообщение
Далее либо создаем программно текстфилды добавляя туда нужный шрифт и форматирование ( можно и статичный класс - я лично так делаю ) , не забываем про embedfonts = true. Все работает. Но можно тоже самое проделать и с полями загруженной 3ей свфки , просто указать форматирование, нужный фонт нейм и не забыдь про эмбед - работать должно, и аппликейшн домейн поидее непричем.
TextField'ы создаются из 3ей флешки. При добавлении их на экран, текст не отображается.

Цитата:
Сообщение от dimarik Посмотреть сообщение
"передаем классы шрифтов из главной флешки в дочернюю". Это как сделано и зачем? Что-то мне казалось, что дочерние, из правильного дочернего аппдомена смогут воспользоваться дефинишинами, в т.ч. и шрифтами из домена родителя.
Код AS3:
// 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);
}
Без регистрации шрифта в дочерней флешке не работает. Зарегистрировать шрифт в той флешке, в которой он заембеден невозможно - будет ошибка. И как я уже говорил данный способ не работает в AIR.
__________________
TankiOnline
Я разработчик Alternativa3D

Старый 27.10.2012, 01:35
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Перевожу. "Я с этим не сталкивался".
Да ты я смотрю битву экстрасенсов выиграл?!
__________________
Марк Tween

Старый 27.10.2012, 01:40
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Поговаривают, третий плюс ведет к новой регистрации персонажа. Врут, наверное. Так не хотелось бы терять такого грамотного специалиста.

Добавлено через 29 минут
Цитата:
Сообщение от Яски Посмотреть сообщение
Код AS3:
   Child["registerFont"](quadrat);
К делу пока не относится.
Разве
Код AS3:
Font.registerFont(font);
Класс-объект Font не один ли и тот же на данный Security Domain?

Можно, по такой идее, и не делегировать дочернему аппдомену из _того_же_ Security Domain вызов метода класса, а дернуть из себя, с нужным параметром. Эффект должен быть одинаковым (там в самом начале речь идет о XML.prettyIndent).
Font.registerFont _вроде_бы_ привязывает дефинишин фонта из целевого домена в (тот, в котором был вызван Font.registerFont?) или в тот, что является чайлдом системного, в котором находится вызвавший Font.registerFont? Что-то я тоже запутался.

Цитата:
Без регистрации шрифта в дочерней флешке не работает. Зарегистрировать шрифт в той флешке, в которой он заембеден невозможно - будет ошибка. И как я уже говорил данный способ не работает в AIR.
Похоже, что речь идет о разных security domian, в которых находятся loader и loadee. Мое предположение.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 27.10.2012 в 02:35.
Старый 27.10.2012, 02:43
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Поговаривают, третий плюс ведет к новой регистрации персонажа. Врут, наверное. Так не хотелось бы терять такого грамотного специалиста.
Так пускай руководство себя ведет нормально, а не занимается оскорблениями и экстросенсорикой. Хочешь бань - но мне кажется культуры от этого не прибавится
__________________
Марк Tween

Старый 28.10.2012, 11:04
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 9  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
dimarik, спасибо за статью! Многое проясняет.

Цитата:
Сообщение от dimarik Посмотреть сообщение
Похоже, что речь идет о разных security domian, в которых находятся loader и loadee. Мое предположение.
Я тоже пришёл к такому выводу - попробую использовать loadBytes(), возможно поможет.

Добавлено через 3 часа 7 минут
Протестировал секьюрные домены, проверил loadBytes() - ни один способ не работает.
В обычном плеере - локально запускаю демку, работает как предполагалось - если текстфилды и шрифты в одном домене, где и были зарегистрированы - всё работает.
Тот же способ в AIR не работает. Гружу флешку в домен приложения, проверил наличие в домене загруженных классов - всё ок. Зарегистрировал шрифты - они в enumerateFonts() появились и там и там. Но в TextField'ах, созданных в дочерней флешке, не отображаются текст - если создавать текстфилды в классах AIR приложения, текст отображается.

Добавлено через 12 часов 55 минут
Появилась версия, что всё дело вовсе не в AIR и в доменах секьюрности. Обнаружил статью, в которой человек сталкивается с проблемой при использовании текстов, выгруженных из Flash CS link. У меня как раз похожий случай, поскольку изначальный дизайн компонентов (кнопочки и т.д.) создаётся во Flash CS и выгружается в swf.

Добавлено через 28 часов 54 минуты
Всё - задача решена!

Проблема действительно была в Flash CS.
Он при экспорте swf, в котором есть текстовые поля с некоторым шрифтом, создаёт в этом swf пустое описание данного шрифта.
Из-за того, что шрифт в такой флешке уже как-бы есть, все вызовы registerFonts() с попыткой заменить их, игнорируются. Что в-общем противоречит документации - новая версия шрифта должна заменять старую.

В итоге решили задачу следующим образом:
Эмбедим шрифты в проект с изменённым именем fontName:
Код AS3:
		[Embed(source="res/Quadrat.ttf", fontName="QuadratGroteskTanks", embedAsCFF="false", unicodeRange="U+0021-U+22C5")]
		private static var quadrat:Class;
		[Embed(source="res/MyriadPro.ttf", fontName="MyriadProTanks", embedAsCFF="false")]
		private static var myriad:Class;
В текстовых полях, используем новое имя. В этом случае конфликта шрифтов не происходит и всё работает как предполагалось.
__________________
TankiOnline
Я разработчик Alternativa3D

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:43.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.