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。