您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页学习AS3过程的一些笔记

学习AS3过程的一些笔记

来源:榕意旅游网
2、URLStream和URLLoader

URLStream在文本文档数据方面可以支持多种字符编码。

URLLoader在进过测试后,发现除UTF-8字符编码外,其他字符编码读过来的数据都是乱码。

(补,可通过ByteArray对象字符编码转换)

Loader

在试用Loader来加载数据时,添加侦听事件时,注意一定要给Loader的 contentLoaderInfo属性增加事件,而不是给Loader对象增加事件。我就是因为加错对象(关键是编译时还没有报错),郁闷得差点要把电脑给扔了

在调试flash过程发现,如果把swf文档放到html页面后,stage.stageWidth和stage.stageHeight在第一次加载调用时,他们的值为空值;

Base是一个String便于socket传递,在某个客户想向另外一个客户端呈现只有自己有的图片时,就不需要将图片上传到服务器,再把链接发给另外一个客户端,而另外一个客户端得到链接之后,去服务器下载这张图片,再表现出来。

可以把图片转成base,然后直接传给另一个客户端,另外一个客户端收到之后转byteArray再转bitmapdata,就可以表现了。

只是一句话的经验之谈,忽然想到的,记下来,以后可能会找到更有价值的应用。

有时候我们需要将某个数组清空或者说重置,我最常用的办法的是重新new一下,但是有人测试研究发现使用length=0的方法,执行效率是最高的

PopUpManager的机制基本上已经将显示对象置于顶层了,而且,如果你想试图在stage上addchild是不可行,至少我这里是不可行,会报索引错误,尝试很多方法,比如监听addtostage事件,或者跟踪popup出来的显示对象,交换层级,都不行。

答案是用TooltipManager来创建一个Itooltip,试验发现Itooltip始终是置于最上方的,后面的事情就该你自己想了。

有时候我们需要将某个数组清空或者说重置,我最常用的办法的是重新new一下,但是有人测试研究发现使用length=0的方法,执行效率是最高的

获取类名: 传进一个object,返回类的全名 var loader:URLLoader = new URLLoader( );

var className:String = getQualifiedClassName(loader);

trace(className); // Displays flash.net.URLLoader

获取父类的类名:传进一个object,返回父类的类名 var loader:URLLoader = new URLLoader( );

var className:String = getQualifiedSuperclassName(loader); trace(className); // Displays flash.events.EventDispatcher 根据类名取类

var classReference:Class = Class(getDefinitionByName(”flash.net.URLLoader”)); //一但你得到了类的引用后,就可以这样 var instance:Object = new classReference( );

getQualifiedClassName( ) 或 getQualifiedSuperclassName( ) 与 getDefinitionByName() 结合使用的例子:

var loader:URLLoader = new URLLoader( );

var className:String = getQualifiedClassName(loader);

var classReference:Class = Class(getDefinitionByName(className)); var instance:Object = new classReference( );

Introspection:describeType( )返回对象的类型描述

var map : Array = new Array(); map[ key ] = value;

跳帧后取参数问题:

MovieControler.playToFrame(mc,2);

MovieControler.dispatcher.addEventListener(Event.COMPLETE,complete); function complete(evt:Event){

trace(evt.movie.numChildren); }

自己写个类,好像在谁的贴里发过,这样就可以访问了.这事件是在帧播过去之后发出的.

我的做法是用enterFrame一直刷到找到元件为止 屡试不爽

1. Falsh 居中!

Body css 改成:margin:0 auto;padding:0;text-align:center;

内存回收

AS3开发需要注意的地方:

1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉;

2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除;

3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null;

4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉;

5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失;

6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除;

7. 如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除;

8. 注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件都要记得移除干净。

9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。

内存泄露举例:

1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null; 2. 系统类泄露:使用了系统类而忘记做删除操作了,如

BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用

ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除; 类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。

3. 效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。

4. SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null; 5. 图片泄露:当Image对象使用完毕后要把source置null;(为测试); 6. 声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null;

as3:跨域访问安全沙箱 在actionscript里,如果要从其它域里载入swf或数据的话,或者socket要连接服务端的话,就会遇到安全沙箱.在以下情况里(抄自as3 cookbook): 1.swf将要连接的服务器,必须与此swf在同一域中; 2.从网络打开的网页中的swf不能连接到本地服务器; 3.本地不受信任的swf不能连接任何服务器或载入任何文件. 4.swf被跨域载入了,但是不能用as控制其中的代码: 5.跨域载入变量,不行 AS3跨域访问,需要一个策略文件,但在加载此媒体时未设置 checkPolicyFile 标志 解决的方法有两个. 这里所说的方法,都是在被载入的域中进行的,一定注意.[当然了,你得有被载入文件或被连接服务器管理权限] 第一个方法: 1.如果被载入域是以http的方式来提供服务的,那就可以在被载入swf的as里用flash.system.Security.allowDomian(\"允许改变此代码的网域\"); 2.如果被载入域是以https的方式来提供服务的,那可以在被载入swf的as里用flash.system.Security.allowInsecureDomai(\"允许改变此代码的网域\"); 上面所说,解决的是开头所列举的第4个安全. 第二个方法: 这个方法比第一个方法更方便的解决了跨域被载入swf里as访问,而且还解决了跨域载入网页中的变量的安全问题:写访问域方针文件. 另外这个方法也可以解决socket的跨域连接服务器的安全. 如下: 'http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd'> 把此文件保存为crossdomain.xml放在被载入域的根目录下面,载入变量和访问被载入swf中的as时候,做动作的swf就会自动读取了. to-ports是个可选参数,如果不写的话,默认的是开放web端口,也就是80. 但是在socket连接时,不但跨域方针文件要指定端口(因为一般都不会把80做为socket服务器端口),还得在as中明文载入跨域方针文件:flash.system.Security.loadPolicyFile(\"跨域方针文件所在路径\"); 注意了,上面所说的\"跨域方针文件所在路径\可以是在任何目录下面,而且它所能控制的就是所在目录和其子目录,权限不能达到上一层目录.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务