翻转
水平翻转对象:
doubleClick事件
要使MouseEvent.DOUBLE_CLICK事件能够正常工作,必须设置目标的doubleClickEnabled为true且mouseChildren为false。
hitArea属性
Sprite的hitArea属性的官方定义是:
- 必须将b的mouseEnabled设为false,否则a可能不会触发点击事件
- 最好将a的mouseChildren设为false,否则a的子项可能触发click事件,从而引起困惑
getDefinitionByName获取SWC中的类
若要使用getDefinitionByName方法从swc中获取类,则需要链接SWC中的所有类。否则会得不到该类定义。
具体方式为,添加编译器参数:-include-libraries url,url表示swc所在的目录路径。
编译时加载XML
区别于用loader在运行时加载XML,以下方式可以在编译时加载XML文件。
跨域和外部访问JS
跨域XML crossdomain.xml
此时若a.swf需要访问b.swf,需要b.swf所在的根域名提供crossdomain.xml,并在此xml中允许a.swf所在的域访问。
JS通信 参数和返回值
flash和外部JS的通信可以互相传递参数和返回值。
比如c.js回调a.swf中的callback函数时,可以向a.swf中的callback函数传入参数。
此外,a.swf的callback函数如果有返回,则可被c.js的回调函数捕获作为c.js里该函数的返回值返回。
允许JS回调SWF函数
以上a.swf和c.js的通信还存在跨域问题。
解决办法是:
在嵌入a.swf的地方加入HTML标签:
GreenSock
GreenSock是一个轻量稳定易用的AS3缓动类库。
GreenSock的作者Jack提供了一些使用的技巧和建议。
下面是节选的翻译。
使用TweenMax时,可以开启一些缓动的算法加速。
使用TranformMatrixPlugin来加速旋转和缩放的缓动。
使用字符串参数来表示相对位置。
使用TweenMax.allTo()来操作拥有相同缓动变量的对象
用TimelineLite来管理多重缓动。TimelineLite的示例视频。
IDE
快捷键
工欲善其事,必先利其器。使用快捷键会大大提升工作效率。
以下是我在用Flash Builder(同Eclipse)的常用快捷键:
- 调试:F11
- 快速向上复制选中块:Ctrl+Alt+↑
- 快速向下复制选中块:Ctrl+Alt+↓
- 快速跳转行:Ctrl+L
- 自动缩进:Ctrl+I
- 去除不必要的import语句:Ctrl+Shift+O
- 全局搜索:Ctrl+H
- 文件内搜索:Ctrl+F
- 快速打开文件:Ctrl+Shift+R
- 快速大纲:Ctrl+O
- 代码提示:ALt+/
- 快速跳转至上一次编辑位置:Ctrl+Q
- 行注释和解注释:Ctrl+/
- 块注释和解注释:Ctrl+Shift+C
过滤器
要在FlashBuilder中显示.actionScriptProperties等属性文件。
点击过滤器,解选所有文件。
性能优化手段
- 多数情况下,尽可能使用回调函数而非事件,事件侦听会消耗额外的帧处理时间和一部分内存。
- 将不需要鼠标事件响应的显示对象的mouseEnabled和mouseChildren设为false。
- 尽可能减少需要重绘物件的大小以减少不必要的渲染区域。
- 矢量运算需要消耗大量CPU计算,如果矢量太多,帧率会急剧下降,可用位图替代。
- 使用对象池来缓存对象,达到对象重用,而不是每次都new一个对象出来。
- 若渲染压力大,但是对显示质量要求不高,可以将舞台的显示效果降低。
0stage.quality = StageQuality.LOW;
- 减少Timer的对象个数,在一个Timer事件上尽可能只用一个侦听函数进行侦听,然后在此侦听函数内做不同的处理。
- 尽可能使用Vector而非Array
- 对于文本框,尽可能使用appendText()而非”+=”来添加文本
0 |
obj.scaleX = -obj.scaleX; |
0 |
obj.scaleY = -obj.scaleY; |
0 1 2 |
mc.doubleClickEnabled = true; mc.mouseChildren = false; mc.addEventListener( MouseEvent.DOUBLE_CLICK, doubleClickHandler ); |
指定一个 sprite 用作另一个 sprite 的点击区域。如果 hitArea 属性不存在或者其值为 null 或 undefined,则 Sprite 本身将用作点击区域。hitArea 属性的值可以是对 Sprite 对象的引用。例如:
0 |
a.hitArea = b; |
0 1 2 |
a.hitArea = b; b.mouseEnabled = false; a.mouseChildren = false; |
0 1 2 3 4 5 6 7 |
//source表示要嵌入的XML的路径 不需要分号! [Embed(source="config.xml", mimeType="application/octet-stream")] //这句声明必须紧接着上一个语句 private var config:Class; //使用方式 //confXML即为config.xml的XML类 var confXML:XML = XML(new config); |
-
背景:a.swf和b.swf不在同一个根域名下,a.swf和c.js不在同一根域名下。
0 |
<param name="allowScriptAccess" value="always" /> |
0 |
params.allowscriptaccess = "always"; |
0 |
Security.allowDomain( "*" ); |
0 |
FastEase.activate( [ Linear, Quad, Strong ] ); |
0 1 2 |
TweenLite.to( mc, 1, { scaleX:2, scaleY:2, rotation:30 } ); //下面的语句会更快一些 TweenLite.to( mc, 1, { transformMatrix:{ scaleX:2, scaleY:2, rotation:30 } } ); |
0 |
TweenPlugin.activate( [ TransformMatrixPlugin ] ); |
0 1 2 3 |
//这两句代码是等效的 TweenLite.to( mc, 1, { y: mc.y - 100 } ); //使用字符串来表示相对位置 TweenLite.to( mc, 1, { y: "-100" } ); |
0 1 2 3 4 |
TweenMax.to( btn1, 1, { alpha:0, y:"100", delay:0 } ); TweenMax.to( btn2, 1, { alpha:0, y:"100", delay:0.1 } ); TweenMax.to( btn3, 1, { alpha:0, y:"100", delay:0.2 } ); //上面三句代码和下面的一句代码是等效的 TweenMax.allTo([btn1, btn2, btn3], 1, {alpha:0, y:"100"}, 0.1); |
