实现loading素材,最后在显示flash
最近做了个flash,由于里面包含大量的图片和音频,而且主文件也较大,导致这个flash文件容量过大;于是想做个loading,批量下载完所有素材和主文件后再一次将flash呈现给用户
请问QQ农场那样的"加载UI素材",……,"加载主文件",分几个步骤下载资源是怎么实现的呀?
(另外请问用flash开发和flex开发的项目,实现这个loading有什么不同吗?)
嘿嘿 这个我在日志里发表过
直接转帖过来吧....
你看看是不是你要的..?
哎 新手就是新手 不敢再论坛里丢菜
本想让大家指点一二的 过不了心里这关 在这里发表好了
前段时间做了一个类似QQ农场的loading丢在这里做个积累
也分享一下 欢迎大侠们前来丢砖....
先来看看XML:
<?xml version="1.0" encoding="utf-8"?> <data> <myswf name="场景">swf/scene.swf</myswf> <myswf name="按钮">swf/buttn.swf</myswf> <myswf name="UI图标">swf/UIicon.swf</myswf> </data>
这里就不多解释了 一目了然吧...嘿嘿...
接下来我们看看文档类吧:
package item { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.ProgressEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.system.System; import flash.display.DisplayObject; public class loading extends Sprite { //定义变量loadingxml作为XML的容器 private var loadingxml:XML = new XML(); //定义变量XML_URL指定XML路径 private var XML_URL:String = "xml/loadings.xml"; //定义变量myXMLURL指定XML_URL的值为XML路径 private var myXMLURL:URLRequest = new URLRequest(XML_URL); //定义变量myLoader并且通过路径myXMLURL载入XML private var myLoader:URLLoader = new URLLoader(myXMLURL); //定义变量reswf作为存储swf路径的容器 private var reswf:URLRequest; //定义变量i用来判断当前因载入第几个swf private var i:int = 0; //定义变量loadingtiao指定loading动画跳转到第几帧 private var loadingtiao:int; //定义变量dishu储存已载入的swf在loading上占有的百分比数字 private var dishu:int = 0; //定义变量sp作为储存所有的swf容器 private var sp:Sprite = new Sprite; //定义变量loader用来启动swf载入事件 private var loader:Loader; public function loading() { xmlload() } //载入xml private function xmlload() { System.useCodePage = true; //载入成功后执行xmlLoaded myLoader.addEventListener(Event.COMPLETE, xmlLoaded); } private function xmlLoaded(event:Event) { loadingxml = XML(myLoader.data); xmlreload() } //通过XML中myswf提供的路径 开始载入第i个swf private function xmlreload() { loader = new Loader(); reswf = new URLRequest(loadingxml.myswf[i]); //swf载入中执行loadingshijian函数 loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadingshijian); //swf载入后执行loaders函数 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaders); loader.load(reswf); //将载入后的swf放到sp容器中 sp.addChild(loader); } private function loadingshijian(eve:ProgressEvent) { //定义变量zdx存储要载入的swf整体大小 单位KB var zdx:Number = Math.round(eve.bytesTotal/1000); //定义变量dqdx存储要载入的swf当前载入大小 单位KB var dqdx:Number = Math.round(eve.bytesLoaded/1000); //定义变量percentLoaded存储要载入的swf当前载入百分比 var percentLoaded:Number = eve.bytesLoaded / eve.bytesTotal; percentLoaded = Math.round(percentLoaded * 100); //计算loadingtiao要跳转到得帧数 这里除以XML中myswf的长度为了平均将百分比分给每个swf 加上 当前载入了多少个swf的百分比 loadingtiao = Math.round(percentLoaded /loadingxml.descendants("myswf").length() + dishu); //让loadiing动画执行跳转命令 loadingT.loadingTA.gotoAndStop(loadingtiao); //loading动画中的test动态文本显示当前正在载入什么和百分比以及KB比例 loadingT.test.text = "当前正在载入" + loadingxml.myswf.@name[i] + percentLoaded+"% " + dqdx + "KB/" + zdx+"KB"; } private function loaders(eve:Event) { //判断XML中是否所有的swf载入完成 if (i < loadingxml.descendants("myswf").length()-1) { //如果没有 开始载入第二个swf i = i+1; dishu = (100/loadingxml.descendants("myswf").length())*i; xmlreload() }else { //如果载入完成 显示所有的swf并且loading动画隐藏以及删除监听节省资源损耗 addChild(sp); loadingT.visible = false; removeEventListener(ProgressEvent.PROGRESS, loadingshijian); removeEventListener(Event.COMPLETE, loaders); } } } }
加载N个文件,同加载一个是一样的嘛
反正,依次来,加载完成一个,再进行下一个
(这种问题,这几天出现很多次了)
恩,多谢楼上,我知道实现细节是用bytesLoaded和bytesTotal来计算百分比。
我是想知道,swf文件本来就很大了,是用另外一个很小的swf来显示loading进度,然后到100%再显示真正的swf吗?
这个我来说吧;
还是老问题了。
先用FLASH把所有要用到得素材链接整合好了(包括:定义组件链接名称,选取特定的类型等等)。然手生成*.swf;
然后FLEX加载此*.swf;(如果嫌此swf过大,可以把这些素材分不同的*.fla生成不同的*.swf分个加载.
全部加载完毕后。开始初始化(即从这些*.swf中把组件取出,可以取出来都放在Dictionary或者Object里面)
怎么取呢?
var dic:Dictionary = new Dictionary(); var arr:Array=["mc0,","simpleButton1","bitmapdata1","sound1","video1"];///资源名称数组 var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventLisntener(Event.COMPLETE,complete); loader.load(new URLRequest("*.swf"); function complete(e:Event):void{ for(var i:int=0;i<arr.length;i++){ dic[arr[i]] = loader.loaderInfo.application.getDefinition(arr[i]) as Class; } }
OK这样所有的资源都存放到了dic这个Dictionary字典里了你可以随便用了