`
hereson
  • 浏览: 1453995 次
  • 性别: 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.0的加载机制详解 #### 一、AS3.0的加载机制概述 在Adobe Flash平台中,ActionScript 3.0 (简称AS3.0)提供了丰富的功能来处理外部资源的加载,包括图像、音频、视频以及其它SWF文件。本文将详细介绍AS3.0中...

    AS3预加载SWF实例源码

    AS3预加载SWF实例源码是用于解决Flash应用程序或动画在加载时可能出现的延迟问题。在大型项目中,SWF文件可能包含大量的图形、音频和视频资源,这些资源的加载时间可能会很长,影响用户体验。预加载(preloading)...

    AS3动态加载字体

    在ActionScript 3 (AS3)中,动态加载字体是一种技术,允许开发者在应用程序运行时加载和使用新的字体。这可以极大地提高应用的灵活性,尤其是对于那些需要展示各种独特字体或者用户可定制字体的应用。本知识点将深入...

    用AS3加载外部SWF文件

    最后,关于删除问题,AS3中的垃圾回收机制通常会自动处理不再引用的对象。然而,为确保释放资源,可以像上面那样使用`unloadAndStop()`方法,并在不再需要时将引用设置为null。 在提供的文件列表中,我们有多个SWF...

    as3 资源加载管理

    总的来说,将白鹭引擎的资源管理方式移植到AS3中,你需要理解和实现资源加载、缓存、预加载和错误处理等核心机制。这不仅涉及到代码编写,还需要考虑性能优化和用户体验。在实现过程中,保持代码的可维护性和扩展性...

    Flex actionscript3 as3加载文件资源进度条.rar

    "Flex actionscript3 as3加载文件资源进度条.rar"这个压缩包可能包含了一个示例项目,演示如何在Flex应用中实现文件加载的进度反馈。 首先,我们需要理解AS3中的Loader类。Loader类是AS3中负责加载不同类型的媒体...

    AS3加载并处理XML

    3. **性能优化**:AS3的XML处理机制经过优化,可以快速地解析大量数据,提高应用程序的响应速度。 #### 三、案例分析 为了更好地理解如何使用AS3加载并处理XML,我们将通过一个具体的例子来进行说明。假设我们有一...

    AS2 加载XML播放器

    在实际项目中,你可能还需要考虑其他功能,如错误处理、缓冲机制、预加载策略等。此外,由于AS2是旧版本的ActionScript,可能遇到浏览器兼容性问题,因此在现代Web环境中,更推荐使用AS3或者HTML5技术。 在提供的...

    as3 视频播放器 纯as3

    【标题】:“AS3 视频播放器 纯...综上所述,这个“AS3 视频播放器 纯AS3”项目是一个学习和实践AS3视频处理能力的好素材,使用者可以通过这个项目深入理解AS3的视频播放机制,并根据需要扩展和定制自己的视频播放器。

    AS3中文版帮助文档

    8. **错误处理**:AS3的错误处理机制通过Error类和try...catch语句实现,可以帮助开发者更好地调试和优化代码。 9. **声音和视频**:AS3提供了丰富的API来处理音频和视频,包括播放、暂停、音量控制等。 10. **...

    Flash AS3 中文帮助文档

    《Flash AS3 中文帮助文档》是针对Adobe Flash Professional CS3中的ActionScript 3.0编程语言提供的中文版API参考手册。ActionScript 3.0是Flash平台上用于创建交互式内容、动画和富互联网应用程序(RIA)的主要...

    FLASHAS3代码

    5. 事件模型:AS3采用了基于事件的编程模型,事件监听和分发机制让程序响应用户交互和系统变化。如点击按钮、加载完成等事件,都可以通过addEventListener()和removeEventListener()来处理。 五、图形绘制 6. 可...

    AS3.0 进度条控制加载的swf

    首先,我们要明白AS3.0中的加载机制。在AS3.0中,我们通常使用`Loader`类来加载SWF或其他类型的媒体文件。`Loader`对象具有`contentLoaderInfo`属性,这是一个`LoaderInfo`对象,提供了关于加载进度的详细信息。我们...

    AS3技术文档

    AS3提供了多种机制来处理同步和异步错误,包括使用自定义错误类和响应错误事件。通过示例“CustomErrors应用程序”,你可以学习到如何优雅地处理和报告错误,提高应用程序的健壮性和用户体验。 ### 使用正则表达式 ...

    flash AS3 中文帮助文档

    此外,文档还会涉及AS3的错误处理机制,包括抛出和捕获异常,这对于调试和优化代码至关重要。时间轴控制是Flash的一大特点,AS3提供了关键帧、动作脚本命令等功能,让开发者能够灵活地控制动画播放。 对于游戏...

    flashas3手册

    《Flash AS3 手册》是一份详尽的资源,旨在帮助开发者深入理解和熟练运用ActionScript 3.0,这是Adobe Flash平台的核心编程语言。AS3是开发互动内容、游戏和富互联网应用(RIA)的强大工具,其语法严谨,性能优秀,...

    as3 游戏开发基础

    7. **网络通信**:如果游戏需要在线功能,如多人对战或高分排行榜,AS3可以使用Socket或XMLSocket类进行TCP/IP通信,或者使用URLLoader类加载和发送HTTP请求。 8. **用户界面(UI)**:AS3提供了组件库,可以构建...

    as3 flash 尋寶遊戲

    AS3提供了一系列数学和几何方法,如矢量运算、矩形碰撞检测等,用于构建这些游戏机制。 6. **动画制作** 利用AS3的补间动画或逐帧动画技术,可以为游戏角色和环境添加生动的动画效果。了解如何控制动画播放速度、...

    Flash as3 相册

    2. 编写ActionScript:在PhotoGallery.as文件中编写AS3代码,实现图片加载、切换、动画效果等功能。 - 图片加载:通常使用Loader类加载图片,并通过Event.COMPLETE事件监听加载完成。 - 图片切换:通过数组或XML...

    as3中文手册chm版

    10. **网络通信**:AS3.0支持XMLSocket、URLLoader和XML等类进行网络通信,可以实现HTTP、FTP等协议的数据交换,常用于与服务器交互或加载外部资源。 11. **本地存储**:使用SharedObject类可以实现客户端的数据...

Global site tag (gtag.js) - Google Analytics