因项目需要,需要学习和利用Flash的ActionScript完成项目的技术点。需要对ActionScript3语言进行系统学习和总结。
官方ActionScript文档地址:http://help.adobe.com/zh_CN/as3/learn/index.html
1.ActionScript概述
1.1 ActionScript基础
ActionScript在虚拟机(AVM)中执行,而FlashPlayer及AIR中包含虚拟机AVM,在Flash Professional/Flash Builder中的编译器将AS编译成字节代码,嵌入在swf文件中
1.2 ActionScript3.0新增功能
核心语言功能(语句,表达式,条件,循环,类型)、运行时异常、运行时类型、密封类、闭包方法、xml操作的E4X语言特性、正则表达式、命名空间、新基元类型
1.3 API功能
DOM3事情模型,显示列表API,处理动态数据和内容(Loader类加载并访问swf文件和图像资源,URLLoader加载文本与二进制数据,Socket类从/向服务器套接字中读写二进制),低级数据访问(URLStream/ByteArray/SoundChannel/SoundMixer),安全性API提供swf加载安全权限,使用文本flash.text包
1.4 开发工具
Flash Builder
Flash Professional
Adobe Dreamweaver CS4
ASDT (开源http://sourceforge.net/projects/aseclipseplugin/)
FDT
FlashDevelop (开源http://www.flashdevelop.org/)
PrimalScript
SE|PY
TextMate
1.5 在FlashProfessional中运行ActionScript3
在FlashProfessional中运行AS3示例
1.选择“文件”>“新建”。
2.在“新建文档”对话框中,选择“Flash 文档”,然后单击“确定”。
3.将显示一个新的 Flash 窗口。
4.在“时间轴”面板中,单击第一个图层的第一帧。
5.在“动作”面板中,键入或粘贴代码片断示例。
6.选择“文件”>“保存”。为文件指定一个名称,然后单击“确定”。
7.要测试该示例,请选择“控制”>“测试影片”。
在FlashProfessional中运行基于类的示例
1.选择“文件”>“新建”。
2.在“新建文档”对话框中,选择“ActionScript 文件”,然后单击“确定”。此时将显示一个新的编辑器窗口。
3.复制基于类的示例代码并将其粘贴到该编辑器窗口。
如果该类是程序的主文档类,则其必须扩展 MovieClip 类:
import flash.display.MovieClip;
public class Example1 extends MovieClip{ //...}
4.选择“文件”>“保存”。为文件指定一个与示例中的类相同的名称。
注:某些基于类的示例(如 flashx.textLayout.container.ContainerController 类示例)在包声明 (package flashx.textLayout.container.examples {) 中包含多个级别。对于这些示例,将文件保存在与包声明 (flashx/textLayout/container/examples) 匹配的子文件中,或删除包名称(以便 ActionScript 仅以 package { 开头),则可以从任意位置测试该文件。
5.选择“文件”>“新建”。
6.在“新建文档”对话框中,选择“Flash 文档 (ActionScript 3.0)”,然后单击“确定”。将显示一个新的 Flash 窗口。
7.在“属性”面板中的“文档类”字段中,输入示例类的名称,此名称应与刚刚保存的 ActionScript 源文件的名称相匹配(例如 ContextMenuExample)。
8.选择“文件”>“保存”。为 FLA 文件指定一个与示例中的类相同的名称。
9.要测试该示例,请选择“控制”>“测试影片”。
2.语法基础
2.1 类和对象
面向对象的编程中,程序指令分布在不同对象中,代码被编组为功能区块,相关的功能类型或信息被编组到一个容器中。属性,方法,事件为类型的三个特征。所有的类(内置+自定义)都是从Object类派生。
//无类型变量,以下等同 var someObj:*; //包含Object和undefined var someObj;
定义类:
package mypackage { public class MyClass { //定义属性 public var textProperty:String = "some default value"; public var numericProperty:Number = 17; public var dateProperty:Date; //定义构造函数 public function MyClass() { // do stuff to set initial values for properties // and otherwise set up the object textVariable = "Hello there!"; dateVariable = new Date(2001, 5, 11); } //定义方法 public function myMethod(param1:String, param2:Number):void { // do something with parameters } } }
可以通过dynamic关键字来创建动态类。动态类实例化后可以类定义的外部向其添加属性和方法。
dynamic class Protean { private var privateGreeting:String = "hi"; public var publicGreeting:String = "hello"; function Protean() { trace("Protean instance created"); } } var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; trace(myProtean.aString, myProtean.aNumber); // testing 3
//创建对象 //文本数字值(直接输入数字): var someNumber:Number = 17.239; var someNegativeInteger:int = -53; var someUint:uint = 22; //文本字符串值(用双引号将本文引起来): var firstName:String = "George"; var soliloquy:String = "To be or not to be, that is the question..."; //文本布尔值(使用字面值 true 或 false): var niceWeather:Boolean = true; var playingOutside:Boolean = false; //文本数组值(在中括号中包含以逗号分隔的值列表): var seasons:Array = ["spring", "summer", "autumn", "winter"]; //文本 XML 值(直接输入 XML): var employee:XML = <employee> <firstName>Harold</firstName> <lastName>Webster</lastName> </employee>;
2.2 包和命名空间
包:通过有利于共享代码并尽可能减少命名冲突的方式将多个类定义捆绑在一起.
命名空间:命名空间可用于管理各个属性和方法的可见性,将public,private,protected,internal视为内置的命名空间,未定义命名空间默认用internal限定。
//导入包 import samples.*; import samples.SampleCode; var mySample:samples.SampleCode = new samples.SampleCode(); //完全限定名称 var mySample:SampleCode = new SampleCode(); // //定义命名空间 namespace flash_proxy = "http://www.adobe.com/flash/proxy"; namespace flash_proxy; package flash.utils { namespace flash_proxy; //仅包类可见 } package flash.utils { public namespace flash_proxy; } //定义命名空间 namespace example1; class someClass { example1 myFunction() {} } //引用命名空间 use namespace example1; myFunction();
2.3 变量常量
//AS中变量定义 var 变量名称:数据类型 = 实际值; var varName:Type = value; var a:int, b:int, c:int; var a:int = 10, b:int = 20, c:int = 30; //FlashProfessional中变量定义 //舞台中影片剪辑元件、按钮元件或文本字段在属性检查器中指定实例名称,flash会在后台创建同名的变量,AS中可使用该名称表示舞台项 //常量定义 const TEL:Number = 13900112200;
变量默认值
2.4 数据类型
基础数据类型
String:文本值
Numeric:数字型数据,包括以下3种特定类型。
Boolean:true/false.
Null:仅包含null值,String及复杂数据类型的默认值
void:仅包含undefined值,无类型变量值或者返回类型注释
复杂数据类型
MovieClip:影片剪辑元件
TextField:动态文本字段或输入文本字段
SimpleButton:按钮元件
Date:有关时间中的某个片刻的信息(日期和时间)
…
is运算符
用来测试变量或表达式是否为给定数据类型的成员,代替早期版本的instanceof运算符。is运算符检查正确的继承层次,检查对象是否为特定类的实例,还可检查对象是否是为特定接口实现实例。
as运算符
as运算符也可用来检查表达式是否为给定数据类型的成员,但是它不像is一样返回布尔值,而是返回表达式的值。
类型转换
显示转换:小括号括起对象名并在它前面加上新类型名称.
var myBoolean:Boolean = true; var myINT:int = int(myBoolean);
隐式转换:通过调用内部转换算法来处理的,该算法与显式转换函数所调用的算法相同
* 在赋值语句中
* 在将值作为函数的参数传递时
* 在从函数中返回值时
* 在使用某些运算符(如加法运算符 (+))的表达式中
可以将任何数据类型的值转换成int,uint,Number.某些原因不能转换数值,则会将默认值 0 赋给 int 和 uint 数据类型,将默认值NaN 赋给 Number 数据类型。如果将布尔值转换为数字,则true 变成值 1,false 变成值 0。
仅包含数字的字符串值可以成功地转换为数字类型之一,转换过程中会忽略字符串值中的前导或尾随空白字符
2.4 ActionScript语法
区分大小写
点语法:点运算符 (.) 提供对对象的属性和方法的访问
分号:分号字符 (;) 来终止语句
注释:// 单行注释 /* */ 多行注释
关键字:
将来有可能会成为关键字的保留标识符
2.5 运算符
主运算符
一元运算符
按位移位运算符
关系运算符
等于运算符
2.6 流控制
* if()…else..
* if()…else if()…else..
* switch(){ case v1: break; default: break;}
2.7 循环
* for
* for..in
* for each..in
* while
* do..while
var i:int; for (i = 0; i < 5; i++) { trace(i); } var myObj:Object = {x:20, y:30}; for (var i:String in myObj) { trace(i + ": " + myObj[i]); } var myObj:Object = {x:20, y:30}; for each (var num in myObj) { trace(num); } //循环访问 XML 或 XMLList 对象 var myXML:XML = <users> <fname>Jane</fname> <fname>Susan</fname> <fname>John</fname> </users>; for each (var item in myXML.fname) { trace(item); } var i:int = 0; while (i < 5) { trace(i); i++; } var i:int = 5; do { trace(i); i++; } while (i < 5);
2.8 函数
//函数语句 function traceParameter(aParam:String) { trace(aParam); } traceParameter("hello"); // hello //函数表达式 var traceParameter:Function = function (aParam:String) { trace(aParam); }; traceParameter("hello"); // hello //函数返回值 function doubleNum(baseNum:int):int { trace("after return"); } //嵌套函数 function getNameAndVersion():String { function getVersion():String { return "10"; } function getProductName():String { return "Flash Player"; } return (getProductName() + " " + getVersion()); } trace(getNameAndVersion()); // Flash Player 10 //默认参数值 function defaultValues(x:int, y:int = 3, z:int = 5):void { trace(x, y, z); } defaultValues(1); // 1 3 5
arguments 对象
在将参数传递给某个函数时,可以使用 arguments 对象来访问有关传递给该函数的参数的信息。
arguments 对象是一个数组,其中包括传递给函数的所有参数。
arguments.length 属性报告传递给函数的参数数量。
arguments.callee 属性提供对函数本身的引用,这对于递归调用函数表达式很有用
函数调用中所包括的参数的数量可以大于在函数定义中所定义的参数数量,但是,如果参数的数量与必需参数(以及可选情况下的任何可选参数)的数量不匹配,则在严格模式下会生成编译器错误,使用arguments 对象的数组样式来访问传递给函数的任何参数,而无需考虑是否在函数定义中定义了该参数.
//使用 arguments 数组及 arguments.length 属性来跟踪传递给 traceArgArray() 函数的所有参数 function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // output: // 1 // 2 // 3
arguments.callee属性通常用在匿名函数中以创建递归,提供代码灵活性。
var factorial:Function = function (x:uint) { if(x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } } trace(factorial(5)); // 120
... (rest) 参数
此参数可用来指定一个数组参数以接受任意多个以逗号分隔的参数。参数可以拥有保留字以外的任意名称。此参数声明必须是最后一个指定的参数。使用此参数会使arguments对象不可用。尽管 ... (rest) 参数提供了与arguments数组和arguments.length属性相同的功能,但是未提供与由arguments.callee提供的功能类似的功能。使用 ...(rest) 参数之前,应确保不需要使用arguments.callee。
function traceArgArray(x: int, ... args) { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // output: // 2 // 3
函数作为对象
ActionScript 3.0 中的函数是对象。当您创建函数时,就是在创建对象,该对象不仅可以作为参数传递给另一个函数,而且还可以有附加的属性和方法。作为参数传递给另一个函数的函数是按引用(而不是按值)传递的。在将某个函数作为参数传递时,只能使用标识符,而不能使用在调用方法时所用的小括号运算符。
addEventListener(MouseEvent.CLICK, clickListener);
函数可以像其他任何对象那样具有属性和方法。每个函数都有一个名为length的只读属性,它用来存储为该函数定义的参数数量。该属性与arguments.length属性不同,后者报告发送给函数的参数数量。
function traceLength(x:uint, y:uint):void { trace("arguments received: " + arguments.length); trace("arguments expected: " + traceLength.length); } traceLength(3, 5, 7, 11); /* output: arguments received: 4 arguments expected: 2 */
函数作用域
在全局作用域中声明的函数在整个代码中都可用,嵌套函数可以在声明它的函数中的任意位置上使用。
作用域链:无论何时开始执行函数,都会创建许多对象和属性。首先,会创建一个称为激活对象的特殊对象,该对象用于存储在函数体内声明的参数以及任何局部变量或函数。由于激活对象属于内部机制,因此您无法直接访问它。接着,会创建一个作用域链,其中包含由运行时检查标识符声明的对象的有序列表。所执行的每个函数都有一个存储在内部属性中的作用域链。对于嵌套函数,作用域链始于其自己的激活对象,后跟其父函数的激活对象。作用域链以这种方式延伸,直到到达全局对象。全局对象是在 AS程序开始时创建的,其中包含所有的全局变量和函数。
函数闭包:函数闭包是一个对象,其中包含函数的快照及其词汇环境。函数的词汇环境包括函数作用域链中的所有变量、属性、方法和对象以及它们的值。无论何时在对象或类之外的位置执行函数,都会创建函数闭包。函数闭包保留定义它们的作用域.
2.9 语句、关键字、指令
语句 | |
---|---|
break | 出现在循环(for 、for..in 、for each..in 、do..while 或 while )内,或出现在与 switch 语句中的特定情况相关联的语句块中。 |
case | 定义 switch 语句的跳转目标。 |
continue | 跳过最内层循环中所有其余的语句并开始循环的下一次遍历,就像控制正常传递到了循环结尾一样。 |
default | 定义 switch 语句的默认情况。 |
do..while | 与 while 循环类似,不同之处是在对条件进行初始计算前执行一次语句。 |
else | 指定当 if 语句中的条件返回 false 时要运行的语句。 |
for | 计算一次 init (初始化)表达式,然后开始一个循环序列。 |
for..in | 遍历对象的动态属性或数组中的元素,并对每个属性或元素执行 statement 。 |
for each..in | 遍历集合的项目,并对每个项目执行 statement 。 |
if | 计算条件以确定下一条要执行的语句。 |
label | 将语句与可由 break 或 continue 引用的标识符相关联。 |
return | 导致立即返回执行调用函数。 |
super | 调用方法或构造函数的超类或父版本。 |
switch | 根据表达式的值,使控制转移到多条语句的其中一条。 |
throw | 生成或引发一个可由 catch 代码块处理或捕获的错误。 |
try..catch..finally | 包含一个代码块,在其中可能会发生错误,然后对该错误进行响应。 |
while | 计算一个条件,如果该条件的计算结果为 true ,则会执行一条或多条语句,之后循环会返回并再次计算条件。 |
with | 建立要用于执行一条或多条语句的默认对象,从而潜在地减少需要编写的代码量。 |
命名空间 | |
AS3 | 定义核心 ActionScript 类的方法和属性,将其作为固定属性而非原型属性。 |
flash_proxy | 定义 Proxy 类的方法。 |
object_proxy | 定义 ObjectProxy 类的方法。 |
主要表达式关键字 | |
false | 表示 false 的布尔值。 |
null | 一个可以分配给变量的或由未提供数据的函数返回的特殊值。 |
this | 对方法的包含对象的引用。 |
true | 表示 true 的布尔值。 |
定义关键字 | |
... (rest) parameter | 指定函数将接受任意多个以逗号分隔的参数。 |
class | 定义一个类,它允许实例化共享您定义的方法和属性的对象。 |
const | 指定一个常量,它是只能赋值一次的变量。 |
extends | 定义一个类以作为其他类的子类。 |
function | 包含为执行特定任务而定义的一组语句。 |
get | 定义一个 getter,它是一种可像属性一样读取的方法。 |
implements | 指定一个类可实现一个或多个接口。 |
interface | 定义接口。 |
namespace | 允许您控制定义的可见性。 |
package | 允许您将代码组织为可由其他脚本导入的离散组。 |
set | 定义一个 setter,它是一种在 public 接口中作为属性出现的方法。 |
var | 指定一个变量。 |
属性关键字 | |
dynamic | 指定类的实例可具有在运行时添加的动态属性。 |
final | 指定不能覆盖方法或者不能扩展类。 |
internal | 指定类、变量、常量或函数可用于同一包中的任何调用者。 |
native | 指定函数或方法由 Flash Player 以本机代码的形式实现。 |
override | 指定用一种方法替换继承的方法。 |
private | 指定变量、常量、方法或命名空间仅可供定义它的类使用。 |
protected | 指定变量、常量、方法或命名空间只可用于定义它的类及该类的任何子类。 |
public | 指定类、变量、常量或方法可用于任何调用者。 |
static | 指定变量、常量或方法属于类,而不属于类的实例。 |
指令 | |
default xml namespace | default xml namespace 指令可将默认的命名空间设置为用于 XML 对象。 |
import | 使外部定义的类和包可用于您的代码。 |
include | 包括指定文件的内容,就像该文件中的命令是调用脚本的一部分一样。 |
use namespace | 使指定的命名空间添加到打开的命名空间集中。 |
* with
with
语句使用范围链解析标识符,statement中用到的属性,变量,函数为object参数中对象的属性,变量,函数。写代码时可以省略"object."
with (object:Object) {
// statement(s)
}
var a:Number, x:Number, y:Number; with (Math) { a = PI * pow(r, 2); x = r * cos(PI); y = r * sin(PI / 2); } trace("area = " + a); trace("x = " + x); trace("y = " + y);
* dynamic
指定类的实例可具有在运行时添加的动态属性。
* include
include "[path]filename.as"
包括指定文件的内容,就像该文件中的命令是调用脚本的一部分一样。include 指令在编译时调用。因此,如果对包含的文件进行了任何更改,则必须保存该文件,并重新编译使用它的任何 SWF 文件。
3. 面向对象编程
子类访问父类引用的属性和方法可以用super来访问,访问本身用this访问。