ouvinte de evento flash para eventos globais
https://stackoverflow.com/questions/928166
Pergunta
Eu tenho uma série de clipes de filme, realizado dentro de alguns MovieClips, que despachar um evento de movimento personalizado que eu gostaria que o estágio para ouvir e interagir com. Existe uma maneira de adicionar ao palco (ou qualquer objeto) um ouvinte de eventos para qualquer evento de um tipo, independentemente de onde ele foi enviado a partir de?
Por exemplo, eu poderia adicionar ao palco um ouvinte de evento para ouvir qualquer EVENT.COMPLETE
que foi enviado a partir de uma criança, ou qualquer de seus filhos, ou qualquer um dos filhos, é para crianças?
Solução
O que você está procurando é subida do evento. Defina a terceira propriedade de um novo evento para true para permitir borbulhando, e vai refletir na lista de exibição, a partir do objeto despachar o evento para o palco. Veja a documentação oficial para mais informações.
Tyler.
Editado: Change "a partir do estágio" para "objeto despachar o evento"
Outras dicas
Bem, isso é algo que eu nunca vou entender ... Por que as pessoas sempre usam borbulhando eventos para eventos de captura no palco?
Se você olhar para o doc, o evento é propagado do palco para o objeto de destino (fase de captura) e, em seguida, bolhas se você habilitar borbulhando.
Assim ... apenas o uso de captura:
Main.as
package {
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main()
{
var c:Circle = new Circle();
var r:Rect = new Rect();
c.addChild(r);
addChild(c);
addEventListener(CustomEvent.CUSTOM, customEventHandler, true);//don't forget third parameter to use capture
}
private function customEventHandler(e:CustomEvent):void
{
trace(e.eventPhase == EventPhase.CAPTURING_PHASE);//shows true
}
}
}
Circle.as
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class Circle extends Sprite
{
public function Circle()
{
super();
init();
}
private function init():void
{
with(graphics)
{
beginFill(0xFF0000);
drawCircle(25, 25, 50);
endFill()
}
}
}
}
Rect.as
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Rect extends Sprite
{
public function Rect()
{
super();
init();
}
private function init():void
{
with(graphics)
{
beginFill(0x000000);
drawRect(0, 0, 25, 25);
endFill();
}
addEventListener(MouseEvent.CLICK, mouseClickHandler);
}
private function mouseClickHandler(e:MouseEvent):void
{
dispatchEvent(new CustomEvent(CustomEvent.CUSTOM));
}
}
}
CustomEvent.as
package
{
import flash.events.Event;
public class CustomEvent extends Event
{
public static const CUSTOM:String = "custom";
public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}