`

AS3.0的加载机制

阅读更多

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

相关例子下载AS3Loader.rar(内带swf与jpg加载例子及舞台加载条和CS3的加载条应用类)
带swf预览
一: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感觉很不错!

分享到:
评论

相关推荐

    flash as3.0与XML做的简单幻灯片

    在创建幻灯片应用时,我们将利用AS3.0的类和事件处理机制来实现幻灯片的切换和控制。 XML用于存储幻灯片数据,每个幻灯片作为一个节点,包含图片路径、标题和描述等属性。例如: ```xml 幻灯片1" description=...

    AS 3.0中文文档

    5. **ActionScript与Flash Player交互**:通过AS 3.0,开发者可以控制Flash Player的行为,如加载外部资源、播放音频和视频,以及与用户交互。 6. **网络通信**:XMLSocket、URLLoader和XML等类支持XML、JSON和其他...

    as3.0通过XML加载外部图片实例

    在AS3.0中,通过XML来加载外部图片是一种常见的技术,这主要涉及到ActionScript 3.0的基础知识,XML的解析以及加载机制,以及图片显示对象的使用。以下是关于这个主题的详细解释: 1. **AS3.0基础知识**: AS3.0是...

    as3.0做的连连看

    AS3.0提供了垃圾回收机制,但开发者仍需注意避免内存泄漏。此外,合理地缓存对象、减少不必要的计算以及适时的资源释放都是提高游戏性能的重要手段。 7. **用户体验** 为了提供良好的用户体验,游戏应具有响应迅速...

    Flash as3.0制作的拼图小游戏源码。

    AS3.0是ActionScript 3.0的缩写,它是Adobe Flash开发中使用的编程语言。这个编程版本在2006年推出,相对于之前的AS2.0,它有着显著的性能提升、类型检查和垃圾回收机制等改进,极大地提高了开发效率和代码质量。 ...

    AS3.0简单相册,适合初学者

    5. **位图处理**:为了展示图片,AS3.0提供了BitmapData类,可以用来加载、绘制和操作位图。Bitmap和Sprite类用于在舞台上显示位图。 6. **XML或JSON数据加载**:通常,相册的数据(如图片URL和描述)会存储在外部...

    AS3.0+XML 相册 (自己写的)

    AS3.0+XML 相册是一种常见的网页动态展示方式,尤其适用于创建具有交互性和可扩展性的图片库。在这个项目中,开发人员使用了ActionScript 3.0(AS3.0),这是一种强大的编程语言,它是Adobe Flash Player和Adobe AIR...

    FLASH AS3.0 控制加载的图片旋转缩放

    首先,我们需要了解基本的图片加载机制。在AS3.0中,我们可以使用`Loader`类来加载图像文件。例如,在`ImgLoader.as`中,我们可能有以下代码: ```as var loader:Loader = new Loader(); loader.contentLoaderInfo....

    AS3.0中文版API

    2. **事件模型**:AS3.0引入了强大的事件处理机制,通过`Event`类和`EventDispatcher`接口,你可以监听和响应各种用户交互和程序事件。 3. **显示对象层次**:包括`DisplayObject`和`DisplayObjectContainer`,它们...

    AS3.0游戏18例源码包

    AS3.0游戏18例源码包是一个针对初学者设计的资源集合,它涵盖了18款基于ActionScript 3.0(AS3.0)编程语言开发的简单小游戏。这个压缩包对于想要学习或提升AS3.0编程技能的人来说极具价值,因为它提供了可以直接...

    as3.0超级玛丽源码

    AS3.0提供了一套完整的事件监听机制,我们可以利用`KeyboardEvent`监听键盘输入,并根据不同的键值改变玛丽的状态。同时,为了实现流畅的动画效果,源码中会用到帧动画和时间间隔控制,例如通过`setTimeout`或`...

    as3.0实现的一个碰撞类小游戏

    最后,游戏的保存和加载机制也很重要。尽管AS3.0没有内置的持久化存储,但可以通过本地存储API(如`SharedObject`)或网络请求将游戏状态数据存储到服务器或本地硬盘。 总的来说,“as3.0实现的一个碰撞类小游戏”...

    AS3.0背包功能

    AS3.0背包功能是一种在ActionScript 3.0编程中实现的游戏或应用程序中的常见功能,主要用于模拟现实世界中的背包系统,允许用户收集、存储和管理各种物品。在这个项目中,开发者使用了PUREMVC框架来构建这个背包系统...

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

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

    as3.0 开发的钟表型动画Loading源码

    AS3.0(ActionScript 3.0)是Adobe Flash平台上的编程...通过这个钟表型动画Loading源码,开发者不仅可以学习到AS3.0中的内容加载机制,还能掌握如何创建动态图形和动画,以及如何优化和组织代码,提升项目的整体质量。

    15款as3.0小游戏

    本压缩包包含15款使用AS3.0编写的简单小游戏,这些游戏可以作为学习AS3.0的实践案例,帮助开发者理解其基本语法、类结构和事件处理机制。 1. **基础知识** - **面向对象编程**:AS3.0是完全面向对象的语言,它支持...

    as3.0做的音乐播放器

    AS3.0是一种基于ActionScript 3.0的编程语言,它是Adobe Flash Professional、Flex Builder等工具进行富互联网应用(RIA)开发的核心技术。在这个项目中,你使用AS3.0构建了一个音乐播放器,这涉及到多媒体处理、...

    简易涂鸦板 Flash AS3.0

    6. **数据存储**:为了保存用户的涂鸦,开发者可能利用了Flash的本地数据存储机制,如SharedObject,将用户的作品以数据形式保存到本地,以便之后加载和回放。 7. **笔记**:压缩包中提到的笔记可能是开发过程中的...

    AS3.0类 flash 抽象类工具包

    1. **EventDispatcher**: AS3.0中的事件处理机制是基于EventDispatcher类的。抽象类EventDispatcher提供了一种标准的方式来处理事件监听和分发,使得其他类可以方便地实现事件驱动编程。 2. **DisplayObject**: 这...

Global site tag (gtag.js) - Google Analytics