Февраль 2011

Руководство по actionscript. часть 6, стр. 055

Встраивание отображаемых элементов на этапе компиляции

Чтобы включить внешний отображаемый элемент в приложение, написанное на языке ActionScript, на этапе компиляции, мы используем тег метаданных [ Embed ]. Этот тег добавляет указанный внешний элемент в SWF-файл и делает этот элемент доступным для программы в виде определенного пользователем или автоматически сгенерированного класса. Экземпляры встроенного элемента создаются из этого класса с помощью стандартного синтаксиса оператора new языка ActionScript.

I Тег метаданных [Embed] поддерживается приложением Flex Builder 2 и консольным & 4 * компилятором mxmlc. Однако тег метаданных [Embed] не поддерживается приложением flft Adobe Flash CS3. Возможно, поддержка тега [Embed] появится в будущих версиях среды разработки Flash.

Для использования тега [Embed] мы должны предоставить компилятору доступ к библиотеке flex, swc, поддерживающей компилятор Flex. По умолчанию все проекты, создаваемые в приложении Flex Builder 2, автоматически включают библиотеку flex. s wc в пути библиотек языка ActionScript, поэтому в приложении Flex Builder 2 методики, рассматриваемые в данном разделе, будут работать без каких-либо специальных настроек компилятора.

Замечание по размеру файла и потреблению памяти

В отличие от методик загрузки элементов на этапе выполнения, рассмотренных в этой главе, встраивание отображаемого элемента на этапе компиляции с помощью тега метаданных [Embed] увеличивает размер SWF-файла, загружающего этот элемент, а также увеличивает объем используемой средой выполнения Flash памяти. По этой причине встраивать элемент на этапе компиляции необходимо только в том случае, когда вы абсолютно уверены в том, что приложению обязательно понадобится этот элемент. В противном случае загружать данный элемент следует на этапе выполнения по мере необходимости.

Например, представьте приложение, которое является электронным каталогом продукции с изображениями тысячи товаров и одним изображением экрана приветствия. Изображение экрана приветствия выводится при каждом запуске приложения, и, следовательно, его целесообразно встроить с помощью тега метаданных [ Embed]. В отличие от этого, изображение товара необходимо только в том случае, когда пользователь просматривает нужный товар, и, следовательно, оно должно загружаться на этапе выполнения и удаляться, когда пользователь завершит просмотр этого товара.

Теперь, когда мы узнали, в каких случаях применяется тег [Embed], посмотрим, как использовать его на практике. В следующем разделе рассматривается обобщенный код, необходимый для использования тега [ Embed ]. В последующих разделах приведены конкретные примеры использования обобщенного кода, рассматриваемого в следующем разделе.

Обобщенный синтаксис тега [Embed]

Тег метаданных [Embed] может применяться либо на уровне определения переменной экземпляра, либо на уровне определения класса.

Руководство по actionscript. часть 6, стр. 056

Следующий код демонстрирует типовое использование тега [Embed] на уровне определения переменной:

[Embed (source="путьКФайлу") ] private var ИмяКласса:C1ass;

При компиляции данного кода компилятор языка ActionScript автоматически генерирует новый класс, представляющий внешний элемент, местоположение которого определяется значением путьКФайлу, и присваивает этот класс закрытой переменной с именем ИмяКласса. Суперклассом нового класса является один из классов в пространстве имен mx. core, предназначенных для встраивания элементов. Как мы увидим в последующих разделах, выбор конкретного класса-прослойки зависит от типа встраиваемого элемента. Значение путьКФайлу должно определять местоположение файла элемента с помощью одного из следующих способов:

? абсолютной ссылки, предоставляющей компилятору доступ к элементу на локальном компьютере (например, с: /assets/photo. jpg);

? относительной ссылки, сформированной по отношению к исходному файлу на языке ActionScript, из которого происходит встраивание элемента (например, . . /images/photo. jpg).

Стоит отметить, что, поскольку переменная ИмяКласса ссылается на класс, ее типом данных является Class. Когда переменная ссылается на объект Class, первая буква в имени этой переменной обычно записывается в верхнем регистре (в соответствии с общепринятым стилем именования классов).

Установив связь между встраиваемым элементом и переменной ИмяКласса, мы используем следующий знакомый нам код для создания нового экземпляра элемента.

new ИмяКласса( );

Теперь вернемся к обобщенному синтаксису для использования тега метаданных [Embed] на уровне определения класса. Следующий код демонстрирует общий подход:

[Embe6(source=" путьКФайлу")]

public class ИмяКласса extends ТипЭлемента {

}

При выполнении предыдущего кода внешний элемент, путь к которому определяется значением путьКФайлу, связывается с классом ИмяКласса. Класс ИмяКласса должен быть определен с использованием модификатора управления доступом public и должен расширять класс ТипЭлемента, который является одним из классов-прослоек пространства имен mx. core платформы разработки Flex, предназначенных для встраивания элементов. В последующих разделах будет рассмотрено, какие конкретные классы-прослойки должны применяться для различных типов элементов, встраиваемых на уровне класса.

Руководство по actionscript. часть 6, стр. 057

Чтобы создать новый экземпляр элемента, встроенного на уровне класса, мы снова используем следующий стандартный код:

new ИмяКласса( );

Поддерживаемые типы элементов

При использовании тега метаданных [ Embed ] либо на уровне переменной, либо на уровне класса, поддерживаются следующие типы отображаемых элементов:

? растровые изображения в формате GIF, JPEG или PNG;

? файлы в формате SVG;

? символы из SWF-файлов предыдущих версий (то есть в формате приложения Flash Player 8 или более старых версий);

? любой файл, представляющий бинарные данные.

Кроме того, встраивание SWF-файлов целиком, независимо от их версии, поддерживается тегом [Embed] только на уровне определения переменной.

Стоит отметить, что с помощью тега метаданных [Embed] нельзя встроить отдельные символы и классы из SWF-файла в формате приложения Flash Player 9 (или более поздних версий). Вместо этого для обращения к отдельным символам и классам следует использовать один из следующих способов.

Руководство по actionscript. часть 6, стр. 058

? Встроить SWF-файл символа или класса на уровне переменной (дополнительные сведения можно получить в подразд. «Встраивание SWF-файлов целиком»), а затем использовать метод экземпляра getDefinition ( ) класса ApplicationDomain для обращения к этому символу или классу (дополнительную информацию можно найти в подразд. «Использование метода getDefinition( ) для обращения к классу во встроенном SWF-файле»).

? Встроить SWF-файл символа или класса в виде бинарных данных (дополнительную информацию можно найти в подразд. «Встраивание файлов в виде бинарных данных»), а затем использовать метод экземпляра getDefinition ( ) класса ApplicationDomain для обращения к этому символу или классу (дополнительные сведения можно получить в подразд. «Использование метода getDefinition( ) для обращения к классу во встроенном SWF-файле»).

? Создать ссылку на SWC-файл, содержащий класс или символ (дополнительную информацию можно найти в подразд. «Предоставление компилятору доступа к загружаемому классу» разд. «Проверка типов на этапе компиляции для динамически загружаемых элементов»).

Помимо отображаемых элементов, рассматриваемых в данном разделе, тег метаданных м? 4 * [Embed] может применяться для встраивания звуковых файлов и шрифтов.

Информацию по встраиванию звуковых файлов можно найти в разделе Flex Programming Topics > Embedding Assets руководства разработчика на платформе Flex 2 корпорации Adobe.

Информацию о встраивании шрифтов можно найти в разд. «Шрифты и отображение текста» гл. 27. Дополнительную информацию также можно найти в разделе

Customizing the User Interface > Using Fonts > Using Embedded fonts > Embedded font syntax > Embedding Fonts in ActionScript руководства разработчика на платформе Flex 2 корпорации Adobe.

Теперь, когда мы познакомились с основным кодом, используемым для встраивания внешнего элемента на этапе компиляции, рассмотрим несколько конкретных примеров.

Встраивание растровых изображений

Следующий код демонстрирует, как встроить изображение с именем photo. jpg на уровне переменной. Код предполагает, что файл класса, из которого происходит встраивание изображения, и файл изображения находятся в одной директории. При выполнении этого кода среда Flash автоматически генерирует класс, представляющий элемент photo. j pg, и присваивает этот класс переменной Photo, позволяя создавать экземпляры данного элемента на этапе выполнения. Этот автоматически сгенерированный класс расширяет класс mx. core. BitmapAsset.

Руководство по actionscript. часть 6, стр. 059

[Embed(source="photo. jpg")] private var Photo:Class;

Следующий код показывает, как встраивать изображение photo. jpg на уровне класса. Снова предполагается, что файл класса и файл элемента находятся в одной директории. Обратите внимание, что по необходимости класс расширяет класс mx. core. BitmapAsset.

package { import mx. core. BitmapAsset;

[Embed(source="photo. jpg")]

public class Photo extends BitmapAsset {

}

}

Чтобы создать новый экземпляр встроенного изображения, мы используем следующий код (независимо от того, было изображение встроено на уровне переменной или на уровне класса):

new Photo( )

Присваивая экземпляр встроенного изображения переменной, в качестве типа данных этой переменной мы выбираем либо класс mx. core. BitmapAsset (для элементов, встраиваемых на уровне переменной), либо класс Photo (для элементов, встраиваемых на уровне класса):

var photo:BitmapAsset = new Photo( ); // Уровень переменной var photo:Photo = new Photo( ): // Уровень класса

Созданный экземпляр, как и любой другой отображаемый объект, может быть добавлен в список отображения:

addChild(photo);

Обратите внимание, что тег метаданных [ Embed] поддерживает механизм форматирования scale-9 для встраиваемых растровых изображений. Если для встраивае-

мого растрового изображения применяется механизм форматирования scale-9, то автоматически сгенерированный класс расширяет класс mx. core. SpriteAsset, а не класс mx. core. BitmapAsset. Подробную информацию о механизме форматирования scale-9 и встраиваемых растровых изображениях можно найти в разделе Flex Programming Topics > Embedding Assets > Embedding asset types > Using scale-9 formatting with embedded images руководства разработчика на платформе Flex 2 корпорации Adobe.

Руководство по actionscript. часть 6, стр. 060

Встраивание файлов в формате SVG

Следующий код демонстрирует, как встроить изображение в формате SVG с именем line. svg на уровне переменной. Код предполагает, что файл класса, из которого происходит встраивание изображения в формате SVG, и файл изображения в формате SVG находятся в одной директории. При выполнении этого кода среда Flash автоматически генерирует класс, представляющий элемент line. svg, и присваивает этот класс переменной SVGLine, позволяя создавать экземпляры данного элемента на этапе выполнения. Этот автоматически сгенерированный класс расширяет класс mx. core. SpriteAsset.

[Embed(sou rce=" 1 i ne. s vg")] private var SVGLine:Class;

Следующий код показывает, как встраивать изображение в формате SVG с именем line. svg на уровне класса. Снова предполагается, что файл класса и файл элемента находятся в одной директории. Обратите внимание, что по необходимости класс расширяет класс mx. core. SpriteAsset.

package { import mx. core. SpriteAsset;

[Embed(sou rce="1i ne. s vg")]

public class SVGLine extends SpriteAsset {

}

}

Чтобы создать новый экземпляр встроенного изображения в формате SVG, мы используем следующий код (независимо от того, было изображение в формате SVG встроено на уровне переменной или на уровне класса):

new SVGLine( )

Присваивая экземпляр встроенного изображения в формате SVG переменной, в качестве типа данных этой переменной мы выбираем либо класс mx. core. SpriteAsset (для элементов, встраиваемых на уровне переменной), либо класс SVGLine (для элементов, встраиваемых на уровне класса):

var line:SpriteAsset = new SVGLine( ); // Уровень переменной var line: SVGLine = new SVGLine( ); // Уровень класса

Созданный экземпляр, как и любой другой отображаемый объект, может быть добавлен в список отображения:

Встраивание SWF-файлов целиком

Следующий код демонстрирует, как целиком встроить SWF-файл с именем Арр. swf на уровне переменной. Код предполагает, что файл класса, из которого происходит встраивание SWF-файла, и сам SWF-файл находятся в одной директории. При выполнении этого кода среда Flash автоматически генерирует класс, представляющий элемент Арр. swf, и присваивает этот класс переменной Арр, позволяя создавать экземпляры данного элемента на этапе выполнения. Этот автоматически сгенерированный класс расширяет класс mx. core. MovieClipLoaderAsset.

Руководство по actionscript. часть 6, стр. 061

[Embed(s ou rce="App. swf")] private var App:Class;

Целиком SWF-файлы могут быть встроены только на уровне переменной.

Чтобы создать новый экземпляр встроенного SWF-файла, мы используем следующий код:

new Арр( )

Присваивая экземпляр встроенного SWF-файла переменной, в качестве типа данных этой переменной мы выбираем класс mx. core. MovieClipLoaderAsset:

var app:MovieClipLoaderAsset = new App( );

Созданный экземпляр, как и любой другой отображаемый объект, может быть добавлен в список отображения:

addChild(app);

Встраивание символов из SWF-файлов предыдущих версий

Следующий код демонстрирует, как на уровне переменной встроить отдельный символ с именем Ball из SWF-файла с именем f р8арр. swf в формате приложения Flash Player 8 или более ранней версии. Код предполагает, что файл класса, из которого происходит встраивание символа, и SWF-файл, содержащий этот символ, находятся в одной директории. При компиляции этого кода компилятор языка ActionScript автоматически генерирует класс, представляющий символ Ball, и присваивает этот класс переменной FP8Ball, позволяя создавать экземпляры данного символа на этапе выполнения. Автоматически сгенерированный класс расширяет класс элемента из пространства имен mx. core, соответствующий типу символа Ball (то есть классы MovieClipAsset, TextFieldAsset, ButtonAsset или класс Spr i teAs set для клипов, состоящих из одного кадра). В коде обратите внимание на использование дополнительного параметра symbol тега [Embed]:

[Embed(s ou гсе="fр8а рр. swf", symbol="Ba11")] private var FP8Ball:Class;

Следующий код демонстрирует, как на уровне класса встроить отдельный символ с именем Ball из SWF-файла с именем f р8арр. swf в формате приложения Flash Player 8 или более ранней версии. Вновь предполагается, что файл класса и файл

элемента находятся в одной директории. В этом примере мы считаем, что символ Ball является клипом, поэтому класс элемента по необходимости расширяет класс mx. core. MovieClipAsset.

Руководство по actionscript. часть 6, стр. 062

Package { import mx. core. MovieClipAsset;

[Embed(source="fp8app. swf", symbol="Ball")] public class FP8Ball extends MovieClipAsset { }

}

Чтобы создать новый экземпляр встроенного символа, мы используем следующий код (независимо от того, был символ встроен на уровне переменной или на уровне класса):

new FP8Ball( )

Если символ был встроен на уровне переменной, то при присваивании экземпляра этого символа переменной в качестве ее типа данных мы выбираем класс элемента из пространства имен mx. core, соответствующий типу символа (то есть один из классов MovieClipAsset, TextFieldAsset или ButtonAsset). Например, наш символ Ball является клипом, поэтому экземпляры класса FP8Ball должны присваиваться переменным типа MovieClipAsset.

var fp8ball:MovieClipAsset = new FP8Ball( );

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

var fp8ball:FP8Ball = new FP8Ball( );

Созданный экземпляр, как и любой другой отображаемый объект, может быть добавлен в список отображения:

addChild(fp8ball);

Встраивание файлов в виде бинарных данных

Тег метаданных [Embed] может применяться для встраивания в приложение бинарных данных (байтов) из любого файла в виде массива байтов. В дальнейшем приложение может работать с этими байтами. Например, если встраиваемые бинарные данные представляют файл в формате GIF, JPEG, PNG или SWF, то приложение может использовать класс Loader для преобразования этих данных в отображаемый элемент.

Руководство по actionscript. часть 6, стр. 063

В следующем коде мы встраиваем SWF-файл с именем f р9арр. swf, имеющий формат приложения Flash Player 9, в виде бинарных данных на уровне переменной. Этот код предполагает, что файл класса, из которого происходит встраивание бинарных данных, и файл, содержащий эти данные, находятся в одной директории. При выполнении этого кода среда Flash автоматически генерирует класс, представляющий бинарные данные, и присваивает этот класс переменной FP9BinaryData, позволяя использовать данные на этапе выполнения. Автоматически сгенерированный класс

расширяет класс mx. core. By teArrayAsset. В приведенном коде обратите внимание на использование дополнительного параметра mimeType тега [ Embed]:

[Embed(source="fp9app. swf", mimeType="application/octet-stream")] private var FP9BinaryData-.Class;

В следующем коде мы встраиваем SWF-файл с именем fp9app. swf, имеющий формат приложения Flash Player 9, в виде бинарных данных на уровне класса. Снова предполагается, что файл класса и файл элемента находятся в одной директории. Обратите внимание, что по необходимости этот класс расширяет класс mx. core. ByteArrayAsset.

package { import mx. core. ByteArrayAsset;

[Embed(source="fp9app. swf", mimeType="application/octet-stream")]

public class FP9BinaryData extends ByteArrayAsset {

}

}

Чтобы создать новый экземпляр встроенных бинарных данных, мы используем следующий код (независимо от того, были данные встроены на уровне переменной или на уровне класса):

new FP9BinaryData( )

Присваивая экземпляр встроенных бинарных данных переменной, в качестве типа данных этой переменной мы выбираем либо класс mx. core. ByteArrayAsset (для элементов, встраиваемых на уровне переменной), либо класс, который применялся для встраивания символа (для элементов, встраиваемых на уровне класса):

var fp9binarydata:ByteArrayAsset = new FP9BinaryData( ); // Уровень

// переменной

var fp9binarydata:FP9BinaryData = new FP9BinaryData( ); // Уровень класса

Если встроенные бинарные данные представляют файл в формате GIF, JPEG, PNG или SWF, то после создания экземпляра этих данных мы можем использовать класс Loader для генерации отображаемого элемента, как показано в следующем коде:

var loader.-Loader = new Loader ( ); 1oader.1oadBytes(fp9bi narydata); addChilddoader);

После инициализации элемент может быть добавлен в список отображения с помощью методик, рассмотренных ранее в подразд. «Отображение загруженного элемента на экране» разд. «Использование класса Loader для загрузки отображаемых элементов на этапе выполнения».

Руководство по actionscript. часть 6, стр. 064

Методика встраивания элемента в виде бинарных данных может использоваться для встраивания в приложение файлов XML на этапе компиляции. Это демонстрирует листинг 28.14.

Листинг 28.14. Встраивание XML-файла на этапе компиляции

package { import flash. display.*;

import flash. events.*; import flash. utils. ByteArray:

public class EmbedXML extends Sprite { [Embed(source="embeds/data. xml", mimeType="application/octet-stream")] private var BinaryData:Class;

public function EmbedXML ( ) { // Создаем новый экземпляр встроенных данных var byteArray:ByteArray = new BinaryData( );

// Преобразуем экземпляр данных в XML-файл

var data:XML = new XML(byteArray. readUTFBytes(byteArray. length));

// Отображаем исходный код для встроенного XML-файла trace(data. toXMLString( ));

}

}

}

Использование метода getDeffinitionf) для обращения к классу во встроенном SWF-файле

Как мы уже знаем, отдельные символы и классы из SWF-файла в формате приложения Flash Player 9 (или более поздних версий) не могут быть встроены с помощью тега метаданных [Embed]. Вместо этого, чтобы обратиться к классу или классу символа во встроенном SWF-файле, мы можем создать ссылку на SWC-файл, содержащий желаемый класс или класс символа, либо использовать метод экземпляра getDefinition ( ) класса ApplicationDomain для обращения к желаемому классу или классу символа на этапе выполнения.



Полезные ссылки
Случайные записи
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.45
  • 27.03.2019">Ставки цифры держит ставки итоги в перспективе
  • 24.03.2013">Чартерные рейсы на Мальдивы
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 071
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.8
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 021
  • 18.07.2010">Лучшие модули для сайта
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.88
  • 14.08.2011">Система видеонаблюдения – выбери лучшее
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.136
  • 22.12.2011">Samsung производит процессоры A5 для Apple iPhone 4S и iPad 2
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.139
  • 10.04.2012">Twitter подала иск против разработчиков спам-приложений
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.82
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 108
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...