浅析Flex启动过程

来源:互联网 发布:php redis抢红包源代码 编辑:程序博客网 时间:2024/05/19 08:41
 

浅析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 属性就是位图对象本身。 对于第一个加载的 SWF 文件的主类的实例,root 属性就是显示对象本身。 Stage 对象的 root 属性是 Stage 对象本身。 对于任何未添加到显示列表的显示对象,root 属性设置为 null,除非它已添加到符合以下条件的显示对象容器:不在显示列表中,但属于已加载 SWF 文件中顶级显示对象的子级。)

构造函数结束,等待initHandler的执行。

在 initHandler中作了如下事情:

1,定义 当播放头到达第二桢的时候 运行函数docFrameHandler
addFrameScript(docFrame, 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,  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 函数开始执行。
首先会执行很多Singleton.registerClass方法,然后执行有[Mixin]元标签的类的

public static function init(fbs:IFlexModuleFactory):void 方法,接下来将编译的ResourceBundles增加到resourceManager,这样我们在程序中可以访问。下面开始执行 Main.mxml的构造函数
 
document = app = topLevelWindow = IUIComponent(create()); 
然后设置 Main.mxml的宽高为舞台的宽高,并执行preloader.registerApplication(app);函数,接着
addingChild(DisplayObject(app));  // calls app.createChildren()  childAdded(DisplayObject(app));  
下面就是 大家都挺熟悉的flex初始化过程

1,触发preinitialize事件
2,执行初始化
3,触发initialize事件
4,执行创建过程
5,触发creationComplete事件

触发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);  
将Main.mxml 类的实例增加到显示列表
 

super.addChildAt(DisplayObject(app), 1); 
发布FlexEvent.APPLICATION_COMPLETE事情
[CODE_LITE]app.dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));
dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));[/CODE]
至此启动过程完美结束:)

 

 
文章来源: 我要学flash网(www.51xflash.com) 原文地址:http://www.51xflash.com/article/flex/201106/24-14371.html

原创粉丝点击