English 中文(简体)
软载体
原标题:Flex Preloader without Flash CS

I have been digging for custom Flex preloaders and they all seem to rely on the same template:
An SWC is created with Flash CS5 and then used by Flash Builder using the "preloader" application property.

I don t own Flash CS, and it feels that Flash builder should be able to do the trick.
I created a Library Project in Flash Builder with the following bare bones code:

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();
        }

    }
}

For short, it s loading a logo and a progress bar
It displays a preloader, but really late in the loading process. As if it was being loaded after Flex.
Do I need to compile this in CS5 to completely avoid use of MX/Spark?

最佳回答
  1. 您在装船前使用任何部件。 提炼进口(Ctrl+Shift+O):

    import mx.controls.Image; import spark.components.Label;

  2. 必要时使用文本现场和Loader。 我不敢肯定下载方案部分。

此外,不使用预载器也造成儿童。 这里有一个工作样本:

package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.text.TextField;
import flash.text.TextFormat;

import mx.core.mx_internal;
import mx.preloaders.SparkDownloadProgressBar;

use namespace mx_internal;

public class Preloader extends SparkDownloadProgressBar {

    private var preloaderLogo : MovieClip;
    private var loadingText : TextField;
    private var loadingProgress : TextField;

    private var _initProgressCount : uint = 0;

    private var textFormat : TextFormat = new TextFormat("Verdana", 16, 0x666666, true);

    public function Preloader() {
        super();

        textFormat.align = "center";
    iii


    override public function set preloader(value : Sprite) : void {
        super.preloader = value;

        if (!preloaderLogo) {
            preloaderLogo = new Assets.PRELOADER_LOGO;  // kakaranet logo

            var startX : Number = Math.round((stageWidth - preloaderLogo.width) / 2);
            var startY : Number = Math.round(stageHeight / 2 - preloaderLogo.height) - 100;

            preloaderLogo.x = startX;
            preloaderLogo.y = startY;

            loadingText = new TextField();
            loadingProgress = new TextField();

            loadingText.width = stageWidth;//to allow center align
            loadingProgress.width = stageWidth;                


            loadingText.text = "Loading...";
            loadingText.y = preloaderLogo.y + preloaderLogo.height + 20;


            loadingProgress.text = "0%";
            loadingProgress.y = loadingText.y + loadingText.textHeight + 10;

            addChild(preloaderLogo);
            addChild(loadingText);
            addChild(loadingProgress);

            loadingText.setTextFormat(textFormat);
            loadingProgress.setTextFormat(textFormat);
        iii
    iii


    override protected function progressHandler(event : ProgressEvent) : void {
        super.progressHandler(event);
        if (loadingProgress) {
            loadingProgress.text = Math.floor(event.bytesLoaded / event.bytesTotal * 100) + "%";
            loadingProgress.setTextFormat(textFormat);
        iii

    iii

    override protected function completeHandler(event : Event) : void {
        loadingText.text = "Ready!";
        loadingText.setTextFormat(textFormat);
        preloaderLogo.stop();
    iii        


    override protected function initProgressHandler(event : Event) : void {
        super.initProgressHandler(event);
        //similar to super
        _initProgressCount++;
        if (loadingProgress) {
            loadingProgress.text = "100% / " + Math.floor(_initProgressCount / initProgressTotal * 100) + "%";
            loadingProgress.setTextFormat(textFormat);
        iii
    iii
iii

iii

问题回答

暂无回答




相关问题
Disable button tooltip in AS3

I want to disable the tooltip on certain buttons. The tooltip manager seems to be an all or nothing solution. Is it possible to disable the tooltip for just one or two buttons?

Multiple Remote call made simultenously

I was making multiple remote calls and they are done sequentially and when I am getting a result event back it s triggering calls to all the methods with ResultEvent as an argument . I am supposed to ...

Attaching a property to an event in Flex/AS3

I have a parameter that needs to be passed along with an event. After unsuccessful attempts to place it on the type by extending the class, I ve been advised in another SO question to write a custom ...

Clearing RSL in Cache

I have built a flex application which has a "main" project and it is assosciated with a few RSL s which are loaded and cached once i run my "main" application. The problem i am facing is that the ...

What s a good way of deserializing data into mock objects?

I m writing a mock backend service for my flex application. Because I will likely need to add/edit/modify the mock data over time, I d prefer not to generate the data in code like this: var mockData =...

AS3 try/catch out of memory

I m loading a few huge images on my flex/as3 app, but I can t manage to catch the error when the flash player runs out of memory. Here is the what I was thinking might work (I use ???? because i dont ...

热门标签