flash preloader 的[frame]标签实现

大家可能都用过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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值