用这篇文章来专门收集一些ActionScript不为人知,抑或是不常见的一些技巧或问题。希望对大家有所帮助!
这些技巧包括我的分析所得和网上收集。如有不正确或冒犯之处,还请指出。
这篇文章本人亦会不断更新和修正
在世纪流年blog看到有这样的文章,转过来,自己以后也慢慢添加,作为笔记吧~!
1. TextFormat.URL
很多人都知道使用textField.htmlText来写超文本的方式,可是似乎很少人知道其实我们还可以使用TextFormat.URL来定义。
1 : myFormat = new TextFormat();
2 : myFormat.url = "http://www.liu21st.com";
3 : my_txt.html = true; //这是必须的
4 : my_txt.htmlText = "世纪流年";
5 : my_txt.setTextFormat(myFormat);
2. 使用javascript方法
通常trace方法的浏览器替代方法可以使用
1 : function debug(info){
2 : getUrl("j avascript:alert('" + info + "')");
3 : }
如果使用超文本链接的话,可以直接使用
my_txt.html = true;
my_txt.htmlText = "<a href=j avascript:alert('欢迎光临世纪流年!')>世纪流年</a>";
3. 复制数组
如果使用下面的复制数组的方法只是一个指向,并没有形成真正的拷贝。
1 : b_array = a_array;
2 : //当a_array数组内容改变的时候,b_array的内容也随之改变了
3 : //解决方法可以使用下面的方式
4 : b_array = a_array.slice();
4. 卸载拖入舞台的MC
我们知道只有动态创建的mc才可以使用removeMovieClip()方法来卸载,帮助中对removeMovieClip方法的说明如下:
引用:
--------------------------------------------------------------------------------
删除用 duplicateMovieClip()、MovieClip.duplicateMovieClip() 或
MovieClip.attachMovie() 创建的影片剪辑实例。
--------------------------------------------------------------------------------
下面的技巧可以让我们随心所欲的卸载你需要的MC,即使是你拖入舞台的组件等。
1 : My_mc.swapDepths(100);//把mc的深度值设定为大于0的值
2 : My_mc.removeMovieClip();//这样就可以正常卸载mc了
是不是很有用哦。
PS:使用my_mc.unloadMovie() 以可以删除mc实例,但是却保留了实例属性和剪辑处理函数。用removeMovieClip() 可以删除实例(包括其属性和剪辑处理函数)。
Update:flash中只能用removeMovieClip()删除0 到 1048575 深度的MC,所以swapDepths()方法的数值必须是在0 到 1048575 之间(包含0 和 1048575 )。
5. 魔法深度值–16384
我们知道Flash中的元素使用深度的概念,所有创作中的元素都从 -16383 开始,所以如果我们要让某个元素显示在最底层的话,可以把深度设定为魔法深度值。
其中原因我们不妨深究下:
原来Macromedia's mx.managers.DepthManager 类中定义了下面的值:
1 : // highest allowed depth is reserved for tooltips and cursors
2 : static var reservedDepth:Number = 1048575;
3 : // highest depth for all other objects
4 : static var highestDepth:Number = 1048574;
5 : // lowest allowed depth
6 : static var lowestDepth:Number = -16383;
7 : // lowest depth plus this number of layers is reserved
8 : // for statically placed content
9 : static var numberOfAuthortimeLayers:Number = 383;
这下就应该明白个中原因了吧~
6. 检测播放版本和系统信息
有三种方法来检测:
1. 使用getVersion方法
2. 使用$version 变量
3. 使用System.capabilities.version属性
PS:System.capabilities.os 可以获取本机的操作系统
7. 取消TextArea组件中鼠标滚动文本
要取消通过鼠标滚动文本的方法添加下面代码
1 : componentInstance.label.mouseWheelEnabled = false;
2 : Mouse.removeListener(_global.__SVMouseWheelManager);
TextField也可以使用类似的方法,把第一行代码该为:
1 : my_txt.mouseWheelEnabled = false;
8. 设置TextArea组件的滚动条到底部
我们知道textField使用scroll属性设定滚动位置,但是TextArea组件使用vPosition属性来设置垂直滚动位置,下面的代码使得滚动条处于文本区域的底部:
1 : myTextArea.vPosition = myTextArea.maxVPosition;
9. 对影片剪辑采用手行光标显示
当鼠标滑过任何MC或按钮时设置显示手形光标
方法:
1 : my_mc.useHandCursor = true;
10. 设置SWF 文件在播放器或浏览器中的当前对齐方式
通过设置Stage.align属性
01 : Stage.align="TL";//设置为居顶左侧
02 : //更多的属性有
03 : "T" 顶部 中间
04 : "B" 底部 中间
05 : "L" 中间 左侧
06 : "R" 中间 右侧
07 : "TL" 顶部 左侧
08 : "TR" 顶部 右侧
09 : "BL" 底部 左侧
10 : "BR" 底部 右侧
11. 提高程序运行效率的一些方法
良好的编程习惯和技巧可以提高程序的运行效率
(1). 避免在循环中存取定值
以简单的loading脚本为例
01 : //第1种写法
02 : _root.onEnterFrame = function () {
03 : bt = _root.getBytesTotal();
04 : bl = _root.getBytesLoaded();
05 : if (bt == bl) {
06 : gotoAndPlay(2);
07 : }
08 : }
09 :
10 : //第2中写法:
11 : bt = _root.getBytesTotal();
12 : _root.onEnterFrame = function () {
13 : bl = _root.getBytesLoaded();
14 : if (bt == bl) {
15 : gotoAndPlay(2);
16 : }
17 : }
显然第2种方法具有更好的效率,因为getBytesTotal是个不变的值,不需要每次重新调用。
(2) 注意变量的范围
1 : var var1 = "value"; //第1中定义方式:本地变量
2 : var2 = "value"; //第2中定义方式:
3 : _global.var3 = "value"; //第3中定义方式:全局变量
第1中变量定义方式是效率最高的,变量的作用完成后会自动清理。如果需要变量在函数或事件中(如onEnterFrame)继续有效,可以使用第2种方式。效率最低的是第3种方式,应该尽量避免这样使用。
(3) 使用太多的函数也会使得程序的性能降低
因为每次调用函数,Flash都会保存所有的变量,然后再执行函数。执行完毕后,又会返回全部变量并继续开始的脚本,这会有时间开销,尤其是在循环中。但是,使用函数是个好习惯,因为它增强可读性和脚本的易用性。
使用类的方式类似于函数,都需要注意。最好的方法是我们自己在编程的时候调试运行时间来寻找最优方式。测试程序执行效率的最简单方式,可以通过循环和getTimer() 方法来测试,下面是一个简单的脚本效率测试。
1 : startTimer = getTimer();
2 : testvar = 0;
3 : for (var t=0; t!=10000; t++) {
4 : testvar++;
5 : }
6 : trace(getTimer()-startTimer);
这些技巧包括我的分析所得和网上收集。如有不正确或冒犯之处,还请指出。
这篇文章本人亦会不断更新和修正
在世纪流年blog看到有这样的文章,转过来,自己以后也慢慢添加,作为笔记吧~!
1. TextFormat.URL
很多人都知道使用textField.htmlText来写超文本的方式,可是似乎很少人知道其实我们还可以使用TextFormat.URL来定义。
1 : myFormat = new TextFormat();
2 : myFormat.url = "http://www.liu21st.com";
3 : my_txt.html = true; //这是必须的
4 : my_txt.htmlText = "世纪流年";
5 : my_txt.setTextFormat(myFormat);
2. 使用javascript方法
通常trace方法的浏览器替代方法可以使用
1 : function debug(info){
2 : getUrl("j avascript:alert('" + info + "')");
3 : }
如果使用超文本链接的话,可以直接使用
my_txt.html = true;
my_txt.htmlText = "<a href=j avascript:alert('欢迎光临世纪流年!')>世纪流年</a>";
3. 复制数组
如果使用下面的复制数组的方法只是一个指向,并没有形成真正的拷贝。
1 : b_array = a_array;
2 : //当a_array数组内容改变的时候,b_array的内容也随之改变了
3 : //解决方法可以使用下面的方式
4 : b_array = a_array.slice();
4. 卸载拖入舞台的MC
我们知道只有动态创建的mc才可以使用removeMovieClip()方法来卸载,帮助中对removeMovieClip方法的说明如下:
引用:
--------------------------------------------------------------------------------
删除用 duplicateMovieClip()、MovieClip.duplicateMovieClip() 或
MovieClip.attachMovie() 创建的影片剪辑实例。
--------------------------------------------------------------------------------
下面的技巧可以让我们随心所欲的卸载你需要的MC,即使是你拖入舞台的组件等。
1 : My_mc.swapDepths(100);//把mc的深度值设定为大于0的值
2 : My_mc.removeMovieClip();//这样就可以正常卸载mc了
是不是很有用哦。
PS:使用my_mc.unloadMovie() 以可以删除mc实例,但是却保留了实例属性和剪辑处理函数。用removeMovieClip() 可以删除实例(包括其属性和剪辑处理函数)。
Update:flash中只能用removeMovieClip()删除0 到 1048575 深度的MC,所以swapDepths()方法的数值必须是在0 到 1048575 之间(包含0 和 1048575 )。
5. 魔法深度值–16384
我们知道Flash中的元素使用深度的概念,所有创作中的元素都从 -16383 开始,所以如果我们要让某个元素显示在最底层的话,可以把深度设定为魔法深度值。
其中原因我们不妨深究下:
原来Macromedia's mx.managers.DepthManager 类中定义了下面的值:
1 : // highest allowed depth is reserved for tooltips and cursors
2 : static var reservedDepth:Number = 1048575;
3 : // highest depth for all other objects
4 : static var highestDepth:Number = 1048574;
5 : // lowest allowed depth
6 : static var lowestDepth:Number = -16383;
7 : // lowest depth plus this number of layers is reserved
8 : // for statically placed content
9 : static var numberOfAuthortimeLayers:Number = 383;
这下就应该明白个中原因了吧~
6. 检测播放版本和系统信息
有三种方法来检测:
1. 使用getVersion方法
2. 使用$version 变量
3. 使用System.capabilities.version属性
PS:System.capabilities.os 可以获取本机的操作系统
7. 取消TextArea组件中鼠标滚动文本
要取消通过鼠标滚动文本的方法添加下面代码
1 : componentInstance.label.mouseWheelEnabled = false;
2 : Mouse.removeListener(_global.__SVMouseWheelManager);
TextField也可以使用类似的方法,把第一行代码该为:
1 : my_txt.mouseWheelEnabled = false;
8. 设置TextArea组件的滚动条到底部
我们知道textField使用scroll属性设定滚动位置,但是TextArea组件使用vPosition属性来设置垂直滚动位置,下面的代码使得滚动条处于文本区域的底部:
1 : myTextArea.vPosition = myTextArea.maxVPosition;
9. 对影片剪辑采用手行光标显示
当鼠标滑过任何MC或按钮时设置显示手形光标
方法:
1 : my_mc.useHandCursor = true;
10. 设置SWF 文件在播放器或浏览器中的当前对齐方式
通过设置Stage.align属性
01 : Stage.align="TL";//设置为居顶左侧
02 : //更多的属性有
03 : "T" 顶部 中间
04 : "B" 底部 中间
05 : "L" 中间 左侧
06 : "R" 中间 右侧
07 : "TL" 顶部 左侧
08 : "TR" 顶部 右侧
09 : "BL" 底部 左侧
10 : "BR" 底部 右侧
11. 提高程序运行效率的一些方法
良好的编程习惯和技巧可以提高程序的运行效率
(1). 避免在循环中存取定值
以简单的loading脚本为例
01 : //第1种写法
02 : _root.onEnterFrame = function () {
03 : bt = _root.getBytesTotal();
04 : bl = _root.getBytesLoaded();
05 : if (bt == bl) {
06 : gotoAndPlay(2);
07 : }
08 : }
09 :
10 : //第2中写法:
11 : bt = _root.getBytesTotal();
12 : _root.onEnterFrame = function () {
13 : bl = _root.getBytesLoaded();
14 : if (bt == bl) {
15 : gotoAndPlay(2);
16 : }
17 : }
显然第2种方法具有更好的效率,因为getBytesTotal是个不变的值,不需要每次重新调用。
(2) 注意变量的范围
1 : var var1 = "value"; //第1中定义方式:本地变量
2 : var2 = "value"; //第2中定义方式:
3 : _global.var3 = "value"; //第3中定义方式:全局变量
第1中变量定义方式是效率最高的,变量的作用完成后会自动清理。如果需要变量在函数或事件中(如onEnterFrame)继续有效,可以使用第2种方式。效率最低的是第3种方式,应该尽量避免这样使用。
(3) 使用太多的函数也会使得程序的性能降低
因为每次调用函数,Flash都会保存所有的变量,然后再执行函数。执行完毕后,又会返回全部变量并继续开始的脚本,这会有时间开销,尤其是在循环中。但是,使用函数是个好习惯,因为它增强可读性和脚本的易用性。
使用类的方式类似于函数,都需要注意。最好的方法是我们自己在编程的时候调试运行时间来寻找最优方式。测试程序执行效率的最简单方式,可以通过循环和getTimer() 方法来测试,下面是一个简单的脚本效率测试。
1 : startTimer = getTimer();
2 : testvar = 0;
3 : for (var t=0; t!=10000; t++) {
4 : testvar++;
5 : }
6 : trace(getTimer()-startTimer);
回复Comments
作者:
{commentrecontent}