加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

浅析Flex启动过程

发布时间:2020-12-15 01:07:38 所属栏目:百科 来源:网络整理
导读:? 浅析Flex启动过程 每个 SWF 文件都有一个关联的 ActionScript 类,称为"SWF 文件的主类"。当 Flash Player 打开 SWF 文件时,Flash Player 将调用主类的构造函数,并创建主类的实例,将其添加为 Stage 对象的子级。(注:在主类的构造函数里面 访问 stage
?

浅析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,? 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读