Управление гибким приложением из встроенного элемента управления Flash

У меня есть гибкое приложение, и я встроил в него файл flash (SWF), используя <mx:SWFLoader>. На флеш-файле есть кнопка "Выход". Я хочу иметь возможность обрабатывать событие нажатия кнопки в гибком приложении.

Поэтому, когда нажимается эта кнопка во флэш-файле, я хочу выполнить действие в родительском гибком приложении. Как я могу это сделать? Спасибо!


person Aishwar    schedule 21.03.2010    source источник


Ответы (2)


Сделать это можно, если в событии вспыхивают «пузыри». Когда вы отправляете событие из Flash, сделайте следующее:

dispatchEvent(new Event("myEventName", true)); // that 'true' for bubbles, in the constructor

Тогда вы сможете без проблем записать его во Flex:

addEventListener("myEventName", handler);

... до тех пор, пока addEventListener вызывается в компоненте на уровне или выше SWFLoader.

Если вы не можете изменить Flash SWF или это полный черный ящик, вы можете просто зарегистрировать MouseEvent.CLICK обработчик в useCapture = true и проверить, правильная ли это кнопка:

swfLoader.addEventListener(MouseEvent.CLICK, swfLoader_clickHandler, true, 0, true);

protected function swfLoader_clickHandler(event:MouseEvent):void
{
    if (event.target.name == "some_way_to_identify_the_button")
        // do X
}

Надеюсь, это поможет, Лэнс

person Lance Pollard    schedule 21.03.2010
comment
@viatroops: эй, это не сработало. У меня есть доступ к fla. Fla выполняет эту строку кода dispatchEvent(new Event("myEvent"), true));, и у меня есть swfloader_completeHandler обработчик событий в SWFLoader во Flex. В этом методе у меня swfloader.addEventListener("myEvent", nextStepFunction);. Но теперь, когда я нажимаю кнопку выхода в SWF-файле (когда он встроен в приложение Flex), ничего не происходит. Я сделал что-то не так? - person Aishwar; 21.03.2010
comment
попробуйте, чтобы dispatchEvent выглядел так: dispatchEvent(new Event("myEvent", true)); вместо этого dispatchEvent(new Event("myEvent"), true)), и попробуйте установить для useCapture на слушателе значение true, например: addEventListener("myEventName", handler, true, 0, true);. Дай мне знать, если это работает. - person Lance Pollard; 21.03.2010
comment
@viatroops. Ой, это была опечатка. Да, это то, что у меня было для dispatchEvent. Я попробовал второй addEventListener, и он тоже не сработал. - person Aishwar; 21.03.2010
comment
Думаю, я нашел проблему. Файл FLA основан на сценарии действий 2.0, который не поддерживает восходящую цепочку событий. Я уточню у другого разработчика, сможет ли он обновить проект до AS3. Если нет, есть ли другой способ? - person Aishwar; 21.03.2010
comment
Я никогда не использовал ActionScript 2. Может быть, попробуйте отправить его со сцены или из других более надежных мест, посмотрите, сработает ли это. вам может потребоваться промежуточное звено javascript, если as2 и as3 вообще не могут взаимодействовать, проверьте это: gskinner.com/blog/archives/2007/07/swfbridge_easie.html. - person Lance Pollard; 21.03.2010

Вы можете сделать это с помощью класса загрузчика в AS3 (в гибком скрипте). Даже вы можете делать это динамически. в MXML

<mx:SWFLoader id="myLoader" width="500" source="swf/kabin42.swf"
                          complete="initSwf();"/>


private function initNestedAppProps2():void {
    var loadedMc:MovieClip = MovieClip(myLoader.content);
    loadedMc= MovieClip(myLoader2.content);
    //access the button with instance name myButton:
    loadedMc.myButton.addEventListener(MouseEvent.CLICK, onBtnClick);   
}

private function onBtnClick(event:MouseEvent):void{
    Alert.show("button clicked 2");
}

При нажатии myButton будет вызван метод обработчика события onBtnClick. Надеюсь, это решит вашу проблему.

person pyroCyber2    schedule 01.04.2011