[url]http://www.eb163.com/club/thread-16229-1-1.html[/url]
让用户面对苍白的屏幕几十秒,那也一件非常可怕的事情。所以一个好的flash作品(游戏也好,动画好罢),都需要一个好的开头!而这个好的开头就是Loading。可能刚开始学习的时候,cookbook会告诉你,使用Loader对象加载外部swf时,可以监听整个加载的进度。那我们再深入的问一问,如果要获取swf自身的加载进度,又该如何操作呢?
听说之前用as2代码的时候(仅听说),很容易就能实现swf自身的loading。但在as3中,相对有些复杂。那么as3中怎么实现呢?纠结了几天,问了论坛里的一些高手(主要是iicam),查了较多的资料,终于把这个问题搞清楚了。现在帖出来,和各位初学者分享一下。
当然,高手路过,还请多多批评指正。
现在回到正文,如何获取加载进度。
知识点:LoaderInfo类
这个是帮助文档中的解释:LoaderInfo 类可提供有关已加载的SWF 文件或图像文件(JPEG、GIF 或 PNG)的信息。 LoaderInfo 对象可用于任何显示对象。提供的信息包括加载进度、加载程序的 URL 和加载内容、媒体的字节总数以及媒体的标示的高度和宽度。
有2种方式可以访问LoaderInfo对象:
1)访问flash.display.Loader对象的contentLoaderInfo属性;
2)任何一个可显示对象(displayobject)都有loaderInfo属性;
注意:每个SWF文档的主类的实例有loaderInfo属性,每个Loader有loaderInfo属性,同时它有一个contentLoaderInfo属性,通过这个属性你可以访问到Loaded对象的loaderInfo。
那么如何通过这个属性获取加载进度呢?
第一种方法(不推荐)
代码如下:
01.package {
02. import flash.display.MovieClip;
03. import flash.events.*;
04. import flash.text.*;
05. public class loader extends MovieClip {
06. var txt=new TextField();///建立一个TextField实例
07. public function loader() {
08. addChild(txt);/将TextField实例推到舞台
09. loaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandler);///当进度变化时更新TextField实例的text属性
10. loaderInfo.addEventListener(Event.COMPLETE,completeHandler);///当载入完成后显示内容
11. }
12. function progressHandler(e:ProgressEvent) {
13. txt.text=e.bytesLoaded*100/e.bytesTotal;
14. trace(txt.text);
15. }
16. function completeHandler(e:Event) {
17. //removeChild(txt);//载入完成后移除进度显示文本
18. }
19. }
20.}
复制代码
说明:此方法可能是初学者常见的一个错误。使用此方法,进度数据一出现,就直接到了100%。
有资料说,代码分离项目主时间轴通常只有一帧,而flash会默认在第一帧导出类,并在此之后调用文档类的构造函数,也就是说progress事件的侦听是在加载完成后才起作用,当然看不到进度了!
所以才有了下面两种办法
第二种方法:双文件法(即加壳)
双文件方法,就是使用一个loader.swf加载一个main.swf(主swf文件)。通过这个加载过程来获取main.swf的加载进度。
具体方法:
1、在loader.as中
n new一个Loader实例 loader,并用load方法载入main.swf
n 在 loader.contentLoaderInfo上添加progress和complete侦听
n 在progress处理函数中更新textField,并在complete处理函数将loader.content添加到舞台
2、在main.as中
l 构建舞台内容
第三种方法:双帧法
1、建立loader.as,再建立fla文件,保证主时轴有两帧且都为关键帧(一般都是空白关键帧)
2、在fla中:
l 建立一个空mc,将此mc拖到主场景的第二帧。(注:mc的名称无所谓,可以随便取)
l 这个空mc也设置为二帧关键帧。
l 将库元件中,所以链接类属性中的“在第1帧导出”前面的勾去掉
l 再将库元件中所有的链接类拖入空mc的第二帧
3、在loader.as中
建立textField并推入舞台, 构造函数中为loaderInfo添加progress和complete侦听
在progress处理函数中更新textField,并在complete处理函数中再添加enter_frame侦听
在enter_frame处理函数中构建舞台内容,并移除enter_frame侦听,也就是说让enter_frame处理函数执行一次就可以了
让用户面对苍白的屏幕几十秒,那也一件非常可怕的事情。所以一个好的flash作品(游戏也好,动画好罢),都需要一个好的开头!而这个好的开头就是Loading。可能刚开始学习的时候,cookbook会告诉你,使用Loader对象加载外部swf时,可以监听整个加载的进度。那我们再深入的问一问,如果要获取swf自身的加载进度,又该如何操作呢?
听说之前用as2代码的时候(仅听说),很容易就能实现swf自身的loading。但在as3中,相对有些复杂。那么as3中怎么实现呢?纠结了几天,问了论坛里的一些高手(主要是iicam),查了较多的资料,终于把这个问题搞清楚了。现在帖出来,和各位初学者分享一下。
当然,高手路过,还请多多批评指正。
现在回到正文,如何获取加载进度。
知识点:LoaderInfo类
这个是帮助文档中的解释:LoaderInfo 类可提供有关已加载的SWF 文件或图像文件(JPEG、GIF 或 PNG)的信息。 LoaderInfo 对象可用于任何显示对象。提供的信息包括加载进度、加载程序的 URL 和加载内容、媒体的字节总数以及媒体的标示的高度和宽度。
有2种方式可以访问LoaderInfo对象:
1)访问flash.display.Loader对象的contentLoaderInfo属性;
2)任何一个可显示对象(displayobject)都有loaderInfo属性;
注意:每个SWF文档的主类的实例有loaderInfo属性,每个Loader有loaderInfo属性,同时它有一个contentLoaderInfo属性,通过这个属性你可以访问到Loaded对象的loaderInfo。
那么如何通过这个属性获取加载进度呢?
第一种方法(不推荐)
代码如下:
01.package {
02. import flash.display.MovieClip;
03. import flash.events.*;
04. import flash.text.*;
05. public class loader extends MovieClip {
06. var txt=new TextField();///建立一个TextField实例
07. public function loader() {
08. addChild(txt);/将TextField实例推到舞台
09. loaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandler);///当进度变化时更新TextField实例的text属性
10. loaderInfo.addEventListener(Event.COMPLETE,completeHandler);///当载入完成后显示内容
11. }
12. function progressHandler(e:ProgressEvent) {
13. txt.text=e.bytesLoaded*100/e.bytesTotal;
14. trace(txt.text);
15. }
16. function completeHandler(e:Event) {
17. //removeChild(txt);//载入完成后移除进度显示文本
18. }
19. }
20.}
复制代码
说明:此方法可能是初学者常见的一个错误。使用此方法,进度数据一出现,就直接到了100%。
有资料说,代码分离项目主时间轴通常只有一帧,而flash会默认在第一帧导出类,并在此之后调用文档类的构造函数,也就是说progress事件的侦听是在加载完成后才起作用,当然看不到进度了!
所以才有了下面两种办法
第二种方法:双文件法(即加壳)
双文件方法,就是使用一个loader.swf加载一个main.swf(主swf文件)。通过这个加载过程来获取main.swf的加载进度。
具体方法:
1、在loader.as中
n new一个Loader实例 loader,并用load方法载入main.swf
n 在 loader.contentLoaderInfo上添加progress和complete侦听
n 在progress处理函数中更新textField,并在complete处理函数将loader.content添加到舞台
2、在main.as中
l 构建舞台内容
第三种方法:双帧法
1、建立loader.as,再建立fla文件,保证主时轴有两帧且都为关键帧(一般都是空白关键帧)
2、在fla中:
l 建立一个空mc,将此mc拖到主场景的第二帧。(注:mc的名称无所谓,可以随便取)
l 这个空mc也设置为二帧关键帧。
l 将库元件中,所以链接类属性中的“在第1帧导出”前面的勾去掉
l 再将库元件中所有的链接类拖入空mc的第二帧
3、在loader.as中
建立textField并推入舞台, 构造函数中为loaderInfo添加progress和complete侦听
在progress处理函数中更新textField,并在complete处理函数中再添加enter_frame侦听
在enter_frame处理函数中构建舞台内容,并移除enter_frame侦听,也就是说让enter_frame处理函数执行一次就可以了