·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3应用Event.ADDED_TO_STAGE的一些经验

时间:2012-11-01 23:55C2.sun
今天在文档类中初始化一个自定义类是,遇上了上面的错误,仔细考虑才发现可能在自定义类中定位一个区位交通图,获取stage.stageWidth和stage.stageHeight的时候引发了该错误

  一:使用方法:

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

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

  1. import flash.events.Event; 
  2. package cn.kwoky.library{ 
  3. public class Emap extends Sprite { 
  4. public function Emap ():void 
  5. this.addEventListener (Event.ADDED_TO_STAGE,init); 
  6. //极酷播放器提示:侦听类是否被添加到了舞台 
  7. private function init (e:Event=null):void 
  8. removeEventListener (Event.ADDED_TO_STAGE,init); 
  9. trace(stage.stageWidth,stage.stageHeight); 

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

 

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

  1. addEventListener(Event.ADDED_TO_STAGE, StageReady); 
  2. public function StageReady(e:Event):void{ 
  3. trace("stage ready"); 
  4. init(); 
  5. stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownListener); 
  6. button.addEventListener(MouseEvent.CLICK, clickHandler); 

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

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

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

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

  1. public function ClearUp():void{ 
  2. stage.removeEventListener(KeyboardEvent.KEY_DOWN,KeyDownListener); 
  3. button.removeEventListener(MouseEvent.CLICK, clickHandler); 

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

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

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器