实现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字典里了你可以随便用了

 

posted @ 2012-08-20 11:11  tinytiny  阅读(698)  评论(0编辑  收藏  举报