Одним из преимуществ 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 приложении создайте объект 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 приложении создаем объект 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 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().