因項目需要,需要學習和利用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種特定類型。
- Number:任何數值
- Int:整數
- Uint:無符號整數
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訪問。