Опять они... Шрифты!

Опять они... Шрифты!
Информация
Автор/переводчик: 
Darkwing Duck
Описание: 

Как Вы поняли из названия, речь пойдет о шрифтах во флеш проектах.
На самом деле, данная тема уже затерта до дыр в просторах паутины, и все предельно просто, думал я, пока не приступил к работе.
И действительно, что сложного!? Все, что нужно - это:

  1. Встроить шрифт

    [Embed(source='./fonts/calibri.ttf', fontName='Calibri', mimeType='application/x-font-truetype', embedAsCFF='false')]
    public static var FONT_CLASS:Class;
  2. Создать текстовое поле и применить форматирование со встроенным шрифтом
    var myTextField:TextField = new TextField();
    myTextField.embedFonts = true;
    myTextField.text = "Test font embedding!";
     
    var myTextFormat:TextFormat = new TextFormat(“Calibri”);
    myTextField.setTextFormat(myTextFormat);
     
    addChild(myTextField);

Готово. Шрифт успешно встроился, и отображается в созданном текстовом поле!

Но это довольно простая ситуация, т.к. мы програмно создали текстовое поле. Но что, если мы не хотим создавать его програмно!? Т.е. было бы очень удобно создать пользовательский интерфейс (GUI) с текстовыми полями в Flash IDE, указать нужные шрифты в текстовых полях (не встраивая их, чтоб не нагружать либу swf с GUI), и после загрузки, сказать текстовым полям, чтоб они использовали встроенные шрифты (embedFonts=true) и добавить GUI на сцену. Получается, что шрифт встроен, в текстовых полях указаны нужные шрифты, и установлен флаг (embedFonts), и ожидаемый результат - в загруженных текстовых полях отобразится текст с помощью встроенных шрифтов. Такое было мое мнение... Давайте посмотрим:

  1. Создаем новый .fla файл и создаем в нем динамическое текстовое поле

  2. Далее создадим подложку и сконвертируем это все в мувиклип и в поле AS linkage напишем my_text_window
  3. Компилируем и кладем рядом с основным swf файлом приложения под именем "ui.swf".

Переходим к коду:

[Embed(source='./fonts/calibri.ttf', fontName='Calibri', mimeType='application/x-font-truetype', embedAsCFF='false')]
public static var FONT_CLASS:Class;
 
//-------------------------------------------------------------------
 
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onUILoaded);
loader.load(new URLRequest("ui.swf"));
 
//--------------------------------------------------------------------
 
protected function onUILoaded(event:Event):void
{
      LoaderInfo(event.currentTarget).removeEventListener(Event.COMPLETE, onUILoaded);
 
      // получаем ссылку на класс нашего GUI
      var uiClass:Class = LoaderInfo(event.currentTarget).applicationDomain.getDefinition("my_text_window") as Class;
 
      // создаем GUI
      var ui:DisplayObjectContainer = new uiClass();
 
      // получаем ссылку на текстовое поле в GUI      
      var myTextField:TextField = ui.getChildByName("test_txt") as TextField;
 
      // устанавливаем флаг для использования встроенного шрифта
      myTextField.embedFonts = true;
      myTextField.text = "Test embedding!";
 
      addChild(ui);
}

Теперь, исходя из того, что мы уже встроили шрифт Calibri.ttf (в примере выше), наш пользовательский интерфейс, загруженный и добавленный на сцену, будет отображать текст используя встроенный шрифт. Ну, так должно было быть). На деле все совсем не так.

Как мы видим из скриншота выше, текст не появился. Так в чем же дело? На этот вопрос я долго искал ответ, но в интернете толком ничего не нашел, а может плохо искал). Но все-таки один хороший человек поведал мне, почему так происходит. Дело в том, что происходит коллизия имени системного шрифта и встроенного (проблема возникает если в системе есть этот шрифт, но т.к. мы устанавливаем нужный шрифт в Flash IDE, то подразумевается, что шрифт есть в системе). Тут сразу ответ стает очевидным – при встраивании шрифта необходимо указать имя шрифта отличное от системного (я например добавил приставку ‘DD_’).

[Embed(source='./fonts/calibri.ttf', fontName='DD_Calibri', mimeType='application/x-font-truetype', embedAsCFF='false')]
public static var FONT_CLASS:Class;

Соответственно, мы должны изменить имя шрифта в формате текстового поля в методе onUILoaded:

protected function onUILoaded(event:Event):void
{
      //------------------------------------------------------------------ 
 
      // получаем текст формат нашего текстового поля
      var myTextFormat:TextFormat = myTextField.defaultTextFormat;
      // изменяем в нем имя шрифта
      myTextFormat.font = "DD_Calibri";
 
      // применяем новое форматирование для текста
      myTextField.defaultTextFormat = myTextFormat;
      myTextField.setTextFormat(myTextFormat);
 
      //--------------------------------------------------------------------
}

Вроде все. Запускаем! И снова текста нет*scratch*.
Проблема в том, что текстовое поле создано в другой swf. Для того чтоб загруженное текстовое поле видело встроенный шрифт, мы должны зарегистрировать шрифт:

Font.registerFont(FONT_CLASS);

Вот теперь точно все.

Как видим из скриншота - текст отобразился.*yes-yes*

На этом все, надеюсь для кого-то информация оказалась познавательной*yes*

Исходник: 

Впервые!

Если у вас было хоть раз желание сделать что-то новое и необычное, то этот видеокурс для вас! Знания ActionScript 3.0 вдохнут в ваши проекты новую жизнь, позволив тем самым поднять их на новый уровень

С помощью этого видеокурса вы пройдёте путь от новичка до Объектно-Ориентированного Программирования, сможете работать со многими популярными библиотеками и научитесь создавать сайты во flash! + Видеокурс по PaperVision3D в подарок!

Видеокурс содержит 119 видеоуроков в 12 главах. На сегодняшний день это единственный видеокурс, таких масштабов

Узнайте о других возможностях ActionScript 3.0

Внимание!

Вы можете изучить все секреты flash анимации всего за 3 недели! Перейти из разряда новичка в разряд опытного пользователя даже без посещения дорогих курсов и чтения толстенных талмудов.

110 видео уроков,

в превосходном качестве помогут пройти, Вам, терни flash анимации самым быстрым и легким путём! +ActionScript 3.0

Подробнее

Комментарии

Аватар пользователя vlok

я даже не думал что всё так сложно!!!
Автору большое спасибо!!! Я ТАК ДОЛГО ИСКАЛ ПОДОБНЫЙ МАТЕРИАЛ

Аватар пользователя hitab

Когда-то со шрифтами тоже мучался, не хотел отображаться, оказалось надо было поставить свойство embedFonts = true;

Аватар пользователя SarGun

)) ну это самая незначительная проблема, которая может возникнуть со шрифтами)