在Flex中打造漂亮的Loading

从RIACHINA转来的
原文地址: [url]http://bbs.airia.cn/FLEX/thread-3292-1-1.aspx[/url]

效果浏览
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 ) );
}

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值