淺析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 屬性就是位圖對象本身。 對於第一個加載的 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

發佈了46 篇原創文章 · 獲贊 3 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章