浅析Flex启动过程
?
浅析Flex启动过程 每个 SWF 文件都有一个关联的 ActionScript 类,称为"SWF 文件的主类"。当 Flash Player 打开 SWF 文件时,Flash Player 将调用主类的构造函数,并创建主类的实例,将其添加为 Stage 对象的子级。(注:在主类的构造函数里面 访问 stage 不为空,非主类在构造函数里面 访问 stage 时stage == null) 假设我们的Flex工程的主文件为Main.mxml,当Flex3编译时会生成一个 _Main_mx_managers_SystemManager extends mx.managers.SystemManager 的类(提示:mx.managers.SystemManager extends MovieClip) ,该类即为主类。当使用 flash player播放main.swf文件时首先载入_Main_mx_managers_SystemManager类,执行该类的构造函数。 在构造函数中 首先会设置 stage.scaleMode = StageScaleMode.NO_SCALE;? stage.align = StageAlign.TOP_LEFT;? 并停在第一桢(默认情况下SystemManager 一共有两桢,如果你使用了frame编译器指令的话就会比两桢要多) stop();?? if (root && root.loaderInfo)? root.loaderInfo.addEventListener(Event.INIT,initHandler);?? (注释:对于加载的 SWF 文件中的显示对象,root 属性是此 SWF 文件所表示的显示列表树结构部分中的顶级显示对象。 对于代表已加载图像文件的位图对象,root 属性就是位图对象本身。 对于第一个加载的 SWF 文件的主类的实例,root 属性就是显示对象本身。 Stage 对象的 root 属性是 Stage 对象本身。 对于任何未添加到显示列表的显示对象,root 属性设置为 null,除非它已添加到符合以下条件的显示对象容器:不在显示列表中,但属于已加载 SWF 文件中顶级显示对象的子级。) 构造函数结束,等待initHandler的执行。 在 initHandler中作了如下事情: 1,定义 当播放头到达第二桢的时候 运行函数docFrameHandler 2,设置preloader preloader = new Preloader();? preloader.addEventListener(FlexEvent.INIT_PROGRESS,preloader_initProgressHandler);? preloader.addEventListener(FlexEvent.PRELOADER_DONE,preloader_preloaderDoneHandler);?? 并将 preloader 增加为该类的一个 child,接着获得 rsls(运行时共享库)和 resource modules 信息,并执行 preloader.initialize(? usePreloader,? preloaderDisplayClass,? preloaderBackgroundColor,? preloaderBackgroundAlpha,? preloaderBackgroundImage,? preloaderBackgroundSize,? isStageRoot ? Stage.stageWidth : loaderInfo.width,? isStageRoot ? Stage.stageHeight : loaderInfo.height,? null,? rslList,? resourceModuleURLs);? }??? usePreloader和preloaderDisplayClass是你在你的Main.mxml文件<mx:Application> 标签里设置的preloader和usePreloader的值。 Preloader 开始运行,你可以看到进度条,当所有的文件从网络上下载完成后preloader dispatchEvent(new Event(Event.COMPLETE));? dispatchEvent(new FlexEvent(FlexEvent.INIT_PROGRESS));?? preloader发布FlexEvent.INIT_PROGRESS事件后,在主类中定义的 preloader_initProgressHandler函数开始执行 private function preloader_initProgressHandler(event:Event):void? {? // Advance the next frame? preloader.removeEventListener(FlexEvent.INIT_PROGRESS,preloader_initProgressHandler);?? deferredNextFrame();? }? 执行完后,播放头前进到第二桢,如前所述,docFrameHandler 函数开始执行。 public static function init(fbs:IFlexModuleFactory):void 方法,接下来将编译的ResourceBundles增加到resourceManager,这样我们在程序中可以访问。下面开始执行 Main.mxml的构造函数 1,触发preinitialize事件 触发creationComplete事件后preloader发布FlexEvent.INIT_COMPLETE事件,进度条(DownloadProgressBar.as)接收后会发布event.COMPLETE事件,preloader侦听后会发布FlexEvent.PRELOADER_DONE事件并执行主类中定义preloader_preloaderDoneHandler函数。在preloader_preloaderDoneHandler函数里面首先会移除进度条removeChild(preloader);这样我们才能看到我们的flash内容,然后 // Add the mouseCatcher as child 0.? mouseCatcher = new FlexSprite();? mouseCatcher.name = "mouseCatcher";? // Must use addChildAt because a creationComplete handler can create a? // dialog and insert it at 0.? //noTopMostIndex++;? super.addChildAt(mouseCatcher,0);?? super.addChildAt(DisplayObject(app),1);? ? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |