поиск

Включение файлов в SWF в виде байтовой последовательности

Намусорил: Алексей «Vooparker» Аникутин
В категории: ActionScript 3, Flex 2, Компиляция

Те из вас, кто собирает свои 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 не получится.
Удачи!



Kомментариев - 7 к «Включение файлов в SWF в виде байтовой последовательности»

Внедрение внешних ресурсов в конечный SWF | My First AS3 Application [28 октября, 2007 в 20:37]

[...] Итак, всем читать статью "Включение файлов в SWF в виде байтов.... [...]

Andy [29 октября, 2007 в 13:04]

Очень познавательно. Спасибо за статью! :)

Slon_vsapogah [14 ноября, 2007 в 16:25]

Отличный пост, узнал много полезного. Правда (по наводке Филипа FSB) оказывается, что при эмбеде .swf-файлов у них пропадает код из таймлайна. Также есть там есть шрифты, то они заменяют собой шрифты в родительском проекте (а если там 7 букв только? :) Подозреваю, что есть и еще проблемы - со скоростью билда и временем старта.

А так - хорошая штука.

Vooparker [14 ноября, 2007 в 18:00]

2Slon_vsapogah: спасибо за комментарий, не знал что ембед swf-файлов обладает такими побочными эффектами. Интересно, эти эффекты проявляются вне зависимости от того был ли swf-файл включен как бинарный или нет?

Использование фильтров Pixel Bender в ActionScript 3 | Garbage Collector [21 мая, 2008 в 02:51]

[...] (как это делается, можно узнать из статьи «Включение файлов в SWF в виде байтовой последовательнос...»). В этом случае наше приложении будет выглядеть [...]

Fabrikart [15 июля, 2008 в 21:05]

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

Юрий Яровой [15 июля, 2008 в 23:11]

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

Написать комментарий:

 

Bы можете использовать следующие теги для форматирования: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>



User's collector

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


 запомнить меня 
Я новый пользователь

На правах рекламы

больничные листы; купить диплом в санкт петербурге