User's collector

Внимание!   Данная опция будет доступна только после того, как вы авторизуетесь.
   запомнить меня 

Довольно часто приходится встраивать в ActionScript-приложения дополнительные шрифты, которых может не оказаться на компьютере конечного пользователя. Однако к этой операции нужно подходить со знанием дела. Зачастую совершенно нет необходимости во встраивании шрифта в ролик целиком — в большинстве приложений, с которыми мне приходилось иметь дело, достаточно было организовать поддержку латинских и кириллических символов в текстовых полях, не забывая, конечно же, о цифрах и символах пунктуации. Таким способом можно сократить размер итогового SWF-ролика на несколько десятков килобайт.

Уже достаточно длительный период времени я компилирую приложения при помощи Flex SDK, прибегая к Flash IDE только лишь для того, чтобы встроить векторную графику. Поэтому и речь в этой статье пойдет о том, как встраивать шрифты в приложениях, компилируемых именно таким способом.

Для того чтобы справиться с этой задачей, мы обращаемся к документации по метатэгу Font и видим, что одним из его атрибутов является unicodeRange. Именно при помощи этого атрибута мы можем указывать Unicode-значения символов шрифта (а так же интервалы значений символов), которые компилятор должен встроить в ролик. Прибегнув к таблице символов Unicode, определяем, что нам необходимо импортировать следующие символы:

  • U+0020-U+007F — основная латиница;
  • U+00A0-U+00FF — дополнительные символы, которые могут понадобиться (вроде знака © или русских кавычек-елочек);
  • U+0400-U+04FF — кириллические символы верхнего и нижнего регистров.

Если собрать все вместе, то код для встраивания шрифта должен быть примерно следующим:

Actionscript:
  1. [Embed(source="/../assets/fonts/CHR56__C.TTF",
  2.     fontFamily="CharterC_i", fontStyle="italic",
  3.     unicodeRange="U+0020-U+007F, U+00A0-U+00FF, U+0400-U+04FF")]

Если вам есть чем дополнить эти интервалы символов, то добро пожаловать в комментарии. Вполне возможно, что я что-то упустил. :-)

4 комментария

Теги:

Будущий релиз Flex 3 породил массу статей, посвященных новшествам и изменениям как в самом фреймворке, так и в новой версии Flex Builder. На этом фоне без внимания остались изменения, произошедшие в компиляторах, поставляемых в комплекте с Flex 3 SDK. Сегодня я предлагаю исправить эту несправедливость. :-)
Как вы уже поняли из заголовка, речь пойдет о новой возможности mxmlc — условной компиляции. Условная компиляция позволяет разработчику включать или исключать блоки кода для конкретной сборки вашего приложения. Компилятор mxmlc дает возможность определить значения констант на этапе компиляции. Это стало возможно благодаря появлению параметра –define. Давайте посмотрим на общий синтаксис этого параметра:

CODE:
  1. -define=namespace::variable_name,value

Пояснять синтаксис, я думаю, будет излишне, поэтому предлагаю сразу перейти к примерам. Допустим, в коде вашего приложения на этапе разработки должен присутствовать блок кода, необходимый для отладки, который по понятным причинам не должен присутствовать в финальной сборке нашего приложения. Начнем с определения параметра компилятору:

CODE:
  1. mxmlc -define+=CONFIG::debug,true [прочие параметры]

Примечание: Обратите внимание на то, что вместо = используется +=. При использовании =, предыдущие переменные переданные с помощью параметра –define теряются.

Теперь в исходном коде нашего приложения мы можем выделить необходимый для отладки и совершенно нежелательный для финальной версии приложения блок кода следующим образом:

Actionscript:
  1. CONFIG::debug
  2. {
  3.     // код, который должен выполняться на этапе разработки
  4. }

При сборке финальной версии приложения, нам достаточно будет изменить в параметрах компилятора значение CONFIG::debug на false, и весь отладочный блок кода будет исключен.
В качестве значений переменных, передаваемых компилятору могут выступать не только булевы величины, но и числа, строки и вычисляемые выражения:

CODE:
  1. // числовое значение
  2. -define+=OPTIONS::someNumber,3
  3.  
  4. // строковое значение
  5. -define+=NAMES::author,"vooparker"
  6.  
  7. // вычисляемое выражение
  8. -define+=OPTIONS::someNumber,"3-1"

Если вы используете для сборки своего проекта собственный config.xml, то определить значение переменных вы можете в своем конфигурационном файле в блоке <compiler>…</compiler>. Например:

XML:
  1. <compiler>
  2.     ...
  3.     <define>
  4.         <name>NAMES::author</name>
  5.         <value>"vooparker"</value>
  6.     </define>
  7.     <define>
  8.         <name>OPTIONS::someNumber</name>
  9.         <value>3-1</value>
  10.     </define>
  11. </compiler>

Тех из вас, кому представленный материал показался интересным, отсылаю к первоисточнику. Удачи! :)

8 комментариев

Теги:

Те из вас, кто собирает свои as3 приложения с помощью mxmlc знакомы с метатэгом [Embed], который используется для внедрения внешних ресурсов в конечный swf. Среди поддерживаемых mxmlc типов внедряемых ресурсов присутствуют файлы изображения (JPG, JPEG, PNG и SVG), swf файлы, символы из swf файлов, mp3 файлы, файлы системных и TrueType шрифтов. Но не все знают, что с помощью [Embed] можно внедрить любой файл в виде байтовой последовательности.
Как вы знаете включение ресурсов возможно как на уровне свойства так и на уровне класса. Это справедливо и для файлов, которые мы включаем в виде байтовой последовательности. В примере ниже мы включаем в наш клип текстовый файл на уровне свойства (обратите внимание на дополнительный параметр mimeType, именно он сообщает mxmlc, что мы хотим включить файл как байтовую последовательность):

Actionscript:
  1. [Embed(source="readme.txt", mimeType="application/octet-stream")]
  2. public var Readme:Class;

Если вы хотите включить свой файл на уровне класса то вы должны будете наследоваться от mx.core.ByteArrayAsset:

Actionscript:
  1. package
  2. {
  3.     import mx.core.ByteArrayAsset;
  4.    
  5.     [Embed(source="readme.txt", mimeType="application/octet-stream")]
  6.     public class Readme extends ByteArrayAsset {}
  7. }

После этого, чтобы создать экземепляр класса нашего включенного файла просто вызываем конструктор:

Actionscript:
  1. var readme:ByteArrayAsset = new Readme(); // для уровня свойства
  2. var readme:Readme = new Readme(); // для уровня класса

Так как в любом случае наш ресурс является наследником или экземпляром ByteArrayAsset, который в свою очередь расширяет ByteArray, то мы можем использовать все методы последнего. Например, прочитать содержимое текстового файла из нашего примера можно так:

Actionscript:
  1. var readmeContent:String = readme.readUTFBytes(readme.length);

В бинарном виде вы можете включать и файлы поддерживаемых типов. Например, вы можете включить другой swf в виде последовательности байтов, после чего можно внести swf в список видимых объектов или получить доступ к его внутренним ресурсам, предварительно использовав Loader:

Actionscript:
  1. package
  2. {
  3.     import flash.display.Loader;
  4.     import flash.display.Sprite;
  5.     import flash.events.Event;
  6.    
  7.     public class EmbedResourceExample extends Sprite
  8.     {
  9.         [Embed(source="assets/resources.swf", mimeType="application/octet-stream")]
  10.         private var Resources:Class;
  11.        
  12.         public function EmbedResourceExample ()
  13.         {
  14.             var loader:Loader = new Loader();
  15.             // Подписываемся на событие INIT, после которого
  16.             // мы получим доступ к классам внутри включенного swf
  17.             loader.contentLoaderInfo.addEventListener(Event.INIT, resourceInitHandler);
  18.             // Загружаем swf как байтовую последовательность
  19.             loader.loadBytes(new Resources());
  20.         }
  21.        
  22.         private function resourceInitHandler (e:Event):void
  23.         {
  24.             // Извлекаем и создаем экземпляр класса из включенного swf
  25.             var SomeClass:Class = e.target.content.loaderInfo.applicationDomain.getDefinition("SomeClass") as Class;
  26.             var someClass:Object = new SomeClass();
  27.         }
  28.     }
  29. }

Пожалуй на этом все.
Напоследок хочу отметить, что метатэг [Embed] не распознается flash compiler и включить тот же текстовый файл в swf силами Flash IDE не получится.
Удачи!

7 комментариев

Теги: