flex - otro - abrir archivos swf
¿Cómo se genera un evento desde un archivo SWF en un SWFLoader a una aplicación principal de Flex? (5)
¿Cómo puedo generar un evento desde un archivo SWF cargado en una aplicación Flex (usando SWFLoader)?
Quiero ser capaz de detectar
a) when a button is pressed
b) when the animation ends
Como un complemento de la respuesta de Christophe Herreman, y en caso de que se lo pregunte, aquí hay una manera de hacer sus propios eventos ...
package yourpackage.events
{
import flash.events.Event;
[Event(name="EV_Notify", type="yourpackage.events.EV_Notify")]
public class EV_Notify extends Event
{
public function EV_Notify(bubbles:Boolean=true, cancelable:Boolean=false)
{
super("EV_Notify", bubbles, cancelable);
}
}
}
Me he tomado la libertad de establecer el valor predeterminado de las bubbles
en true y pasar el tipo de evento personalizado al superconstructor de forma predeterminada, por lo que puede decir simplemente ...
dispatchEvent(new EV_Notify());
En su caso particular, dudo que haya momentos en los que no desee que su evento burbujee.
El prefijo EV_
en el nombre es mi propia convención para eventos, así que puedo encontrarlos fácilmente en las ventanas emergentes para completar el código, obviamente, elegirás tu propio nombre.
En los dos casos que cites, puedes tener dos eventos y escucharlos a los dos, o agregar una propiedad al evento que diga lo que acaba de suceder, que es el enfoque que toman los controles como Alert
...
package yourpackage.events
{
import flash.events.Event;
[Event(name="EV_Notify", type="yourpackage.events.EV_Notify")]
public class EV_Notify extends Event
{
public static var BUTTON_PRESSED:int = 1;
public static var ANIMATION_ENDED:int = 2;
public var whatHappened:int;
public function EV_Notify(whatHappened:int, bubbles:Boolean=true, cancelable:Boolean=false)
{
this.whatHappened = whatHappened;
super("EV_Notify", bubbles, cancelable);
}
}
}
entonces lo llamas de la siguiente manera ...
dispatchEvent(new EV_Notify(EV_NOTIFY.ANIMATION_ENDED));
a continuación, puede inspeccionar el campo whatHappened en su controlador de eventos.
private function handleNotify(ev:EV_Notify):void
{
if (ev.whatHappened == EV_Notify.ANIMATION_ENDED)
{
// do something
}
else if (ev.whatHappened == EV_Notify.BUTTON_PRESSED)
{
// do something else
}
etc...
}
HTH
Creo que es porque crearía dos clases de eventos personalizados separados en Flash y el otro en Flex. Es posible que Flex no comprenda el envío de un EV_NOTIFY.ANIMATION_ENDED de Flash, ya que tiene su propia versión de EV_NOTIFY.ANIMATION_ENDED.
Necesitarás hacer 2 cosas:
- Despachar un evento desde el swf cargado. Asegúrese de que el evento burbujee si lo envió desde vistas anidadas. El burbujeo se puede establecer a través de las burbujas propiedad del evento.
Escucha el evento desde tu aplicación principal. Creo que debería poder hacer eso en la propiedad de contenido de la instancia de SWFLoader.
mySWFLoader.content.addEventListener("myEvent", myEventHandler);
No pude hacer que este último enfoque funcionara (con Flash CS4 y Flex 3). Puse la llamada dispatchEvent en uno de los últimos cuadros de mi animación Flash, pero no pude recogerla en Flex.
Recurrí a una variable de contador e incrementé hasta que alcancé el último número de cuadro conocido utilizando el evento ENTER_FRAME, que puedo recoger usando casi el mismo código.
Si puedo recoger esto, ¿por qué no puedo elegir un evento personalizado?
Tomé un enfoque más lento para plantear el evento dentro de flash
Flexionar:
<mx:SWFLoader source="homeanimations/tired.swf" id="swfTired" complete="swfTiredLoaded(event)" />
private function swfTiredLoaded(event:Event): void {
mySWFLoader.content.addEventListener("continueClicked", continueClickedHandler);
}
Destello:
dispatchEvent(new Event("continueClicked", true, true));