我一直在爲自定義Flex預加載程序進行挖掘,它們似乎都依賴於相同的模板:
SWC是使用Flash CS5創建的,然後由Flash Builder使用「preloader」應用程序屬性使用。
我沒有自己的Flash CS,並且覺得Flash Builder應該能夠做到這一點。
我創建了一個圖書館項目在Flash Builder與下面光禿禿的骨頭代碼:
沒有Flash CS的Flex預加載程序
package loader
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.utils.getTimer;
import mx.events.RSLEvent;
import mx.preloaders.DownloadProgressBar;
import mx.preloaders.SparkDownloadProgressBar;
public class Preloader extends SparkDownloadProgressBar
{
[Embed(source="loaderlogo.png")] public var logoClass:Class;
private var _displayStartCount:uint = 0;
private var _initProgressCount:uint = 0;
private var _downloadComplete:Boolean = false;
private var _showingDisplay:Boolean = false;
private var _startTime:int;
// private var preloaderDisplay:PreloaderDisplay;
private var rslBaseText:String = "loading: ";
public function Preloader()
{
super();
}
/**
* Event listener for the <code>FlexEvent.INIT_COMPLETE</code> event.
* NOTE: This event can be commented out to stop preloader from completing during testing
*/
override protected function initCompleteHandler(event:Event):void
{
dispatchEvent(new Event(Event.COMPLETE));
}
/**
* Creates the subcomponents of the display.
*/
override protected function createChildren():void
{
var img:DisplayObject = new logoClass();
img.x = Math.round((stageWidth - img.width)/2);
img.y = Math.round((stageHeight - img.height)/2);
addChild(img);
var dpb:DownloadProgressBar = new DownloadProgressBar();
dpb.x = img.x + 100;
dpb.y = img.x + 100;
dpb.width = 170;
dpb.height = 20;
addChild(dpb);
}
/**
* Event listener for the <code>RSLEvent.RSL_PROGRESS</code> event.
**/
override protected function rslProgressHandler(evt:RSLEvent):void {
if (evt.rslIndex && evt.rslTotal) {
//create text to track the RSLs being loaded
rslBaseText = "loading RSL " + evt.rslIndex + " of " + evt.rslTotal + ": ";
}
}
/**
* indicate download progress.
*/
override protected function setDownloadProgress(completed:Number, total:Number):void {
}
/**
* Updates the inner portion of the download progress bar to
* indicate initialization progress.
*/
override protected function setInitProgress(completed:Number, total:Number):void {
}
/**
* Event listener for the <code>FlexEvent.INIT_PROGRESS</code> event.
* This implementation updates the progress bar
* each time the event is dispatched.
*/
override protected function initProgressHandler(event:Event):void {
var elapsedTime:int = getTimer() - _startTime;
_initProgressCount++;
if (!_showingDisplay && showDisplayForInit(elapsedTime, _initProgressCount)) {
_displayStartCount = _initProgressCount;
show();
// If we are showing the progress for the first time here, we need to call setDownloadProgress() once to set the progress bar background.
setDownloadProgress(100, 100);
}
if (_showingDisplay) {
// if show() did not actually show because of SWFObject bug then we may need to set the download bar background here
if (!_downloadComplete) {
setDownloadProgress(100, 100);
}
setInitProgress(_initProgressCount, initProgressTotal);
}
}
private function show():void
{
// swfobject reports 0 sometimes at startup
// if we get zero, wait and try on next attempt
if (stageWidth == 0 && stageHeight == 0)
{
try
{
stageWidth = stage.stageWidth;
stageHeight = stage.stageHeight
}
catch (e:Error)
{
stageWidth = loaderInfo.width;
stageHeight = loaderInfo.height;
}
if (stageWidth == 0 && stageHeight == 0)
return;
}
_showingDisplay = true;
createChildren();
}
}
}
的簡稱,它的加載標誌和一個進度條
它顯示一個預載,但真正晚在加載過程。就好像它在Flex之後加載一樣。
我是否需要在CS5中編譯完全避免使用MX/Spark?
在Flex應用程序,而Flex框架正在初始化中示出了預加載。我不相信Flex Framework的依賴關係的預加載器會像你期望的那樣工作。但是,如果您似乎可行,則可以從Flash Builder ActionScript only項目構建SWF並將其用作預加載器。 – JeffryHouser
這是在啓動過程中出現的東西。所以我有點設法在沒有Flex依賴的情況下進行編譯。加載就好像沒有先加載一樣感覺很長。 – MonoThreaded
除了建議您確保創建僅ActionScript的項目並以這種方式創建預加載器(以確保您沒有Flex依賴關係)之外,我沒有其他評論。我相信任何Flex項目,根據定義,都將具有Flex依賴關係。 – JeffryHouser