zoukankan      html  css  js  c++  java
  • 实现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字典里了你可以随便用了

     

  • 相关阅读:
    ef unitofwork 主从表更新
    自己写的enum转换的一个扩展,
    最近在做政务项目,此种项目,本来并不大,主要原因呢,就是要理好业务需要。
    sql server创建外键,子母表,级联删除。
    js querySelector与getElementById
    写一个system.data.entity的simpledatarepo,实现crudq这些功能,不需要引入entityframework,直接可以使用,用到objectset
    无法更新 EntitySet“W_ReceiveData”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。
    Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31
    开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门
    有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务
  • 原文地址:https://www.cnblogs.com/tinytiny/p/2647245.html
Copyright © 2011-2022 走看看