Flex4.6 程序的主類實際上爲SystemManager的子類。SystemManager會創建Preloader對象,然後調用PreLoader對象的initialize方法,該方法有如下簽名
public function initialize(showDisplay:Boolean, displayClassName:Class, backgroundColor:uint, backgroundAlpha:Number, backgroundImage:Object, backgroundSize:String, displayWidth:Number, displayHeight:Number, libs:Array = null, sizes:Array = null, rslList:Array = null, resourceModuleURLs:Array = null, applicationDomain:ApplicationDomain = null):void
showDisplay會傳入 Application.usePreloader屬性,displayClassName會傳入Application.preloader屬性(從類名字符串得到的Class對象),backgroundXXX屬性對應於Application的backgroundXXX屬性,displayWidth和displayHeight會傳入舞臺大小。
Preloader.initialize方法片段如下
if (showDisplay) { displayClass = new displayClassName(); // Listen for when the displayClass no longer needs to be on the stage displayClass.addEventListener(Event.COMPLETE, displayClassCompleteHandler); // Add the display class as a child of the Preloader addChild(DisplayObject(displayClass)); displayClass.backgroundColor = backgroundColor; displayClass.backgroundAlpha = backgroundAlpha; displayClass.backgroundImage = backgroundImage; displayClass.backgroundSize = backgroundSize; displayClass.stageWidth = displayWidth; displayClass.stageHeight = displayHeight; displayClass.initialize(); displayClass.preloader = this; ……………… }
如果Application.usePreloader==true,則會創建下載進度條,一個實現了IPreloaderDisplay接口的實例(且爲DisplayObject子類實例,是一個顯示對象),然後設置backgroundXXX,stageWidth和stageHeight,調用進度條實例的initialize方法,設置preloader屬性,把Preloader本身傳入進度條實例。
一般在設置preloader屬性時,會偵聽Preloader實例的7個事件,如SparkDownloadProgressBar所示
public function set preloader(value:Sprite):void { _preloader = value; value.addEventListener(ProgressEvent.PROGRESS, progressHandler); value.addEventListener(Event.COMPLETE, completeHandler); value.addEventListener(RSLEvent.RSL_PROGRESS, rslProgressHandler); value.addEventListener(RSLEvent.RSL_COMPLETE, rslCompleteHandler); value.addEventListener(RSLEvent.RSL_ERROR, rslErrorHandler); value.addEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler); value.addEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler); }
ProgressEvent.PROGRESS事件反應程序的下載進度,Event.COMPLETE事件在程序下載完成時調度,RSLEvent是加載運行時共享庫的相關事件。FlexEvent.INIT_PROGRESS在程序下載完成開始初始化時調度 在Preloader調度FlexEvent.INIT_COMPLETE事件時,代表着Application已經下載完成並已經初始化完畢,這時需要下載進度條IPreloaderDisplay實例調度一個Event.COMPLETE事件來通知Preloader刪除進度條,顯示Application
所以在自定義Flex 4.6程序下載進度條時,需要先定義一個實現了IPreloaderDisplay接口的Sprite類。處理preloader的7個事件,在ProgressEvent.PROGRESS事件調度是改變進度條的外表顯示,在FlexEvent.INIT_COMPLETE調度之後,可以做一些額外處理,如播放動畫或聲音,最後不要忘記,IPreloaderDisplay進度條對象必須調度一個Event.COMPLETE事件,通知Preloader移除進度條,顯示Application。