Скрещивание ActionScript 2 SWF файлов с Flex 2 приложениями

Автор: Питер Энт (оригинал статьи)

Перевод: Андрей Горбатов (блог)

Введение

Одним из преимуществ Flash технологии является возможность написания с ее помощью разнообразных приложений: хочешь крутую анимацию – используй Flash, хочешь бизнес-приложение – тебе во Flex. Лучше конечно использовать это в связке. Так как ActionScript является языком программирования и во Flex и во Flash, то Flex приложение может контролировать Flash анимацию и наоборот.
Сделать это во Flash 8, Flash MX 2004 или Flash MX и Flex 1.5 было относительно просто. Я покажу как это происходит с Flex 2 и Flash Player 9.
Как известно, Flex 2 SWF необходим Flash Player 9, так как Flex 2 использует ActionScript 3. ActionScript 3 с его строгой типизацией данных и объектно-ориентированной структурой обеспечивает более высокую производительность для Flash Player.
Как и все версии Flash Player, Flash Player 9 обратно совместим, то есть в нем будут проигрываться все SWF файлы, построенные для более ранних версий Flash Player. Но теперь это происходит иначе. Когда Flash Player 9 загружает SWF, которая использует ActionScript 2 (или ниже), он создает виртуальную машину для запуска ActionScript 2 SWF. Мы называем ее AVM. Когда Flash Player 9 загрузил Flex 2 SWF, который затем загружает AS2 SWF, то последний SWF загружается в собственную AVM. Получается, что два SWF файла запущены в различных областях Flash Player. Различных и изолированных областях.
Это означает, что Flex 2 приложение не может просто ссылаться нa функции, переменные и таймлайн AS2 SWF, так как и AS2 SWF не может просто что-то сделать с Flex 2 приложением.
Решение состоит в использовании LocalConnection – системы сообщений между Flash Player. Если вы не использовали до этого LocalConnection, потратьте немного времени и ознакомьтесь.
Посмотреть в действии можно здесь: Flex 2 и Flash Demo (необходим установленный Flash Player 9).

Загрузить исходники можно здесь


Вкратце, LocalConnection позволяет Flash Player посылать сообщения другим Flash Player, запущенным в одном десктопе. Flash Player могут быть на одной HTML странице, в разных фреймах, в разных браузерах. Например, представим, что мы создали HTML страницу с тремя фреймами: верхний для баннера, левый для меню, центральных для контента. И захотели, что бы баннер и меню были на Flash. Также вы хотите, чтобы при выборе элементов меню изменялось содержимое баннера. Вы можете использовать LocalConnection для отправки сообщений из меню в баннер.
LocalConnection – это только одностороннее движение. Один SWF слушает сообщения, посылаемые другим. Если вы хотите создать двухстороннюю связь, оба SWF файла должны создавать LocalConnection и иметь уникальные имена.
LocalConnection также работает между виртуальными машинами Flash Player 9.

Flash

Во Flash приложении создайте объект LocalConnection и добавьте к нему функции, которые должны быть вызваны из Flex приложения. Это и есть сообщения, о которых говорилось выше.

var fromFlex_lc:LocalConnection = new LocalConnection();
fromFlex_lc.stopMe = function() { stop(); }
fromFlex_lc.playMe = function() { play(); }
fromFlex_lc.connection( "lc_from_flex" );

Функции stopMe и playMe очень простые, они просто останавливают и запускают проигрывание ролика. Но наворотить можно все что угодно. Flex будет вызывать их при нажатие на кнопку

Flex

Во Flex приложении создаем объект LocalConnection, который будем использовать для вызова функций stopMe и playMe.

import flash.net.LocalConnection;
var toFlash_lc:LocalConnection = new LocalConnection();
<mx:Button label="Stop" click="toFlash_lc.send('lc_from_flex', 'stopMe')" />
<mx:Button label="Play" click="toFlash_lc.send('lc_from_flex', 'playMe')" /> 

Кнопки вызывают метод LocalConnection.send(), указывая на соединение, которое слушает Flash SWF файл. Вторым аргументом метода send() является имя вызываемой функции. Если у функции есть аргументы, они перечисляются после имени функции.

Из Flash во Flex

Как вы уже догадались, отправка сообщений из Flash SWF во Flex SWF просто обратный процесс. Разница лишь в месте вызова метода LocalConnection.send().
Во Flex приложении создадим объект, содержащий функции, которые должны быть вызваны из LocalConnection. Например:

<mx:Application xmlns:mx="..." initialize="initApp()" >
   <mx:Script>
   <![CDATA[
        import flash.net.LocalConnection;
        public function showDetails() : void {
               // что-то вызвать 
        }
        private var fromFlash_mc:LocalConnection;
        private function initApp() : void {
             fromFlash_lc = new LocalConnection();
             fromFlash_lc.client = this;
             fromFlash_lc.connect("lc_from_flash");
        }
   ]]>
  </mx:Script>
...
</mx:Application> 

Теперь Flash SWF может вызывать любой public метод, определенный в объекте с именем "client". В данном случае можно вызвать метод showDetails().