本贴没有实际的原创方法,只是对已经存在的方法进行了实验。
关于AS3的自身Loading,论坛里面还是有一些方法的。
针对在Flash CS3下给出的一些方法,我做了一些实验,方法是写一个继承自MovieClip的类,与库中一个MC绑定,这个MC中还有一张200K的图片,用模拟下载28.8K测试,下面是结果。
实验1
在flashlizi的“【从AS2到AS3之三】全新的加载(Loading)机制”中,flashlizi与eidiot在自身Loading方面产生了大大的分歧。
flashlizi的方法是,把所有其他的类在第二帧或以后导出,然后这样写文档类(从原帖Copy的)
package flashrek.example{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.display.LoaderInfo;
import flash.text.TextField;
public class PreLoader extends MovieClip {
var loadText:TextField=new TextField();
public function PreLoader() {
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);
this.loaderInfo.addEventListener(Event.COMPLETE, loadComplete);
addChild(loadText);
}
private function loadProgress(evt:ProgressEvent):void {
var perLoaded:Number = evt.bytesLoaded/evt.bytesTotal;
perLoaded = Math.round(perLoaded * 100);
loadText.text = "Loading: "+perLoaded+"%";
//trace("Loading: "+perLoaded+"%");
}
private function loadComplete(evt:Event):void {
//trace("Complete");
loadText.text="Complete";
}
}
}
而且flashlizi实验成功了。但是,成功的关键是,他的文档类没有去调用其他的自己写的类,而第二帧的mp3也没有进行类绑定。
我的实验是,把我的MC类在第二帧导出,而且要在加载完成之后用一段代码动态创建该类的示例,那么在我的实验中,这段代码无论写在文档类中的加载成功事件之后,还是写在时间轴的第二帧上,都没有执行,甚至影响了文档类中代码的正常执行。
实验2
首先看下在“AS3自身的Loading,头大。。。”这个帖子中出现的代码:
//AS3自身Loading
此代码帧上(第一帧)不要放其他元件(否则要下载完此帧上左右内容才开始,即看不到真实loading效果了)
或者单独用一个场景来做Loading(推荐)
var mytext:TextField = new TextField();
mytext.autoSize = TextFieldAutoSize.CENTER;
mytext.selectable=false;
mytext.background = true;
var myformat:TextFormat = new TextFormat();
myformat.font = "Verdana";
myformat.size = 10;
mytext.defaultTextFormat = myformat;
addChild(mytext);
this.root.loaderInfo.addEventListener(Event.COMPLETE, loadComplete);
this.root.loaderInfo.addEventListener(ProgressEvent.PROGRESS, showProgress);
function loadComplete(event:Event):void {
removeChild(mytext);
play();
}
function showProgress(event:ProgressEvent):void {
var p:Number=event.bytesLoaded/event.bytesTotal;
var n:Number=Math.round(p*100);
mytext.text="Loading "+n.toString()+"%";
mytext.x=stage.stageWidth/2-mytext.width/2;
mytext.y=stage.stageHeight/2-mytext.height;
//trace(n);
}
基于时间轴的~同样不行。只要不在第一帧导出,就会影响所有代码的执行。
而只要在第一帧导出,那么自身Loading的代码就会失去意义。
上面的两个实验仅针对Flash CS3,而且仅仅是对论坛中给出的完整Loading代码的实验,小弟刚刚拿着一本《AS3殿堂之路》开始学,所以实验中肯定会有疏漏之处,希望各位高人批评指正。
我现在想用一个只有2~3KB的swf去load主swf,不知道行不行?这样,就算主swf有个几百KB,也可以显示出Loading的效果了吧。