Flash as3 Event.ADDED_TO_STAGE的使用

一:使用方法:

1172: 找不到定义 flash.events.Event:ADDED_TO_STAGE。

今天在文档类中初始化一个自定义类是,遇上了上面的错误,仔细考虑才发现可能在自定义类中定位一个区位交通图,获取stage.stageWidth和stage.stageHeight的时候引发了该错误,我分析可能和舞台加载顺序有关,因为只有自定义类被添加到舞台上,才能获得相关的stage的信息。找到了原因,就有解决的办法,就是用DisplayObject类的Event.ADDED_TO_STAGE。具体如下:

import flash.events.Event;
package cn.kwoky.library{
public class Emap extends Sprite {
public function Emap ():void
   {        
     this.addEventListener (Event.ADDED_TO_STAGE,init);//侦听类是否被添加到了舞台
    }
   }
   private function init (e:Event=null):void
   {  
    removeEventListener (Event.ADDED_TO_STAGE,init);
    trace(stage.stageWidth,stage.stageHeight);
   }

在这里,关键是通过ADDED_TO_STAGE事件,来侦听该类是否被添加到了舞台显示列表,如果已经被添加,就会触发該事件,然后就可以使用stage相关的信息了。

 

二:关于ADDED_TO_STAGE执行再次的解决

addEventListener(Event.ADDED_TO_STAGE, StageReady);

public function StageReady(e:Event):void{
	trace("stage ready");
        init();
        stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownListener);
	button.addEventListener(MouseEvent.CLICK, clickHandler);
}

我们通常会在构造函数中添加这个监听器, 然后再执行初始化函数。因为如果舞台还未初始化完成,就无法使用stage属性,比如添加键盘监听就无法添加。

但是当我们使用这个监听器的时候一定要小心。因为他有十分隐蔽的问题。stageReady函数中的代码可能被两次,三次执行。等多次数还未遇到。原因这篇文章再不做阐述。

如上面的代码,键盘监听被加载了多次,按钮的监听也被加载了多次。如果新建的实例,也会被多次创建。之所以说这个bug隐蔽是因为,这种问题不会报错。

通常AS3的监听器是需要我们手动去掉的,如果不去掉将会导致效率降低,所以我们会写:

public function ClearUp():void{

        stage.removeEventListener(KeyboardEvent.KEY_DOWN,KeyDownListener);
	button.removeEventListener(MouseEvent.CLICK, clickHandler);
}

如果stageReady中的监听器被加载了两次,那么在ClearUp函数中,你写两遍removeEventListener也不会报错。因为的确有两监听器。
但是对于可视化的原件等等多的被多次创建的元素呢?会产生更多的问题
所以要做的是不要让stageReady运行多次。
所以应该在stageReady中的第一句话写上:

removeEventListener(Event.ADDED_TO_STAGE, StageReady);

这样就可以防止多次运行了。经过多次试验,目前还没有出现过新的bug

你可能感兴趣的:(Flash)