在写FLEX应用,从外部加载配置文件是一个很常用的方法(一般是加载XML,因为这是“人类可读性”最好的了。。)
如何让SWF在配置文件加载完成之前开始工作呢?
有两种方法,
一种是直接控制所有子元件的表现,在配置文件加载完毕之前不做任务动作。
但这意味着每加一个子元件你就要加一定的额外的脚本来侦听配置加载是否完成。
另一种是在FLEX主MXML的CreationComplete事件前完成一些配置工作,这需要我们自定义loading类 (preloader),下面是我的一个课程设计中的例子,preloader参考了flex cookbook的例子:
OBSPreLoader.as (OBS= Online Book Store...)
package iptton.utils{
import com.adobe.cairngorm.control.CairngormEventDispatcher;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import iptton.events.*;
import mx.events.FlexEvent;
import mx.preloaders.IPreloaderDisplay;
import mx.preloaders.Preloader;
public class OBSPreloader extends Sprite implements IPreloaderDisplay
{
private var _bgAlpha:Number;
private var _bgColor:uint;
private var _bgImage:Object;
private var _bgSize:String;
private var _stageHeight:Number;
private var _stageWidth:Number;
private var _preloader:Preloader;
private var _downloadBar:Shape;
private var _initBar:Shape;
private var _initField:TextField;
public function OBSPreloader()
{
_initField = new TextField();
_initField.defaultTextFormat =
new TextFormat( 'Arial', 12, 0xFFFFFF, true );
_downloadBar = new Shape();
addChild( _downloadBar );
_initBar = new Shape();
addChild( _initBar );
}
// initialize any properties on display.
public function initialize():void
{
_downloadBar.x = ( _stageWidth / 2 ) - 20;
_initBar.x = _downloadBar.x - 2;
_downloadBar.y = ( _stageHeight / 2 ) - 50;
_initBar.y = _downloadBar.y;
_initField.x = _initBar.x + 2;
_initField.y = _initBar.y + 100 - 15;
_initField.width=400;
addChild( _initField );
}
// define event handlers of the Preloader instance
public function set preloader( obj:Sprite ):void
{
_preloader = obj as Preloader;
_preloader.addEventListener( ProgressEvent.PROGRESS,
downloadProgressHandler );
_preloader.addEventListener( FlexEvent.INIT_PROGRESS,
initProgressHandler );
_preloader.addEventListener( FlexEvent.INIT_COMPLETE,
initCompleteHandler );
}
public function get backgroundAlpha():Number
{
return _bgAlpha;
}
public function set backgroundAlpha(value:Number):void
{
_bgAlpha = value;
}
public function get backgroundColor():uint
{
return _bgColor;
}
public function set backgroundColor(value:uint):void
{
_bgColor = value;
}
public function get backgroundImage():Object
{
return _bgImage;
}
public function set backgroundImage(value:Object):void
{
_bgImage = value;
}
public function get backgroundSize():String
{
return _bgSize;
}
public function set backgroundSize(value:String):void
{
_bgSize = value;
}
public function get stageHeight():Number
{
return _stageHeight;
}
public function set stageHeight(value:Number):void
{
_stageHeight = value;
}
public function get stageWidth():Number
{
return _stageWidth;
}
public function set stageWidth(value:Number):void
{
_stageWidth = value;
}
//=========temp==
public function setLabel(s:String):void{
_initField.text=s;
}
// handle SWF file download progress.
private function downloadProgressHandler( evt:ProgressEvent ):void
{
var perc:Number = ( ( evt.bytesLoaded / evt.bytesTotal ) * 100 );
var top:Number = 100 - perc;
_downloadBar.graphics.clear();
_downloadBar.graphics.beginFill( 0xFF0000, 1 );
_downloadBar.graphics.moveTo( 0, 0 );
_downloadBar.graphics.lineTo( 10, 0 );
_downloadBar.graphics.lineTo( 10, perc * 0.9 );
_downloadBar.graphics.lineTo( 0, perc * 0.9 );
_downloadBar.graphics.lineTo( 0, 0 );
_downloadBar.graphics.endFill();
_initBar.graphics.clear();
_initBar.graphics.beginFill( 0xFFFFFF, 1 );
_initBar.graphics.moveTo( 0, 100 );
_initBar.graphics.lineTo( 2, 100 );
_initBar.graphics.lineTo( 2, top );
_initBar.graphics.lineTo( 0, top );
_initBar.graphics.lineTo( 0, 100 );
_initBar.graphics.endFill();
setLabel(perc+" %loaded ("+evt.bytesLoaded + " / " + evt.bytesTotal +")");
}
// handle application initialization progress.
private function initProgressHandler( evt:FlexEvent ):void
{
_initField.text = "正在初始化...";
}
// handle completion of download and initialization.
private function initCompleteHandler( evt:FlexEvent ):void
{
new SystemConfig(this);
}
public function notifyOfConfigLoaded(o:Object):void{
/*
var timer:Timer = new Timer( 3000, 1 );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, notifyOfComplete );
timer.start();
*/
dispatchEvent( new Event( Event.COMPLETE ) );
var ced:CairngormEventDispatcher=CairngormEventDispatcher.getInstance();
ced.dispatchEvent( new SystemEvent(SystemEvent.INITAL,o));
}
}
}
package iptton.utils{ import flash.display.*; import flash.events.*; import flash.net.*; import flash.utils.*; /** * 获取系统配置内容 * * ============================= * 配置文件格式: ** * * ... * * ============================= * */ public class SystemConfig{ private var _parent:OBSPreloader; /** * 返回给callback的参数为一个对象 * * 内容有: * amfphpGatewayUrl:String **/ public function SystemConfig(parent:OBSPreloader,configUrl:String="swfConfig.xml"){ _parent=parent; var loader:URLLoader = new URLLoader(); var req:URLRequest = new URLRequest(configUrl); loader.load(req); loader.addEventListener(Event.COMPLETE,onResult); loader.addEventListener(ProgressEvent.PROGRESS,progressing); _parent.setLabel("正在加载配置文件..."); } protected function progressing(event:ProgressEvent):void{ _parent.setLabel(100*event.bytesLoaded/event.bytesTotal+" %loaded ("+event.bytesLoaded + " / " + event.bytesTotal +")"); } protected function onResult(event:Event):void{ _parent.setLabel("配置文件加载完毕..."); var xmlobj:XML = new XML(event.target.data); var ret:Object=new Object(); var tmp:XMLList=xmlobj.property; for each(var node:XML in tmp){ _parent.setLabel("正在设置: "+node.@name+" : "+node.@value+"..."); ret[node.@name]=node.@value; } _parent.notifyOfConfigLoaded(ret); } } }