2010-12-06 85 views
1

我在AS3中处理事件有一个奇怪的问题。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

回答

1

事件的调度是一个分层的方式,所以只是听一个事件的地方不会做的伎俩。 你需要做的是让你的配置程序听取发送该事件的对象或一个以上的它在显示列表中。如果你想捕捉所有的事件,你需要倾听他们最上面的对象,stage

+0

感谢grapefrukt,我现在有了一点启发。 – 2010-12-06 10:01:47

1

grapefrukt碰到了头,但更具体的它被称为事件流。简单地说,当从显示列表中的显示对象调用dispatchEvent()时,有三个阶段,它们是捕获阶段,目标阶段和冒泡阶段。在捕捉阶段,Flash播放器从舞台到显示对象的显示列表中,调用dispatchEvent()。然后,在目标阶段,目标显示对象调度该事件。然后在气泡阶段,事件起泡到舞台。

对于您的情况,如果您希望Configurator显示对象听到从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 

我进口的配置类(改名从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 

接下来在您的配置器类中,我导入了您的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 I类添加一个事件监听到它,当FramePhoto显示对象被添加到阶段进行侦听。当它被添加到舞台时,它将调用addedToStageHandler(),它将调度该事件并将被捕获到父配置器显示对象中。

我希望这有助于:)