[AS3]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
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例