as3事件处理

时间:2010-12-06 09:20:44

标签: actionscript-3 events event-handling

我在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

获得

2 个答案:

答案 0 :(得分:1)

事件以分层方式分派,因此只需在任何地方都可以监听事件。 您需要做的是让配置程序在显示列表中监听调度事件的对象或上面的。如果你想要捕捉所有事件,你需要听取它们的最顶层对象,stage

答案 1 :(得分:1)

grapefrukt撞到了头上的钉子,但更具体的是它称之为事件流。简单地说,当从显示列表中的显示对象调用dispatchEvent()时,有三个阶段,这些是捕获阶段,目标阶段和泡沫阶段。在捕获阶段,flash播放器从显示列表向下移动到调用dispatchEvent()的显示对象。然后在目标阶段,目标显示对象调度该事件。然后在气泡阶段,事件起泡到舞台。

在您的情况下,如果您希望配置器显示对象听到从FramedPhoto显示对象调度的事件,则必须将FramedPhoto添加到其显示列表中。

我冒昧地为你的项目添加一个文档类,因为你应该避免使用时间轴。

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(),它将调度该事件并将被捕获到父Configurator显示对象中。

我希望这有助于:)