原理:
在flash中,制作loading的目的是为了预先加载一部分内容(你可以选择全部加载完毕,或者加载一部分之后),然后再把flash的主要内容展示出来。一般来讲,loading是放在第一帧上面的(也可以不放在第一帧,比如放在任意一帧,但是在第一帧你要做个跳转,让播放头到loading的那一帧去)。这里要注意一个问题,如果你的flash程序有从元件库里导出元件的话(默认为第一帧导出),要导出的原件全部加载完毕之后才会显示第一帧的内容(即,你的loading)。这样的话很可能你在第一帧导出的内容过于庞大,占据了整个flash应用的很大一部分,比如50%,那么我们实际运行的效果就是在一段空白之后loading从50%处开始显示。
解决以上两个问题的两种方法:
第一,把要导出的元件取消导出,把它们集中放在某一帧(除开你做loading的那一帧),然后在放元件的这一帧之后的那一帧开始运行你的程序。
第二,用另个一个swf来加载需要做loading的swf。这种方法可以有比较完整的加载进度条以及百分比文字,缺点是容易引起其他问题,这个后面会讨论。
举个例子,为A.swf做一个loading,关键代码如下:
......this.loaderInfo.addEventListener(ProgressEvent.PROGRESS,loadProgress);直接在swf上添加loading可能会导致loading不是从1%开始,这时候可以用一个swf加载另一个swf的方法来实现完整的 loading。
比如: 在B.swf里加载A.swf,那么在B.swf的程序里使用loader加载A.swf。需要注意的是,监听loader的加载进度需要使用loader的contentLoaderInfo属性,而不是loaderInfo。关于loaderInfo和contentLoaderInfo的关系如下图所示:
由于B.swf只起到加载A.swf的作用,并没有其他显示内容,所以它本身的加载可以忽略不计,这种方法可以比较完整的展示A.swf的加载过程。但是,同时使用这种方法也引发了一些问题,比如你在A.swf里与web端进行通信,使用了loaderInfo的parameters属性,则你在用B.swf加载A.swf后,通信将失效。这是因为FlashVars
HTML 参数只影响主swf(例子里为B.swf),就是说你可以在B.swf里完成通信,但是A.swf不行。所以,我们可以先在B.swf中获取到页面要传递的信息,然后再让A.swf从B.swf中获取这个信息就可以了。通常我是这样处理的,假如B.swf的文档类为Main.as,那么在Main.as中定义一个static的属性比如prama(public static var prama),用来保存传递的信息,然后再在A.swf中通过Main.prama获取这个信息。这样就间接实现了A.swf与web端的通信。
(以上资源来源于互联网)
================================================================================================== flash自加载
关键:
import flash.events.ProgressEvent;
import flash.events.Event;
stop();
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS,loading);
//添加进度监听
this.loaderInfo.addEventListener(Event.COMPLETE,loaded);
//添加进度完成监听
function loading(e:ProgressEvent) {
var loadpre:int=e.bytesLoaded/e.bytesTotal*100;
trace(loadpre)
loadingtext.text=loadpre+"%";
}
//显示进度载入百分比-----
function loaded(e:Event ) {
loadmc.visible=false
loadingtext.visible=false
gotoAndPlay(2)
}
AS3.0的加载机制
一:Loader类
三:跨域加载的安全机制
四:主场景加载条制作
{ import fl.containers.UILoader;//图片加载组件 import fl.controls.Label;//文本组件 import fl.controls.ProgressBar;//进度条 import flash.events.Event;//输入事件类,如果代码写在帧上,可不用输入 import flash.events.ProgressEvent;//输入事, 件类 import flash.text.TextField;//引进文本类 import flash.net.URLRequest; import fl.controls.ProgressBarMode; import flash.display.Sprite; import flash.text.TextFieldAutoSize;//调整类 public class loadimg extends Sprite { private var url:String = "http://image.cnool.net/picn/2005/ompic030b.jpg" private var loadbox:ProgressBar = new ProgressBar(); private var imgbox:UILoader = new UILoader(); private var showtxt:Label = new Label(); private var titleTxt:TextField=new TextField(); //注意:上面的几个对象要声明在这里,不能放在主函数里声明,这样loadeven()等事件函数里才能认到 public function loadimg() { titleTxt.htmlText="图片加载示例:"; addChild(titleTxt); titleTxt.x=0; titleTxt.y=10; showtxt.autoSize = TextFieldAutoSize.LEFT; showtxt.text = ""; showtxt.move(150, 10); addChild(showtxt); loadbox.mode = ProgressBarMode.MANUAL; loadbox.move(150, 30); addChild(loadbox); imgbox.load(new URLRequest(url)); imgbox.addEventListener(ProgressEvent.PROGRESS, loadeven); imgbox.addEventListener(Event.COMPLETE, loadend); imgbox.setSize(550,400); imgbox.move(0, 40); addChild(imgbox); } private function loadeven(event:ProgressEvent):void { //事件:加载进度显视 var uiLdr:UILoader = event.currentTarget as UILoader; var kbLoaded:String = Number(uiLdr.bytesLoaded / 1024).toFixed(1); var kbTotal:String = Number(uiLdr.bytesTotal / 1024).toFixed(1); showtxt.text = kbLoaded + "/" + kbTotal + " KB" + " (load:" + Math.round(uiLdr.percentLoaded) + "%)"; loadbox.setProgress(event.bytesLoaded, event.bytesTotal); } private function loadend(event:Event):void { //事件:加载完成 删除事件 //showtxt.visible = false; //loadbox.visible = false;//加载完成后隐藏进度条 mgbox.removeEventListener(ProgressEvent.PROGRESS, loadeven); imgbox.removeEventListener(Event.COMPLETE, loadend); } } } (一些小代码) stop(); stage.scaleMode=StageScaleMode.NO_SCALE; //设置舞台属性不跟随播放器大小而改变 stage.showDefaultContextMenu=false; //屏蔽右键菜单 stage.frameRate=30; //设置帧频为30 var stageW=stage.stageWidth; var stageH=stage.stageHeight; //取得舞台宽和高 var loadclip:MovieClip=new MovieClip(); //创建LOADING MC loadclip this.addChild(loadclip) //添加loadclip到舞台 var txt=new TextField(); //创建文本文件 txttxt.autoSize=TextFieldAutoSize.CENTER; //文本文件自适应大小并且居中显示 txt.text="AS3.0 Loading..."; txt.textColor=0x000000; //设置文本颜色 txt.selectable=false; //文本设置为不可选 txt.x=stageW/2-txt.width/2; txt.y=stageH/2-txt.height/2; //设置本文件放置于舞台中央 loadclip.addChild(txt); //将文本实例txt添加到loadclip stgb.graphics.drawRect(0,0,200,10); stgb.graphics.endFill(); stgb.x=stageW/2-stgb.width/2; stgb.y=txt.y+txt.height+5; loadclip.addChild(stgb) //绘制进度条底色并且添加到loadclip var stg=new Sprite(); stg.graphics.lineStyle(1,0x000000,.5); stg.graphics.beginGradientFill(GradientType.LINEAR,[0xff0000,0xffff00],[100,100],[0,255]); //采用渐变填充 红--黄 stg.graphics.drawRect(0,0,200,10); stg.graphics.endFill(); stg.x=stageW/2-stg.width/2; stg.y=txt.y+txt.height+5; loadclip.addChild(stg) //绘制进度条并且添加到loadclip this.loaderInfo.addEventListener(Event.COMPLETE,loaded); //添加进度完成监听 function loading(eve) { var loadpre:int=eve.bytesLoaded/eve.bytesTotal*100; txt.text="影片载入"+loadpre+" %"; stg.scaleX=loadpre/100; } //显示进度载入百分比----- function loaded(eve) { txt.text="影片载入完毕!"; if (framesLoaded == totalFrames) { removeChild(this.getChildAt(0)); nextFrame(); } } |