大家可能都用过flex提供的preloader机制,看了bit-101上的文章,就能知道他的内部是怎么实现的了。
简单的说,就是document-class是一个movieclip对象,可以称之为一个factory对象。然后在main类中,通过使用[Frame(factoryClass="xxx")]这个标签,整个swf会产生两帧,并且会把main类所有素材和对象放置在第二帧。然后在第一帧里面,根据framesLoaded,totalFrames这两个参数,判断是否已经全部加载完。如果未加载玩,则更新进度;如果加载完了,则显示main界面
示例代码:
[code]
package com.bit101
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.utils.getDefinitionByName;
public class MyFactory extends MovieClip
{
public function MyFactory()
{
stop();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void
{
graphics.clear();
if(framesLoaded == totalFrames)
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
nextFrame();
init();
}
else
{
var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
graphics.beginFill(0);
graphics.drawRect(0, stage.stageHeight / 2 – 10,
stage.stageWidth * percent, 20);
graphics.endFill();
}
}
private function init():void
{
var mainClass:Class = Class(getDefinitionByName(“FrameTest”));
if(mainClass)
{
var app:Object = new mainClass();
addChild(app as DisplayObject);
}
}
}
}
package {
import flash.display.Sprite;
import flash.display.Bitmap;
[Frame(factoryClass="com.bit101.MyFactory")]
public class FrameTest extends Sprite
{
[Embed(source="big_asset.jpg")]
private var Asset:Class;
public function FrameTest()
{
init();
}
public function init():void
{
var asset:Bitmap = new Asset();
addChild(asset);
}
}
}
[/code]
平时的应用里,自己写个loader去load mian.swf也是很简单的事,但通过Frame标签来的更简单,多了一种选择
gl && hf