`
hereson
  • 浏览: 1428058 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

AS3加载机制

阅读更多

摸了好一阵子,才弄明白AS3.0的加载机制.
还是坚持自己的原则,从适用的角度做记录!下面分别讲述AS3各加载事件与类!
一: Loader类
在AS3.0里把所有事件,属性,加载等都集中在某个对象上了.且加载对象与各触发事件也进行了分工,这和2.0时期,用onEnterFrame和不断检测加载百分比强多了!
Loader继承了基类DisplayObjectContainer,所以他可以也必须当作一个对象用addChild添加才能工作.
Loader 类可用于加载 SWF 文件或图像(JPG、PNG 或 静态GIF)文件。 使用 load() 方法来启动加载。 被加载的显示对象将作为 Loader 对象的子级添加。
例:
        var loadimg: Loader = new Loader();
        var url:String = "http://www.shch8.com/v2007/up/UploadFile/200769182617-1.gif"
        var urlReq:URLRequest = new URLRequest();
        urlReq.url=url;
        loadimg.load(urlReq);
        addChild(loadimg);
和2.0和比,还有一点区别,这里加载时要先把字符串地址转化为url加载对象,在程序中的第三行是直接设置加载对象的url属性的,也可以这样写urlReq = new URLRequest(url),除了url属性还有几个公共属性,一般很少用到如:method用来控制get还是post提交方式。
因为把加载当作一个对象了,所以就不需要象2.0时期一样,新建一个影片来装载加对的物体loadMovie(“myimg.jpg”,”mv”),我们可以直接设置他的x/y轴或宽高。还有Loader对象是二进制方式加载swf了,在flash9之前我们做加载条是用影片的getBytesLoaded和getBytesTotal来检测的是否加载完成。这不是真正意义上的加载,只是判断帧的加载数,所以会出现类似情况,加载到20%停了很久突然跳到90%因为那一帧放了整个影片70%的数据。以前在蓝色里有讨论过这个话题,还有人说是MM在走江湖!呵,现在解决了!
Loader的所有方法:
1. Loader()
创建一个可用于加载文件(如 SWF、JPEG、GIF 或 PNG 文件)的 Loader 对象。
2. close(): void
取消当前正在对 Loader 实例执行的 load() 方法操作。
3.load(request: URLRequest, context: LoaderContext = null):void
将 SWF、JPEG、渐进式 JPEG、非动画 GIF 或 PNG 文件加载到此 Loader 对象的子对象中。
4.loadBytes(bytes:ByteArray, context: LoaderContext = null):void
从 ByteArray 对象中所存储的二进制数据中加载。
5.unload():void
删除此 Loader 对象中使用 load() 方法加载的子项。
二: LoaderInfo事件机制
LoaderInfo非常好用,他是继承EventDispatcher对象用来检测网络加载状态。可以把加载动作细细地解剖出来。
原来在flash9之前,我们绞尽脑汁去获取加载来的swf的宽度、高度、帧频、版本等数据,但一直没研究出好的方法现在LoaderInfo可以做到能获取加载对象的各属性,这点很好有时用swf来加载不确定swf时很有用,可以用那些属性来重新设置主swf。
加载对象所加载数据的实时检测上,PROGRESS事件可以取代以前用onEnterFrame的疯狂检测工作。当然2.0的也有自己的事件,只是很少人用!
LoaderInfo所继承的所有事件:
1.complete(事件参数Event. COMPLETE)
   成功加载数据后调度。  
2.HttpStatus(事件参数HTTPStatusEvent.HTTP_STATUS)
   在通过 HTTP 发出网络请求并且 Flash Player 可以检测到 HTTP 状态代码时调度。  
3. Init(事件参数Event.INIT)
   已加载的 SWF 文件的属性和方法可访问时调度。  
4.IoError(事件参数IOErrorEvent.IO_ERROR)
   在发生导致加载操作失败的输入或输出错误时调度。  
5.Open(事件参数Event.OPEN)
   在加载操作开始时调度。  
6.Progress(事件参数ProgressEvent.PROGRESS)
   在下载操作过程中收到数据时调度。  
7.Unload(事件参数Event.UNLOAD)
   每次使用 Loader 对象的 unload() 方法删除已加载对象时,或者当同一 Loader 对象执行第二次加载并且在加载开始之前删除了原始内容时,由   对象调度。
具体测试例子请看loadjpg.swf与loadswf.swf
LoaderInfo的获取swf属性时要等swf加载完才能获取,也就是在COMPLETE事件里获取
     如: loadswf.contentLoaderInfo.addEventListener(Event.COMPLETE, loadcom)
             function loadcom(the:Event):void {
               trace("AS版本:AS"+the.target.actionScriptVersion+".0")
               trace("swf版本:flash"+the.target.swfVersion+".0")
               trace("swf宽:"+the.target.width+"swf高:"+the.target.height)
               trace("swf帧频:"+the.target.frameRate+"帧/秒")
             }
事件触发的各个顺序分别是
OPEN>>INIT>>HTTP>> COMPLETE
加载操作开始时调度>>进入事件 SWF 文件的属性和方法调度>>状态事件通过 HTTP 发出网络请求并且 Flash Player检测到 HTTP 状态代码>>加载完成
例(需要flashPlay9.0播放器才能正常测试):
三:跨域加载的安全机制
你可以加载来自任何可访问源的内容。
如果执行调用的 SWF 文件位于网络沙箱中并且要加载的文件是本地的,则不允许加载。
如果加载的内容为用 ActionScript 3.0 编写的 SWF 文件,那么除非可以通过调用加载的内容文件中的 System.allowDomain() 或 System.allowInsecureDomain() 方法来允许跨脚本排列,否则另一个安全沙箱中的 SWF 文件不能对它执行跨脚本操作。
如果被加载的内容为 AVM1 SWF 文件(用 ActionScript 1.0 或 2.0 编写),则 AVM2 SWF 文件(用 ActionScript 3.0 编写)不能对它执行跨脚本操作。 但是,可以通过使用 LocalConnection 类在两个 SWF 文件之间实现通信。
如果被加载的内容为图像,则除非该 SWF 文件的域包含在该图像原始域的跨域策略文件中,否则安全沙箱之外的 SWF 文件无法访问其数据。
在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本,反之亦然。
四:主场景加载条制作
我们都知道,AS2.0是用_root. getBytesLoaded()和_root. getBytesTotal()来判断swf是否被加载完,但在3.0里面_root,_global,_parent等原来的”骨干职工”都被开除了!取代他的是stage,对于场影设置,他是一手遮天了如设置swf全屏,对齐方式,显视品质等。但stage只继承了DisplayObjectContainer一部分属性,可用的还太少了。
在做场影加载条时,我们要获取场影的加载情况。要想办法把上面讲的LoadInfo事件添加到主场景去,用stage是做不到的。但可以用显视类DisplayObject 添加,他继承了   EventDispatcher,可以直接用他的属性指定主场景来添加,DisplayObject和属性和原来的movieClip还是很像的,只是前面不用加下划线作区分了如:root.loaderInfo.addEventListener()
用root调度loaderInfo:
     root.loaderInfo.addEventListener(ProgressEvent.PROGRESS, loadshow)
       function loadshow(the: ProgressEvent):void {
          var loadnum:Number=int(the.bytesLoaded/the.bytesTotal*100);
            showtxt.text="load:"+loadnum + "%";
            gotoAndStop(loadnum);
      }
五:使用系统图片与加载条等组件写的加载类
package myAs{
            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;//加载完成后隐藏进度条
                         imgbox.removeEventListener(ProgressEvent.PROGRESS, loadeven);
                          imgbox.removeEventListener(Event.COMPLETE, loadend);
               }
            }
       }
使用组件就轻松多了,不用考虑那么多。只是开发出一个适用的产品最好不要去用官方的组件。自己去写过,写过适合自己的组件。不过CS3的Uiloader感觉很不错!

分享到:
评论

相关推荐

    AS3.0的加载机制

    还是坚持自己的原则,从适用的角度做记录!下面分别讲述AS3各加载事件与类! 转

    AS3.0语言在Flash编程中的应用

    摘要 1、绪论 ... 2、AS3的事件侦听机制 3、在AS3中改变对象的位置和缩放对象 4、演示 3、XML的运用 1、新建FLASH 2、创建 viewer.as 的类 3、创建pics,xml 的文件 4、总结 5、致谢 6、参考文献

    asf:用C编写的简单,高性能PHP框架

    产品特点框架提供的类,在PHP进程启动时加载,并且驻留在内存中。 Errno = 999,PHP致命错误拦截。 强大的预警机制(数据库,缓存,脚本,PHP错误)。 支持记录缓冲区缓存支持GPC方法,使使用PHP全局变量($ _GET,$...

    论文研究-IaaS环境下虚拟机无代理通信加密机制.pdf

    针对IaaS(infrastructure as a service)环境下虚拟机通信数据在共享网络基础设施中的安全性问题,提出了一种虚拟机无代理通信加密机制。该机制通过加载于虚拟化节点内的加密模块与平台统一加密控制器间的协作,...

    www-site:ASF 网站

    Apache 基金会网站 ( ) 我们现在在生产 该存储库提供了 Apache 软件基金会主网站的源代码。 ... ezmd页的组合和GitHub风格降价。...ASF 数据加载——ezt 和 pelican 使用的 ASF 元数据。 参见asfdata.py 。 ASF

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...

    sPart v 1.0.3美化版

    sPart 有两套更换皮肤的机制:通过内部的图片资源更换,加载外部图片更换。 3、组件库的体积小,编译快。 4、自带有基本运动类,实现了窗口控件的 弹出/消失 效果及控件的滚动功能 目前完成的 sPart 组件库的控件:...

    ofbiz综合技术文档

    2、利用OFBiz建立简单有效的SSO机制 60 4、备注 62 第六部分、安全控制 62 一、认证 62 1、实体 63 2、应用 63 二、权限 63 1、权限的定义方法 63 2、权限的访问 64 三、CA认证 64 第七部分、会员管理 64 一、会员 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...

    javascript+css 网页每次加载不同样式的实现方法

    每次随机加载skin1.css、skin2.css、skin3.css,或者使用默认风格。需要注意的一点是,随机加载也有可能使这一次和上一次的样式相同。 【实现思路】 使用[removed]动态向<head />中写入css载入语句; 通过...

    AndroidComponentPlugin:Android上简单实现四大组件的插件化,供学习使用

    插件化代码的编写,涉及到的知识点主要有java中的反射,动态代理,静态代理以及android中的AIDL跨进程通信,binder机制,ClassLoader加载机制,四大组件的运行原理等等。本项目代码主要参考和。在此基础上做了大量的...

    Javascript实现图片懒加载插件的方法

    Web 图片的懒加载就是通过读取img元素,然后获得img元素的data-src(也可以约定为其他属性名)属性的值,并赋予img的src,从而实现动态加载图片的机制。 这里需要注意的是: img在初始化的时候不要设置src属性,因为...

    Hibernate3的帮助文档

    2.2.6. 加载并存储对象 2.3. 第二部分 - 关联映射 2.3.1. 映射Person类 2.3.2. 一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. ...

    LINQ 实战 3/11

    14.5.2 使用AsDataView实现双向数据绑定 408 14.6 在LINQ to DataSet中使用查询操作符 410 14.6.1 用于DataRow的FieldT和SetFieldT操作符 410 14.6.2 集合操作符以及用DataRowComparer比较DataRow 411 14.7...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    At present business processes are old and explicit in industrial market of certification and detection filed, as well as users can not have effective and convenient communication with detection ...

    javascript高级模块化require.js的具体使用方法

    RequireJS是一个非常小巧的javascript模块载入框架,是AMD(Asynchronous Module Definition,异步模块加载机制)规范最好的实现之一。最新版的requireJS压缩后只有14k,堪称非常轻量。它还同时可以和其他的框架协调...

    Java ClassLoader 原理详细分析

    一、什么是ClassLoader?...而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有clas

    c#学习方法

    3. .Net 框架原理讲解:多维数组、可变参数 Params、类的实例化内存分配机制等。4. 深入学习对象类型:里氏替换原则(LSP)、类的属性极其本质特性、IS ,AS 关键字、深入学习字符串理论、枚举类型以及适用场合。5. ...

Global site tag (gtag.js) - Google Analytics