actionscript 3.0
基於ECMAScript的編程語言
ActionScript 3.0 是一種強大的面向對象編程語言,它標誌著 Flash Player Runtime 演化過程中的一個重要階段。設計 ActionScript 3.0 的意圖是創建一種適合快速地構建效果豐富的網際網路應用程序的語言,這種應用程序已經成為 Web 體驗的重要部分。
ActionScript 是一種基於 ECMAScript 的編程語言,用來編寫 Adobe Flash 電影和應用程序。ActionScript 1.0 最初隨 Flash 5 一起發布,這是第一個完全可編程的版本。Flash 6 增加了幾個內置函數,允許通過程序更好地控制動畫元素。在 Flash 7 中引入了 ActionScript 2.0,這是一種強類型的語言,支持基於類的編程特性,比如繼承、介面和嚴格的數據類型。Flash 8 進一步擴展了 ActionScript 2,添加了新的類庫以及用於在運行時控制點陣圖數據和文件上傳的 API。Flash Player 中內置的 ActionScript Virtual Machine(AVM1)執行 ActionScript。通過使用新的虛擬機ActionScript Virtual Machine(AVM2),Flash 9(附帶 ActionScript 3)大大提高了性能。
ActionScript 的老版本(ActionScript 1.0 和 2.0)提供了創建效果豐富的 Web應用程序所需的功能和靈活性。ActionScript 3 現在為基於 Web 的應用程序提供了更多的可能性。它進一步增強了這種語言,提供了出色的性能,簡化了開發的過程,因此更適合高度複雜的 Web應用程序和大數據集。ActionScript 3 可以為以 Flash Player 為目標的內容和應用程序提供高性能和開發效率。
ActionScript 3 符合 ECMAScript Language Specification 第三版。它還包含基於 ECMAScript Edition 4 的功能,比如類、包和名稱空間;可選的靜態類型;生成器和迭代器;以及非結構化賦值(destructuring assignments)。隨著 Web應用程序項目需求的增長,也要求 ActionScript 引擎有重大的突破。ActionScript 3 引入了一個新的高度優化的 ActionScript Virtual Machine(AVM2),與 AVM1 相比,AVM2 的性能有了顯著的提高。這使 ActionScript 3 代碼的執行速度幾乎比以前的 ActionScript 代碼快了 10 倍。Flash Player 9 中包含 AVM2(ActionScript 3.0 的腳本語言引擎),設計它的目的是提供網際網路應用程序開發人員所需的性能和特性。為了向後兼容現有的內容,Flash Player 將繼續支持 AVM1。
有許多產品都生成以 Flash Player Runtime 為目標的內容和應用程序,包括 YouTube、Flickr、SWiSH 和 ScreenTime。這些產品能夠利用 ActionScript 在自己的輸出中添加交互和行為。在 Adobe 產品系列中,專業設計人員可以在幾種工具和伺服器中使用 ActionScript,比如Air、 Flash、Flex 和 Flash Media Server,從而為 Flash Player Runtime 創建內容和應用程序。Flex 產品系列(包括基於 Eclipse 的新的 Flex Builder 2 IDE)是第一個能夠使用 ActionScript 3.0 的新功能的產品系列。Adobe Air技術現在已經發展成為一種跨操作系統,跨平台的新型開發技術,在移動native app遊戲領域已經展露鋒芒。
從 ActionScript 3 的一般特性開始,我將討論一下目標、語言特性和 Flash Player API 特性。還要討論 ActionScript 3 中的新特性和不太為人所知的特性。在 2006 年 11 月 7 日,在舊金山召開的 WEB 2.0 會議上,Adobe Systems 宣布將 ActionScript Virtual Machine 的源代碼捐獻給 Mozilla Foundation。Mozilla 啟動了一個新的開放源碼項目 Tamarin,其目的是促進這種創建 Web應用程序的標準化方法的開發。
ActionScript 3 有兩類特性:語言特性和 Flash Player API 特性。語言特性基本上是在 ActionScript 2 之上構建的,但是還有一些性能和功能方面的改進,包括許多運行時異常,用來改進常見的錯誤處理和調試。這些運行時異常會顯示堆棧跟蹤,可以幫助開發人員輕鬆地找到錯誤的根源。以前的 ActionScript 版本會悄悄地掩蓋錯誤,以避免在 Flash 中出現錯誤消息對話框。這在開發期間會造成困難,因為開發人員不了解可能出現的錯誤,就無法開發出好產品。
在運行時存儲類型細節,用來進行檢查並保護系統,因此 ActionScript 3 是強類型的。這還有助於減少內存使用量,因為類型信息以本機機器表示法表示變數。
ActionScript 3 完全符合 ECMAScript 第四版規範,這可以簡化 XML 解析。
ActionScript 3 的 Flash Player API 特性包括:
DOM3 事件模型提供了生成和處理事件消息的標準方法,這有助於在對象之間進行更好的通信和交互。
新的 Loader 類提供了裝載 Shockwave Flash 和圖像的單一機制,並提供訪問關於被裝載內容的詳細信息的方法。URLLoader 類提供了在數據驅動應用程序中裝載文本和二進位數據的單獨機制。
Socket 類提供了以任何格式對伺服器套接字讀寫二進位數據的方法。
ActionScript 3.0 包含一個 flash.text 包,它提供與文本相關的所有 API。
Loader.loadBytes()
這個方法可以從二進位數據直接創建顯示列表中的條目。例如,在我的電子郵件客戶機上,如果從 Pop3 伺服器上下載的一個電子郵件包含附件,就檢查附件的 mime-type。如果這種類型是播放器支持的,那麼就可以將附件的二進位源代碼讀入 ByteArray,並在 Flash Player 中顯示這個附件。這意味著我的電子郵件客戶機可以顯示 PNG、JPEG、GIF 和 SWF 附件。
Sound.computeSpectrum()
這個方法分析播放的所有聲音並返回一個 ByteArray,其中包含 512 個歸一化的值(-1 到 1),可以使用它們顯示聲音波形(256 個值用於左聲道,256 個值用於右聲道)。可以使用這些值為 Media Players 創建 Audio Equalizers 以及對播放的聲音做出反應的視覺效果。
BitmapData.getPixels()
這個方法返回一個 ByteArray,其中包含點陣圖的指定矩形區域中每個像素的十六進位顏色值。可以將這個方法與新的 ZLib 壓縮方法 ByteArray.compress() 結合使用,從而將點陣圖壓縮,然後再發送給伺服器,這樣就能夠將它轉換為一個適合下載的文件。
Loader.close()
現在,可以停止播放器裝載外部媒體的過程。在過去,如果將一個圖像裝載進播放器,那麼在完成處理之前無法停止。現在可以這麼做了。
這個新版本具有以下優點:
這種語言支持類型安全性,使代碼維護更輕鬆。
與其他語言相比,這種語言比較簡單,容易編寫。
開發人員可以編寫具有高性能的響應性代碼。
這種語言向後兼容ActionScript 2 並向前兼容 ECMAScript for XML(E4X)。
在 2006 年 11 月 7 日,Adobe Systems 宣布將 ActionScript Virtual Machine 的代碼捐獻給 Mozilla Foundation。因此,Mozilla 啟動了一個新的開放源碼項目 Tamarin。Adobe 和 Mozilla 希望以此促進這種創建 Web 應用程序的標準化語言的推廣。
Tamarin 項目的目標是實現一個高性能的開放源碼的 ECMAScript 第四版(ES4)語言規範實現。Mozilla 在SpiderMonkey中使用 Tamarin Virtual Machine,SpiderMonkey 是 Firefox 和其他基於 Mozilla 的產品中嵌入的核心 JavaScript 引擎。Adobe 將繼續在 Adobe Flash Player 中的 ActionScript Virtual Machine 中使用這些代碼。
Tamarin Virtual Machine 當前實現 ECMAScript 第三版語言標準(這是 JavaScript、Adobe ActionScript 和 Microsoft Jscript 採用的標準),還支持 ES4 中建議的一些新語言特性。社區正在開發 ES4 的開放源碼實現,Adobe 和 Mozilla 希望以此促進這種創建 Web 應用程序的標準化語言的推廣。Tamarin 項目的目標是幫助開發人員創建可以跨多個平台的效果豐富的高度交互性的用戶體驗。
Tamarin 將支持 ECMAScript 第四版(或者說“JavaScript 2”)語言,並將集成進 Mozilla 2 項目中的SpiderMonkey,預期在 2008 年發布。
Mozilla 的開放源碼項目團隊剛剛開始開發 Tamarin,它的一些目標技術包括:
將 Tamarin VM 和垃圾收集器集成進SpiderMonkey中
使用 SpiderMonkey編譯器生成 Tamarin 的代碼
將即時編譯器移植到新的硬體平台
完成 ECMAScript 4編譯器
使用 ActionScript 3 的簡單示例
這個 ActionScript 示例顯示歡迎消息“Hello ”。用戶可以在文本框中輸入用戶名。按回車時,就會顯示歡迎消息。
清單 1. 示例代碼
package {
public class Greeter {
public static var validNames:Array = ["Sammy", "Frank", "Dean"];
public static function sayHello (userName:String = ""):String {
var greeting:String = "Hello World";
if (userName == ""){
greeting = "Hello, please type your name and then press the enter key";
}
else if(validName(userName)){
greeting = "Hello, " + userName + ".";
}
else {
greeting = "Sorry, " + userName + "Your name is not present in the list.";
}
return greeting;
}
public static function validName(inputName:String = ""):Boolean {
if validNames.indexOf(inputName) > -1 {
return true;
}
else {
return false;
}
}
}
}
圖 1 顯示清單 1 的初始窗口。它顯示最初的歡迎消息“Hello, please type your name and then press the enter key”,然後等待用戶在標籤為 User Name 的文本框中輸入用戶名。
圖 1. ActionScript 3 中的歡迎示例
當用戶在 User Name 框中輸入“Frank”時,腳本會在預定義的 validNames數組中尋找這個用戶名。因為“Frank”在 validNames數組中,所以在歡迎區域中會顯示“Hello Frank”,見圖 2。
圖 2. 用戶輸入用戶名
如果用戶輸入的用戶名不在 validNames數組中,例如“Anitha”,那麼顯示消息“Sorry, Anitha, your name is not present in the list”。
在下面,我提供了關於 ActionScript編程的出色的參考資料。還可以找到一個論壇的鏈接,使用 ActionScript 的開發人員在這裡直接回答任何問題。新的 ActionScript Virtual Machine 和 Flash Player 有許多令人興奮的改進,但是這超出了本文的範圍。如果您還沒有下載最新的 Flash Player 版本,就請下載它,體會一下它的眾多優點。
您可以參閱本文在 developerWorks 全球網站上的 英文原文。
如果希望參與 Tamarin 項目,那麼訪問 Mozilla Foundation 了解詳情並訂閱郵件列表。
了解關於 ECMAScript Fourth Edition Specification 的詳細信息。
尋找 ActionScript 3.0 Language Reference 的所有包。
下載 Flash Player 9。
下載 Flex 2 Builder 來進行 ActionScript 3.0 編程和 MXML 編程。
可以在 ActionScript 3 Forum 提出任何問題,您會很快得到答覆。
通過參與 developerWorks blog 加入 developerWorks 社區。
Anitha Ramaswamy 是在 Bangalore 的 IBM 印度軟體實驗室的 WebSphere Business Integration Adapters 團隊工作的軟體工程師。她的專業領域包括 Java™ 和 Java 2 Enterprise Edition(J2EE™)技術。她從事 OS/2® Presentation Manager 已經三年了。她還從事開放源碼 Tuscany 項目和印度軟體實驗室的EPCIS團隊的 RFIDIC 1.0 安裝程序開發項目。她擁有 Bangalore 的 Vishwesvaraya Technological University 的電子和通信學士學位。可以通過 聯繫 Anitha。
package{ //定義包名
import flash.display.Sprite; //導入外部包
public class DrawDemo extends Sprite //主類必須繼承Sprite或者MovieClip
{
public function DrawDemo() //構造函數
{
this.graphics.beginFill(0xff0000); //設置填充色
this.graphics.drawCircle(0,0,30); //畫一個圓(前兩個參數分別代表圓心(相對於父顯示對象註冊點
//的圓心的 x,y的位置(以像素為單位)。 )第三個代表圓的半徑(以像素為單位))
//設置圓在舞台上的位置
this.x=300;
this.y=300;
this.graphics.endFill();//結束繪畫
addChild(this);//所畫的內容添加到舞台上
}
}
}