ActionScript是 Macromedia(现已被Adobe收购)为其Flash产品开发的 ,最初是一种简单的脚本语言,现在最新版本3.0,是一种完全的面向对象的编程语言,功能强大,类库丰富,语法类似JavaScript,多用于Flash互动性、娱乐性、实用性开发,网页制作和RIA应用程序开发。
ActionScript 是一种基于ECMAScript的脚本语言,可用于编写Adobe Flash动画和应用程序。 由于ActionScript和JavaScript都是基于ECMAScript语法的,理论上它们互相可以很流畅地从一种语言翻译到另一种。不过JavaScript的文档对象模型(DOM)是以浏览器窗口,文档和表单为主的,ActionScript的文档对象模型(DOM)则以SWF格式动画为主,可包括动画,音频,文字和事件处理。
ActionScript第一次以它目前的语法出现是Flash 5版本,这也是第一个完全可对Flash编程的版本。这个版本被命名为ActionScript1.0。Flash 6通过增加大量的内置函数和对动画元素更好的编程控制更进一步增强了编程环境的功能。Flash 7(MX 2004)引进了ActionScript2.0,它增加了强类型(strong typing)和面向对象特征,如显式类声明, 继承,接口和严格数据类型。ActionScript1.0和2.0使用相同的编译形式编译成Flash SWF文件(即Shockwave Flash files,或 'Small Web Format').
时间表
Flash Player 2:第一个支持脚本的版本,包括控制时间轴的gotoAndPlay, gotoAndStop, nextFrame和nextScene等动作。
Flash Player 3:增强了载入外部SWF文件的基本脚本支持(loadMovie)。
Flash Player 4:第一个完全实现脚本功能(称为动作)的播放器。这些脚本拥有简练的语法和对循环,条件,变量和其它基本语言结构的支持。
Flash Player 5:第一个拥有真正意义上的ActionScript的版本。依据ECMAScript并采用基于原型编程,并允许完全的 过程式编程和面向对象编程。
Flash Player 6:增加了事件处理模型,并且支持switch。
Flash Player 7: Flash Player 7 提供一些新特性如支持CSS显示文本和增强显示效果。 Macromedia Flash编译器和Flash Player 7同时支持基于ECMAScript 4 Netscape Proposal的类编程语言ActionScript 2.0。不过ActionScript 2.0能交叉编译成ActionScript 1.0的字节码,因此它能运行于Flash Player 6。
Flash Player 8:增加用于运行时图象数据控制和文件上传的新类库及APIs,ActionScript 2.0功能更为完善。
Flash Player 8.5(计划于2006春发布release版本,currently in public beta):增加ActionScript 3.0和一个称为AVM2(ActionScript Virtual Machine 2)新的虚拟机,它可以与前版本AVM1共存以便支持旧内容。增强性能是该版本的主要目标。
Flash Player 9 2007发表,这是adobe收购Macromedia后的第一个版本,并且也是Mac OS X上第一个Universal版本的Flash Player。
Flash Player 10
语法
在ActionScript 2.0 类、与函式馆物件(如影片片段)可与类联系在一起。类总写在外在文件档案内,并且这些文件必须有.as后缀。类是增设部分──对ActionScrip语言来说,可让程式员自行开发,虽然有许多内建类譬如MovieClip类──可被用来动态地在屏幕上画出向量──已经满足需求了。类档案可用来使您编程更加容易,并且类档案如果需要的话可在许多专案间转移。
Flash ActionScript实现的特点如下,JavaScript程式员也许感兴趣:
一切设计是异步的;callback是普遍存在的,但事件对象不存在。
XML的实现从Flash 5便存在了。Flash可送和收XML,该项功能可用来透过网络服务器创造网上多玩者游戏。
ActionScript 代码常常直接写在Flash开发环境。该环境提供参考、代码提示和句法强调。原代码常常与电影一起存在.fla档案里。自外部文件档透过#include语法导入ActionScript代码也相当常见。在这种情况下,外部档案也许被Flash集成开发环境内建编译器,或Motion Twin ActionScript2编译器(MTASC)编译。参见外部链接。
评论
编程人员们说Macromedia ActionScript 2.0编译器有点慢,常常花好几分钟才编译100个类别,然而开放源码编译器MTASC可以利用;它快多了。
ActionScript非常宽大的语法常常让编程人员们皱眉,因为它常常让不干净代码难以阅读。
在Flash里使用许多向量图形可能拖慢执行许多应用程序的机器的效能,因为Flash每帧每帧重画每个向量图。Flash 8引进了cacheAsBitmap 变量,它暂时把向量图转换到位图,这种做法帮助降低了延滞。
Flash的ActionScript VM倾向在触发内部的暂停处理前就非常快达到它的运算极限,特别在麦金塔版的Flash播放器上更严重。例如,简单从1算到5000会威胁某些用户Flash播放器的能力。
在Flash 8里许多人不喜欢引入(import)某些类直到要用到那些类别前最后一刻。不幸的是,ActionScript 3.0相当倚赖引入类别,没有导入撰写脚本(scripting)实际上不太可能。
.swf档案格式挺容易反编译,使它非常难以保持源代码机密。
ActionScript 2.0 样本
下面打印Hello World。值得注意的是这只能在整合环境下执行,因为trace函式只有支援整合环境。
trace("Hello world!");
下面代码利用onMouseMove事件当鼠标移动时输出现行鼠标位置。同样的这只有在整合环境下执行。
onMouseMove = function () {
trace("X: "+_root._xmouse);
trace("Y: "+_root._ymouse);
};
这个较先进的范例创造一个包括数字与字串的阵列,并利用原形函式(prototype function)与函式递归给变量名num指定一个数,给变量str指定一个字串。然后,利用MovieClip应用程序接口,文字区域被显示在屏幕上,文字区域里头写入了变量值。
var my_Array:Array = new Array("Hello", "ActionScript", 3, 7, 11, "Flash");
Array.prototype.pickNumber = function():Number {
var rand:Number = random(this.length);
return (typeof (this[rand]) == "number") ? this[rand] : this.pickNumber();
};
Array.prototype.pickString = function():String {
var rand:Number = random(this.length);
return (typeof (this[rand]) == "string") ? this[rand] : this.pickString();
};
var num:Number = my_Array.pickNumber();
var str:String = my_Array.pickString();
_root.createTextField("txt", 1, 10, 10, 530, 390);
txt.text = "Array = "+my_Array+"\nRandom Number = "+num+"\nRandom String = "+str;
ActionScript 3.0 样本
下面先进的Hello World程序目前需要在Flex 2.0公开Alpha测试版整合环境中编译。
package {
import flash.text.TextField;
import flash.display.MovieClip;
import flash.filters.DropShadowFilter;
public class HelloWorld extends MovieClip {
public function HelloWorld() {
var shad:DropShadowFilter = new DropShadowFilter(2, 45, 0x000000, 25, 3, 3, 2, 2);
var txt:TextField = new TextField();
txt.textColor = 0xFFFFFF;
txt.filters = [shad];
txt.width = 120;
txt.x = Math.random()*300;
txt.y = Math.random()*300;
txt.selectable = false;
txt.text = "Hello World! ["+Math.round(txt.x)+","+Math.round(txt.y)+"]";
addChild(txt);
}
}
}
//-----ActionScript3.0----------------- //as3.0最重要的概念就是在效能方面的增进,平时所加入的任何事件都可以被监听或从内存中移除 //以下例子就是监听与移除内存占用,这是as3.0最重要的基础概念
bt1.addEventListener(MouseEvent.CLICK,bt1_click);
function bt1_click(e:MouseEvent):void{ //触发的事件内容; }
//该按纽监听不需要时则remove掉,增加效能 bt1.removeEventListener(MouseEvent.CLICK,bt1_click);