六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 133|回复: 0

在Flex中打造漂亮的Loading

[复制链接]

升级  52%

36

主题

36

主题

36

主题

秀才

Rank: 2

积分
128
 楼主| 发表于 2013-2-7 19:26:50 | 显示全部楼层 |阅读模式
从RIACHINA转来的
原文地址: http://bbs.airia.cn/FLEX/thread-3292-1-1.aspx

效果浏览
http://www.dragonoffspring.cn/preloader/flexpreloaderexample.html

呵呵,看着Jesse Warden的教程来做的
http://jessewarden.com/2007/07/making-a-cooler-preloader-in-flex-part-1-of-3.html

flash里输出的swf实例控制在6k以内,很轻量的。基本不会出现载入preloader时间长的问题。

preloader.as的源码如下,至于swf的fla源文件,可以去Jesse Warden的那个教程里下来自己改动。
package{import flash.display.MovieClip;import flash.display.Sprite;import flash.events.Event;import flash.events.ProgressEvent;import mx.events.FlexEvent;import mx.preloaders.DownloadProgressBar;/** * This class extends the lightweight DownloadProgressBar class.  This class * uses an embedded Flash 8 MovieClip symbol to show preloading. *  * @author jessewarden *  */public class Preloader extends DownloadProgressBar{/*** The Flash 8 MovieClip embedded as a Class.*/[Embed(source="/assets/flash/myPreloader.swf", symbol="Preloader")]private var FlashPreloaderSymbol:Class;private var clip:MovieClip;private var _preloader:Sprite;public function Preloader(){super();// instantiate the Flash MovieClip, show it, and stop it.// Remember, AS2 is removed when you embed SWF's, // even "stop();", so you have to call it manually if you embed.this.clip = new FlashPreloaderSymbol();this.addChild(clip);this.clip.gotoAndStop("start");}public override function set preloader(preloader:Sprite):void         {                               preloader.addEventListener( ProgressEvent.PROGRESS , onSWFDownloadProgress );                preloader.addEventListener( Event.COMPLETE , onSWFDownloadComplete );            preloader.addEventListener( FlexEvent.INIT_PROGRESS , onFlexInitProgress );            preloader.addEventListener( FlexEvent.INIT_COMPLETE , onFlexInitComplete );            stage.addEventListener(Event.RESIZE, centerPreloader);            _preloader = preloader;            centerPreloader();        }                /**         * Makes sure that the preloader is centered in the center of the app.         *          */                private function centerPreloader(event:Event = null):void{var adjust_X:Number = 300;//X coodinate adjustion according to Object layout.var adjust_Y:Number = 500; //Y coodinate adjustion according to Object layout.x = ((stage.stageWidth+adjust_X) / 2) - (clip.width / 2);y = ((stage.stageHeight+adjust_Y) / 2) - (clip.height / 2);}/** * As the SWF (frame 2 usually) downloads, this event gets called. * You can use the values from this event to update your preloader. * @param event *  */private function onSWFDownloadProgress( event:ProgressEvent ):void        {        var t:Number = event.bytesTotal;        var l:Number = event.bytesLoaded;        var p:Number = Math.round( (l / t) * 100);        clip.preloader.gotoAndStop(p);        clip.preloader.amount_txt.text = String(p);        clip.preloader.amount_txt_img.text = String(p);        }                /**         * When the download of frame 2         * is complete, this event is called.           * This is called before the initializing is done.         * @param event         *          */                private function onSWFDownloadComplete( event:Event ):void        {       clip.preloader.gotoAndStop(100);        clip.preloader.amount_txt.text = "100";        clip.preloader.amount_txt_img.text = "100";        }                /**         * When Flex starts initilizating your application.         * @param event         *          */                private function onFlexInitProgress( event:FlexEvent ):void        {        clip.preloader.gotoAndStop(100);        clip.preloader.amount_txt.text = "Init...";        }                /**         * When Flex is done initializing, and ready to run your app,         * this function is called.         *          * You're supposed to dispatch a complete event when you are done.         * I chose not to do this immediately, and instead fade out the          * preloader in the MovieClip.  As soon as that is done,         * I then dispatch the event.  This gives time for the preloader         * to finish it's animation.         * @param event         *          */                private function onFlexInitComplete( event:FlexEvent ):void         {_preloader.removeEventListener( ProgressEvent.PROGRESS ,     onSWFDownloadProgress );    _preloader.removeEventListener( Event.COMPLETE ,             onSWFDownloadComplete );_preloader.removeEventListener( FlexEvent.INIT_PROGRESS ,     onFlexInitProgress );_preloader.removeEventListener( FlexEvent.INIT_COMPLETE ,     onFlexInitComplete );stage.removeEventListener(Event.RESIZE, centerPreloader);        clip.addFrameScript(21, onDoneAnimating);        clip.gotoAndPlay("fade out");        }                /**         * If the Flash MovieClip is done playing it's animation,         * I stop it and dispatch my event letting Flex know I'm done.         * @param event         *          */                private function onDoneAnimating():void        {        clip.stop();        dispatchEvent( new Event( Event.COMPLETE ) );        }}}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表