我在AS3中遇到了奇怪的事件处理问题。
我有两个类:
public class Configurator extends Sprite {
public function Configurator () {
this.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, this._test);
var fp = new FramedPhoto();
}
protected function _test(event:Event) {
trace('_test()');
}
}第二个是:
public class FramedPhoto extends Sprite {
public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';
public function FramedPhoto () {
trace('FramedPhoto()');
this.dispatchEvent(new Event(FramedPhoto.FRAMED_PHOTO_LOADED, true, false));
}
}问题是_test()没有被触发。你知道这里有什么地方会做错吗?
包含源文件的测试包可从http://blackbox.home.pl/test.zip获得
发布于 2010-12-06 17:28:23
事件是以分层方式分派的,所以在任何地方侦听事件都不会起到作用。您需要做的是让您的配置器侦听调度事件的对象或显示列表中它上面的对象。如果您希望捕获所有事件,则需要侦听所有事件中最顶层的对象,即stage。
发布于 2010-12-06 19:38:58
grapefrukt一针见血,但更确切地说,它被称为事件流。简单地说,当从显示列表中的显示对象调用dispatchEvent()时,有3个阶段,即捕获阶段、目标阶段和气泡阶段。在捕获阶段,flash播放器将显示列表从舞台向下移动到调用dispatchEvent().Then的显示对象。在目标阶段,目标显示对象将调度事件。然后在气泡阶段,事件气泡上升到舞台。
在您的示例中,如果希望配置器显示对象听到从FramedPhoto显示对象调度的事件,则必须将FramedPhoto添加到其显示列表中。
我擅自向您的项目添加了一个document类,因为您无论如何都应该避免使用时间线。
package
{
import com.Configurator;
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main():void
{
init();
}// end function
private function init():void
{
var configurator:Configurator = new Configurator();
addChild(configurator);
}// end function
}// end class
}// end package我导入了Configurator类(将包从abc重命名为com),声明、实例化并将其添加到显示列表中。
package com
{
import com.FramedPhoto;
import flash.display.Sprite;
import flash.events.Event;
public class Configurator extends Sprite
{
public function Configurator():void
{
var framedPhoto:FramedPhoto = new FramedPhoto();
addChild(framedPhoto);
framedPhoto.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, framedPhotoLoadedHandler);
}// end function
public function framedPhotoLoadedHandler(e:Event):void
{
trace("framePhotoLoadedHandler()");
}// end function
}// end function
}// end function接下来,在您的Configurator类中,我导入了FramedPhoto类,声明并实例化了它。然后,我向其添加了一个事件侦听器,该侦听器侦听从framePhoto显示对象调度的事件并调用framedPhotoLoadedHandler()。
package com
{
import flash.display.Sprite;
import flash.events.Event;
public class FramedPhoto extends Sprite
{
public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';
public function FramedPhoto():void
{
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}// end function
private function addedToStageHandler(e:Event):void
{
dispatchEvent(new Event(FRAMED_PHOTO_LOADED, true));
}// end function
}// end function
}// end function最后,在FramePhoto类中,我向其添加了一个事件侦听器,用于侦听何时将FramePhoto显示对象添加到舞台中。当它被添加到舞台上时,它将调用addedToStageHandler(),该方法将分派事件,并将在父配置器显示对象中捕获。
我希望这能有所帮助:)
https://stackoverflow.com/questions/4364839
复制相似问题