完美解决as3在ie中初始化时stageWidth和stageHeight为0的问题
先看下面的一段脚本,这是比较经典的初始化脚本:
package { import flash.display.Sprite; import flash.events.Event; public class Test extends Sprite { public function Test() { if(stage) { init(null); } else { addEventListener(Event.ADDED_TO_STAGE, init); } } private function init(event:Event):void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; //应用初始化时的脚本放在该方法下 trace(stage.stageWidth, stage.stageHeight); } } }
该脚本在火狐下可以正常取得flash舞台的尺寸,可是在ie中却只会都返回0,不过我们在过几秒后再访问这个尺寸是就会正常,这说明在ie中,窗口第一次改变大小时是在我们的init方法之后的,该怎么解决呢,我们可以侦听Event.RESIZE事件,在舞台尺寸都不为0后再调用init方法即可,实现有点繁琐:
package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; public class StageTest extends Sprite { public function StageTest() { if(stage) { resizeListaner(null); } else { addEventListener(Event.ADDED_TO_STAGE, resizeListaner); } } private function resizeListaner(event:Event):void { if(event != null) { removeEventListener(Event.ADDED_TO_STAGE, resizeListaner); } //限制 flash 的尺寸不进行拉伸, 否则不会触发 resize 事件 stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; if(stage.stageWidth == 0 || stage.stageHeight == 0) { stage.addEventListener(Event.RESIZE, resizeHandler); } else { init(); } } private function resizeHandler(event:Event):void { if(stage.stageWidth > 0 && stage.stageHeight > 0) { stage.removeEventListener(Event.RESIZE, resizeHandler); init(); } } private function init():void { //应用初始化时的脚本放在该方法下 trace(stage.stageWidth, stage.stageHeight); } } }