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);

转载http://keaiduocdy.blog.163.com/blog/static/59632461201051755018891/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值