《ActionScript 3.0权威指南》阅读笔记
生活随笔
收集整理的這篇文章主要介紹了
《ActionScript 3.0权威指南》阅读笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第二章 ?配置開發環境
目前,主流的ActionScript 3.0開發環境分為Flash和Flex兩大類。前者是設計和開發一體的集成環境,后者是嚴肅的腳本開發平臺,更符合程序猿的析構。開發者應根據自己的習慣和項目的需要,靈活選擇。
Flash cS3建議選擇英文版,它也支持中文注釋和輸入。英文官方文檔較為準確,更新也很及時。
代碼的書寫和編輯是在代碼編輯器中進行的,使用F9快速打開或隱藏。使用代碼編輯器時,需要選擇舞臺元件。
Adobe FlexBuilder是Adobe官方支持的最完整的RIA開發解決方案,適應專業程序員的開發習慣。 使用Adobe FlexBuilder 2可以開發出功能強大,結構健壯,跨平臺的企業級應用程序,是一個相對耗費資源的開發環境。Java虛擬機運行環境總是對磁盤要求甚高。 FlexBuilder基于Java開發環境,在安裝之前需要先安裝配置好Java運行時環境。在FlexBuilder安裝包中提供的FlashPlayer可能不是最新的,請從官網下載更新。為了調試應用程序,需要安裝瀏覽器的FlashPlayer Debug版本插件。安裝完成后,應及時檢查瀏覽器的FlashPlayer是否是debug版本。
第三章
FlexBuilder是一個很優秀的代碼編寫工具,其提供的代碼提示要比Flash強大很多。使用FlexBuilder彈出的相關代碼提示窗口,可以快速而無錯的編寫代碼 工具欄中的綠色運行按鈕,快捷鍵Ctrl+F11,編譯并在瀏覽器中執行,不僅編譯了應用程序,還生成了相關的HTML文件,所以在瀏覽器中看到的是嵌入HTML文件的SWF應用。可以勾選自動編譯。
Flex程序有自己的規范和構成 與Flash不同,Adobe公司為Flex設計了一種新的文件結構:MXML。FlexBuilder的程序,一般都由三部分組成:MXML,ActionScript, Flex類庫。這三者本質上,依然是使用ActionScript 3.0實現的。 MXML主要為用戶界面組建布局,并記錄和存儲這些信息。負責記錄界面的布局信息。它是XML 1.0語言,由一系列標簽和標簽屬性組成。 數據塊標簽:<![CDATA[......]]> 塊注釋: <!--注釋部分--> 對于MXML應用程序,一般總有一個最外層的標簽<mx:Application>,Application標簽定義了一個應用程序,命名空間的命名一般都放在這里,mx是命名空間,內部的標簽都可以使用該命名空間 MXML組件文件,一般會有一個最外層的<mx:Canvas>,它是一個容器,包含HBox,VBox,x坐標,y坐標 標簽名稱以大寫字母開頭,標簽屬性以小寫字母開頭,都可以大小寫混合。屬性需要加上雙引號。 在MXML語言中,創建組件和調整組件屬性都非常簡單,形式如下 <mx:組件名稱 屬性1="數值"?屬性2="數值"?屬性3="數值"> Flex的組件種類更加全面,功能更加強大,是對Flash基礎類的整合和加強。 使用MXML構造用戶界面非常便捷,創建組件,改變組件外觀,移動組件位置,都簡化為操作相應的標簽和屬性。MXML設計目的之一就是令外觀樣式的設計和代碼的邏輯實現分析,也就是表現層和邏輯層的分離。利用這一特性,程序部門和美術部門可以同步工作,互不影響。一旦應用需求確定了,只需要快速地開發出“原型界面”,確定交互部分各組件的ID,程序部門就可以進行深入的開發和調試,而美術部門可以依據確定的組件ID,自由調整界面的布局和風格。
應用程序的邏輯是利用ActionScript 3.0來控制,它是Flex程序的靈魂。類庫是開發軟件自身提供的一些常用功能代碼的集合,Flex類庫是ActionScript 3.0編寫的,包含組件(容器和控件),管理器類,數據服務類和所有其它功能的類庫。 上述三者相結合,產生最終編譯得到的swf文件。一個應用程序對應一個swf文件
使用FlexBuilder的MXML構建"Hello World"應用程序 應用程序舞臺的左上角是坐標系的原點(0,0) 在屏幕上輸出文本 <mx:Text x="50" y="20" text="Hello World" id="mytxt">
用戶不僅能描述界面元素,還能包含腳本代碼 添加標簽事件響應 事件和響應,可以簡單理解為,條件和結果的關系 編譯器將MXML編譯為ActionScript,再將ActionScript編譯為二進制的SWF文件
ActionScript的內聯,級聯和外聯 <mx:Script source="/Hellofunc.as"></mx:Script>
FlexBuilder中的輔助設計模式,其實本質上就是MXML的可視化編輯器,都是以MXML記錄保存的。 MXML文件的設計模式只解釋MXML文件內部的可視化標簽,可以在設計模式下調整組件的屬性。 在代碼編輯器中打開.mxml文件,在Source和Design標簽之間切換, 在編譯包含眾多復雜控件標簽的項目時,編譯過程還會很長。較長的編譯過程,是swf文件執行效率提高的重要保證。
與更改代碼的程序員和更改設計視圖的設計人員合作,開發您的應用程序。 用戶界面開發者布局 UI、匯集 MXML 組件、提供某些輕邏輯,并可以在無需進行客戶端數據處理的情況下連接到后端數據源。
對于Flash CS3創建的默認空白項目,總是擁有一層layer和一幀frame。從某種程度上,Flash是利用幀保存腳本。在Flash CS3中,ActionScript 3.0要求所有的代碼都必須寫在幀上。寫在不同的位置,代碼的作用范圍也不同。 前面幀上的ActionScript無法訪問后續幀的ActionScript,但是后續幀上的ActionScript能訪問當前幀的所有ActionScript。代碼總是寫在當前激活的幀上。如果選中的幀不止一個,則代碼會寫在選中幀的第一幀。
trace()語句是調試語句,它的功能是將括號內的內容輸出到Flash IDE的調試輸出窗口中。 凡是指定了ID的舞臺元件,都可以使用ActionScript控制。舞臺元件有其特殊性,并不是代碼所在幀之前指定的舞臺元件都能訪問。如果在代碼所在幀的時間點上,該舞臺元件不存在,則代碼依然不能訪問。 操作動態舞臺對象的屬性使用,對象ID.屬性方式訪問。Flash中的坐標系以舞臺左上角為原點,y軸向下為正方向。 ActionScript要求,任何對象,只有加入到顯示列表中,才會被顯示在舞臺上。顯示列表是一個樹狀結構,最頂端的是舞臺對象stage。任何在舞臺上顯示的對象,在顯示列表中都是stage根節點的分支,使用addChild()將顯示對象加入顯示列表中。 stage.addChild() 簡化為?addChild()
第四章 語法基礎結構
ActionScript 3.0是一種基于ECMAScript ed4規范的腳本語言,其基本語法構成包括標識符,關鍵字,數據類型,運算符和分隔符。 這些有著特定含義的專有名稱叫做標識符。按照定義的場所,標識符分為兩類:語言內建標識符(變量,類,函數的名稱)和用戶自定義標識符。比如: decodeURIComponent(), gotoAndPlay() 掌握標識符的命名規則非常重要,包括如下幾點: (1)所有標識符大小寫敏感 (2)必須英文字母或者_開頭,數字等不能開頭 (3)標識符應由0-9,A-Z,a-z和_構成,不應使用其他特殊符號 (4)不能與ActionScript 3.0內建關鍵字沖突,參見附表 (5)考慮到代碼未來的復用性,盡量避免使用保留字,參見附表
命名約定 (1)保持自然語義,如totalNumber,FirstName (2)保持標識符的術語統一 (3)利用縮寫前綴,增強代碼可讀性 (4)規范利用大小寫,標識符主要使用小寫字符,但可以利用大小字母分割單詞,比如addLastNode(),在標識符中使用數字時,一般使用_將字母和數字區分開;常數可以全部大寫 (5)保持標識符首字母小寫,便于使用代碼輸入器自動補全 (6)避免長標識符,盡量10字符以內,照顧代碼編輯器的格式和編譯器的編譯速度 (7)避免相似名稱, (8)保持標識符的格式統一,比如last_field,current_field, first_field這些
關鍵字 按照功能不同,ActionScript 3.0中的關鍵字可以分為:表達式關鍵字,語句控制,屬性關鍵字,定義關鍵字,編譯指令,保留字 (1)表達式: false,true,null,this,Infinity -Infinity,NaN null不同于_undefined NaN 表示非數字 (2)語句控制 for,while,if,switch,throw,try,break, case, for...in 遍歷對象的動態屬性或是數組中的元素,并對每個屬性或是元素執行statement with 建立要用于執行一條或是多條語句的默認對象 (3)定義 最基礎最常用的是關鍵字var,用以指定一個變量 ...param 指定函數將接受任意多個以逗號分隔的參數 (4)屬性關鍵字,用于操作變量或者對象的訪問訪問 dynamic,final,internal,native,override,private,protected,public,static, (5)編譯指令 包括一組在編譯時起作用的關鍵字,主要是輔助ActionScript 3.0的編譯器,幫助編譯器正確的處理和分析代碼 defaultxmlnamespace ?指定默認的命名空間 usenamespace? import ?使外部類或是包可用于您的代碼 include 將過長的代碼文件分塊存儲,便于代碼的管理操作
區分:import和include是兩個功能完全不同的關鍵字 import關鍵字僅僅是引領編譯器找到外部類的定義,所以編譯器不會破壞out.as文件的內容; include關鍵字執行的是文本操作層面的命令,只是簡單地將外部文件的內容插入include位置,而import關鍵字提供的是程序邏輯層面的功能,用于在多個文件之間共享類的聲明。 二者之間有著根本的區別,不能換用,也不應混淆。
(6)類的長名稱 類的長名稱并不是指類的名字比較長,而是指類的隸屬關系比頂級類要深。 Point類,長名稱卻是flash.geom.Point AS3借助包管理類的定義文件,每個包對應相應級別的同名文件夾。利用類的長名稱,編譯器能更準確的找到類的定義,并做進一步編譯。 在ActionScript 3.0中,也可以使用通配符*包含整個包。這會降低編譯器的效率,增加編譯時間。 借助開發輔助工具,并不需要經常關心類和包的結構關心。
Class和Package
數據類型 ActionScript 3.0的數據類型包含兩個大集合: 基元值 包括Boolean,int, Number,String和uint 復雜值 Array,Date,Error,Function,RegExp,XML和XMLList 還允許用戶自定義數據類型,它屬于復雜值集合。參見P121表4-6
ActionScript 3.0第一種完全的面向對象的語言,基元值和復雜值都被視為對象。 Number數據類型可以表示整數,無符號整數和浮點數。為了盡可能提高性能,應將Number數據類型僅用于浮點數,或者用于int和uint類型無法存儲的大于32位的整數值。
void數據類型僅包含一個值:“undefined”,表示未聲明類型的變量類型。 字面值是最簡單的數據形式,是直接出現在代碼中的值 在ActionScript 3.0中,聲明變量必須使用var關鍵字顯式聲明。 var 變量名標識符:數據類型 通常,在聲明變量的同時為變量賦值的方法,在創建數組或是實例化類的實例時最為常用。
變量的作用域 變量的作用域是指,能夠通過引用變量名來訪問相應變量值的代碼區域。全局變量是指在代碼的所有區域都能訪問的變量,局部變量是指盡在代碼某個部分方能訪問的變量。 變量的作用域同變量的聲明位置息息相關。
多級條件流程 for...in循環是for循環的變體。循環的運行將基于復雜對象的屬性遍歷。 var myArray:Array = {1, "two", true}; for (var i:String in myArray) { trace("Array child : " + i); trace(myArray[i] + " is :"+ typeof(myArray[i])); }
函數的定義 函數在ActionScript中始終扮演著極為重要的角色,將有效的輸入值變換為唯一的輸出值 在ActionScript 3.0中可通過兩種方法定義函數,使用函數語句和使用函數表達式。函數語句總是以function關鍵字開頭。在函數語句中,包含函數的四個要素: (1)函數名,不可以重載 (2)參數,逗號分隔,參數列表 (3)函數體,{}括起來的AS3代碼部分 (4)返回值,只能有一個 在ActionScript 3.0中函數的定義位置非常寬松,編譯器會像對待變量聲明一樣對待函數定義。函數的定義聲明將被提升。
arguments對象可以代指函數的參數列表。它本身是一個數組,儲存了函數的所有參數。
第六章 面向對象編程
本章著重介紹面向對象的一般性概念和知識。掌握了這些,就等于打開了ActionScript 3.0內部寶庫的金鑰匙。 從根本上講,OOP是一種基于過程和邏輯的編程模式。面向過程的模式是一種最基本的開發模式。面向對象的編程模式則強調將問題分解為不同的模塊,用類和對象的概念去分析和組織。
包和命名空間是兩個相關的概念,包的名稱類似于命名空間,在包內聲明的對象具有相同的包命令空間。 可以有多個對象共同屬于同一個包。 通常,import語句越具體越好,建議避免導入該類所屬的整個包,因為過多的導入類會增加編譯器的搜索負擔,降低編譯效率 在正確導入類或是包之后,可以使用類的完全限定名稱,也可以只使用類名稱本身,建議使用后者 包的機制可以完美地區分不同包中的同名類。包的使用是必要的技術。
包和命名空間 在ActionScript 3.0中,包是用命名空間實現的,但包和命名空間并不同義。使用命名空間同包沒有必然的關系,它們既不共生,也不排斥。 包可用于組織類文件。 每個包可以包含許多各類文件,這些類文件都應該存儲在同一個文件夾下面。每一個類文件聲明一個公共類,該類的名稱同該文件的名稱相同。 如果要訪問某個包中的某個類,則編譯器將按照包的名稱查找路徑中的相應文件夾,然后在該文件夾中搜索以該類名稱命名的as文件。Flash就采取的是這種策略管理類文件。
區分包的概念和類繼承 具有繼承關系的類可以分布于同一個包中,也可以分布于多個包中。同時,位于同一個包中的兩個類僅是具有共同的命名空間,其它方面都不必相關。 創建包時,該包的所有成員的默認訪問說明符時internal,默認僅對所在包的其它成員可見。如果希望某個類對包外部的代碼可用,則必須將該類聲明為public。
利用包組織代碼 包的特性決定了它最重要的作用是組織代碼并防止命名沖突。 允許一個源文件中包括多個類,每個文件中應該只有一個類可供該文件外部的代碼使用。這些類將僅在該文件中可用,對該源文件外部的代碼,它們不可見。 包的樹狀結構對應文件存儲系統的文件夾樹狀結構。多級別包結構使用.運算符,類似java,比如類 global.content.terra.civ 對應文件global/content/terra/civ.as,可以用包將代碼組織成直觀的分層結構,以供其他程序員使用。
import視為編譯器的指向牌,幫助編譯器尋找類的聲明。 ActionScript 3.0在包,類和源文件的組織方式上具有很大的靈活性。
繼承訪問控制 四個內建的訪問控制關鍵字 public,protected,private,internal public屬性,對所有位置的代碼可見 protected屬性,對子類可見,不管子類和基類是否在同一個包中 private屬性,對本類可見,子類不可見 internal屬性,對同一包中的子類可見
方法的繼承覆蓋 類繼承機制僅支持繼承覆蓋,使用override聲明,靜態方法不能繼承,也不能覆蓋。 繼承覆蓋需要具備兩個條件: 該方法必須是可以改寫的,就是不能使用final關鍵字聲明。 該方法必須是子類可以訪問的,不能使用private關鍵字聲明 ActionScript 3.0的編譯器僅根據參數數量與參數順序辨別方法,并不參考參數的名稱。
屬性的繼承覆蓋 非私有的實例屬性可以被繼承,但是不能被覆蓋。只有聲明靜態成員時,可以不理會父類中的同名屬性。 靜態屬性必須使用類的名稱來訪問,而不是實例的名稱。這樣在代碼調用成員時,不可能出現靜態成員同實例成員的混淆。 唯一可以覆蓋的成員是方法成員,也就是那些使用function關鍵字聲明的成員。鑒于方法重載的諸多限制,所以在子類中重載父類的setter/getter存取器并不能完成重新定義屬性成員的任務。
關鍵字super 關鍵字super提供了對父類的直接引用,使用使用super()調用父類的構造函數,也可以使用super.成員名稱的形式引用父類的成員。 注意: super關鍵字僅保留距離被引用子類最近的父類的引用,不能講super理解為父類的引用。將super關鍵字連用以訪問繼承樹頂層的基類,是不成立的。 在子類的構造函數中,可以使用super()的形式顯式調用父類的構造函數,也可以省略,編譯器會自動在構造函數的第一行之前添加super()。顯式添加的優勢是,能夠人工的控制調用父類構造函數的時機, 這在有些代碼中是非常關鍵的。 在子類構造函數中任何形如super.成員名稱的調用都應該在調用super()之后出現,否則后果不可預料。
多態 多態就是讓這些不同行為的方法采用同一個方法名。這里偏重廣義的多態,指根據不同的類使用相同方法名。嚴格意義上應該視作一種繼承覆蓋。 使用繼承實現多態,具體的實現方式是允許子類繼承和重新定義并覆蓋基類中的方法。 ActionScript 3.0的類繼承是以覆蓋形式實現對父類同名方法的改寫。
靜態成員和作用域鏈 只能通過定義靜態成員的類名稱來訪問靜態屬性, 類名稱.靜態成員名稱。 允許使用與靜態屬性相同的名稱定義實例屬性。可以在靜態屬性所在的類中定義同名實例成員,也可以在子類中定義同名的實例成員。調用時,同名實例成員的優先級更高。 在定義靜態屬性的類體及該類的任何子類中,可直接訪問靜態成員,而不必拘泥于“類名稱.靜態成員名稱”形式。 靜態成員總是比實例成員更靠前,更優先被調用,但是使用類名稱.靜態成員名稱也可以準備訪問到靜態成員。
面向對象進階 這些內容比較抽象,需要具備一定的理論基礎。但是在程序開發中又屬于常見內容。
聯合繼承 聯合繼承,就是一個子類可以同時擁有多個父類。通過子類,便可以將多個父類聯合起來,在子類中共享多個父類的機能。 一個父類可以擁有多個派生類,一個派生類可以具有多個父類。 聯合繼承得到的子類應該包含任何一個父類的共用成員,這就使子類可以充當父類的角色。 聯合繼承的問題 支持聯合繼承的語言中,都會引入嚴格的封包機制,以限制名稱訪問的沖突,聯合繼承在運行時的開銷非常大。 下面的寫法是錯誤的
class multi_inherit extends base1, base2{}
在ActionScript 3.0中,聯合繼承沒有得到直接的支持,但是利用接口概念可以變相實現聯合繼承。
接口的概念 接口是一種特殊的類,只包含方法的聲明,沒有方法的實現。利用普通類將接口中的聲明實現,稱為實現接口。該類相應稱為接口的實現。 接口類似C++語言中的h文件,具體的實現要在cpp文件中提供。
接口和接口的實現不是繼承關系,一個接口的多個實現可以是完全不相關的類,而接口的作用就是零這些不相關的對象具有通用的方法,能夠方便地彼此通信。 ActionScript 3.0的核心類隨著Flash和Flex的發布,供全世界開發者重復使用。核心類的設計原則之一就是方法名稱的統一。 FlashPlayerAPI定義了IEventDispatcher接口,其中包含的方法聲明可供類處理事件對象。 public interface IEventDispatcher{} EventDispatcher類實現了IEventDispatcher接口。 public class EventDispatcher implements IEventDispatcher{}
采用接口比在基類中定義空函數擁有更廣泛的用途。在基類中定義空函數,只能保證繼承樹內的類可以使用,接口不參與繼承機制,不必受繼承樹的限制。 不同繼承樹中的類,可以是同一接口的不同實現。 在調用時,可以查詢一個類是否是某個接口的實現。 接口是一種抽象類,接口可以歸屬于任何包中,接口定義應該位于包的頂級,接口不能嵌套。可以為接口指定命名空間,在一個包中,可以包含多個接口。 一個接口內,可以提供多種方法。接口中的方法應盡量避免與可能的類名稱沖突。接口中定義的方法聲明不能包含任何訪問控制說明符(public, private等),也不要包含final關鍵字。 只能使用public和internal訪問控制說明符來修飾接口定義。
接口和類的最大區別是: 接口中不能包含變量和常數,如果要提供對屬性成員操作的統一限制,建議在方法內包含setter和getter存取器,存取器將被視作方法看待。 接口可以繼承,使用extends關鍵字,支持聯合繼承,一個接口可擴展為一個或多個其他接口,只要逗號分隔開就行。
FlashPlayerAPI遵循一種約定,接口名都以大寫字母I開始。
接口實現 在ActionScript 3.0中,接口需要使用類實現。實現某個接口的類,與普通類沒有本質區別 class 類名 implements 接口名{ //類體 } 在一個類中,可以聯合使用implements和extends關鍵字。聯合接口實現類將兩個接口的方法整合在一個類中。過分別通過這兩個接口的檢測。
接口方法實現遵循的原則 相同方法名 參數匹配 返回值一致 公共訪問權限
在運行時對接口進行選擇,檢測接口需要使用ActionScript 3.0內建的關鍵字is或是as,注意是實例不是類名稱的檢測。 trace(nearbycafe is Iservice);
is和as在檢查接口時效果是一樣的,區別在于: 當檢查成功,is返回true,as返回該對象本身;當檢查失敗時,is返回false,as返回null 關鍵字instanceof不能檢測接口及接口的實現。
接口使用技巧 利用接口的聯合來實現類的聯合繼承(變相實現)。利用include分離公共接口代碼實現,做到重用。
抽象類的內部機制 ActionScript 是一種基于原型的語言, 類和對象逐漸成為腳本語言的核心內容。ActionScript 3.0引入了新的繼承對象:traits對象。 深入研究使我們始終不能回避一個問題: ActionScript 3.0中類的本質是什么? 在ActionScript 3.0中,有兩種構建類的方法,一種方法是利用class關鍵字,另一種是傳統的方式,利用function關鍵字,兩種方式的結果一樣。 (以后需要仔細研究)
動態類 動態庫是一種特殊類,具有開發式的成員定義機制。未使用dynamic關鍵字定義的普通類稱為封裝類。 創建動態類的實例時,會為其創建一個Hash表,用來記載動態添加的成員,Hash表將占用額外的內存。 動態類僅允許修改類的對象,為對象添加成員,并不能改變類定義本身,不能為類添加動態成員。 動態添加的屬性僅限當前實例使用,并不能在類的所有對象實例中分享。在運行時動態添加,在編譯時并不存在。動態成員不享有類內部成員的待遇,不能訪問類的私有成員。 dynamic屬性不由子類繼承,若動態類作為基類,其子類不自動具備動態性。只有添加了dynamic關鍵字,動態類的子類才是動態的。動態成員僅在運行時添加,在編譯階段不能檢查其數據類型。 在運行時,由Flash Player會對動態成員進行類型檢查,使用動態成員要非常小心,以免引發運行時錯誤。
使用dynamic關鍵字定義動態類 添加的動態成員可以是屬性,也可以是方法。執行效率比內部方法低。
動態方法 動態方法必須以函數表達式的形式添加。具體而言,有三種方式。 函數語句 函數變量 函數表達式 直接使用函數表達式對動態類的動態成員賦值。
成員檢查 使用關鍵字in執行成員檢查,保證成員不被非法訪問,用法如下: 實例成員名稱 in 對象名稱 靜態成員名稱 in 類名稱 使用in關鍵字只能檢測到可訪問的公共成員 使用in來判斷數組是否包含某個索引號的元素,或是是否含有某個字符串 var myary:Array=new Array(12,31,34); trace(2 in myary); //true trace(5 in myary); //false
Talii.qiaqia=105; var mystr:String="qiaqia"; trace(mystr in Talii);
刪除動態成員 使用delete關鍵字顯式地刪除一個動態成員,不能使用delete刪除非動態成員。用法如下: delete 對象名.成員名 一旦成員被刪除,則成員中原有的值便不可訪問: Talii.phorny=1492; trace(delete Talii.phorny); //true trace(Talii.phorny); //false trace("phorny" in Talii); //false 還可以刪除動態方法 Talii.outerfunc=function(){ trace("add a function out"); } Talii.outerfunc(); trace(delete Talii.outerfunc); //true Talii.outerfunc(); //error
事實上delete只是減少引用次數。 刪除一個非動態成員,請為其直接賦null。如果一個對象失去了所有的引用,則該對象會被標記為“可回收”,并在內存管理時被釋放。 ActionScript 3.0是一種自動內存管理的語言,其內存管理全部由FlashPlayer處理。
動態靜態成員 運行時在類定義之外,為一個動態類添加了一個靜態成員,則該成員就是一個“動態靜態成員”,必須在運行時添加到類名稱上。 這種情況,僅是用于個別特殊場合。動態靜態成員在父類外部代碼中是公開可見的,但是對于該屬性對于外部代碼是公開的。 運行時的特殊需要 可以使用delete刪除,有利于減少內存占用 歸類管理相關數據 使用較少的全局變量,是一種很好的編程習慣。 避免被子類繼承 如果想避免子類中的非法調用,同時情況特殊不便于使用private關鍵字,則可以使用“動態靜態成員”解決
第七章 AS3常用對象
字典Dictionary其實就是關聯數組,對象作為鍵,值可以使任意類型。字典在Flash的開發中比較有用。使用字典的主要用途就是建立對象之間的映射。 Adobe Flash Player使用垃圾回收系統來恢復不再使用的內存,依據是對象的引用計數。
顯示列表是Flash應用程序的重要對象,顯示列表包含Flash應用程序中的所有可視化元素,是一個樹狀結構。 當操作顯示列表時,FlashPlayer自動管理顯示對象的深度,也就是間接管理對象的z順序。 在Flash中,顯示在舞臺上的所有元件都是顯示對象,但是顯示對象也可以不出現在舞臺上。 顯示對象,是指,ActionScript 3.0中顯示類的實例對象,顯示類包括核心類DisplayObject的所有子類,以及這些子類的用戶自定義子類。 flash.display包中,包括了大多數常用的顯示類,還有一些顯示對象分散收錄于flash.text,flash.media包中。 該樹非常重要,請務必牢記。
如果顯示對象容器被置于屏幕上,那么該顯示對象容器包含的所有元件都會顯示在屏幕上面。顯示對象容器具有批量操作的優勢,避免對一系列對象重復的操作。
Flash在處理基元值時,開銷比較小,應該盡量使用基元值集合中的數據類型,以提高Flash的執行效率。
null和“”的區別 值為null的String變量并不占用內存資源,而如果一個值為“”的String,該變量會被初始化。使用==運算符可以檢查出null值和空字符串""的不同。
顯示列表 顯示列表在每個swf應用中只有一個且必然有一個,舞臺是顯示列表的根,顯示列表中的顯示對象如果不出現在舞臺范圍內,則該對象顯然是不可見的。 顯示對象基本上都可以經過設置alpha屬性而成為完全透明的。顯示對象列表中,除了位于最枝節的對象外,都是顯示對象容器。 顯示對象的主要部分都是由Sprite,MovieClip,Loader構成的。
第八章 腳本動畫基礎
第九章 動畫進階和腳本仿真
第十章 影片剪輯與圖形圖像
在ActionScript 3中,所有的影片剪輯MovieClip其實都是類的實例對象。對于影片剪輯,時間軸其實是一種基于計時器的switch類似的結構。 對于Flex和FlashDevelop這些沒有時間軸編輯窗口的開發工具,直接在代碼中管理Timer是創建動畫的最佳方式。直接使用語言內置的時間軸機制,就必須使用MovieClip。使用MovieClip有四種方式: 任何以MovieClip類為基類的子類都會繼承MovieClip中的時間軸機制。可以為時間軸上的任何幀分配幀標簽。幀標簽是字符串,不是標識符,不需要遵循ActionScript 3.0的標識符規則。使用幀標簽比使用幀編號具有明顯優勢。
ActionScript 3.0包括FrameLabel類,其每個實例均代表一個幀標簽,并有一個name屬性和一個frame屬性。幀標簽只能在設計階段指定和修改。
回調API是SWF應用程序的通用技術。矢量圖和點陣圖。 點陣圖(位圖)體積過大,適于描述復雜的色彩和信息,但是不利于網絡傳輸,難于創建靈活的動畫。位圖常見的文件格式:bmp,jpg,gif,tga,png,主要區別在于使用不同類型的壓縮算法。 矢量圖是使用數學算法解釋的,因此存儲信息少,在運行時根據較少的信息還原為屏幕顯示,需要計算機具有較高的運算能力。矢量圖形是Flash的靈魂,適于制作變形動畫,較小的體積也利用網絡傳播。 矢量圖基于簡單的算法和基本的形狀,最權威的工具是Adobe Illustrator。 Flash基于簡單的矢量繪制能力,ActionScript的繪圖API基于同樣的思想進行設計。可以用ActionScript的語句定義矢量圖形的繪制過程,在swf文件運行,就是矢量圖形在屏幕上繪制和顯示的過程。 ActionScript 3.0的繪圖API主要集中在flash.display包中的Graphic類,該類提供了不同的繪圖功能。 在ActionScript進行矢量繪圖,總是依賴于某個對象實例,然后調用該對象中的Graphics成員進行繪制。 在Shape,Sprite或MovieClip類中,都包含Graphics類的實例作為屬性成員,以供開發者繪圖時調用。可以在自定義類中包含一個Graphics對象。Graphics類包含用于繪制線條,填充和形狀的屬性和方法。 Shape實例的性能優于其他用于繪制的顯示對象,因為它不會產生Sprite和MovieClip類附加功能的開銷。 Graphics.lineTo(), 起始位置默認為舞臺左上角的(0,0), 連續調用可繪制出一序列首尾相連的線段。 手動指定線段的開始位置,使用moveTo()方法。使用Graphic.lineStyle()方法指定線條樣式。 carv.graphices.lineStyle(14, 0xff3300, 1) 指定該線條為14像素寬,顏色為“0xff3300”,透明度為1 繪制曲線curveTo(),4個參數,控制點的x,y坐標,錨點的x,y坐標,控制點僅影響曲線的走向,并不出現在曲線之上 在繪圖前必須指定填充樣式,在ActionScript 3.0繪圖API中,具有三種類型的填充:單色填充,漸變填充,位圖填充 在ActionScript 3.0內部, 位圖是使用bitmap類和BitmapData類管理和操作
Adobe Flash Player支持的位圖圖像格式有jpg,gif,png JPG圖像不包括透明度 PNG可以使用通用的無損壓縮算法,其體積比BMP小得多。但是PNG的體積一般還是比JPG大,還不能完全取代JPG。PNG的多級透明度也能使邊緣顯得更加平滑。 無論是GIF,PNG,JPG都僅僅是位圖的外部格式,在內存中,它們都被解碼并轉化為最基本的像素矩陣,以Bitmap形式存儲。BitmapData類中復制了此額外透明度像素字節。
在ActionScript 3.0中提供了一個專用的類:Loader類,可以處理外部swf文件和圖像的加載任務。 Loader.load()加載外部文件,兩個參數,第一個參數是文件地址,必須指定,必須是標準的URLRequest對象,第二個參數,可以省略是安全設置。
URLRequest類是ActionScript 3.0重要類,提供了對地址和的標準化存儲和操作。精簡代碼 var Sharploader:Loader = new Loader(); Sharploader.load( new URLRequest("data/f1.jpg")); 為了確保加載完畢,需要添加對Event.COMPLETE事件的響應,使用Loader的contentLoaderInfo屬性處理此消息,contentLoaderInfo屬性是LoaderInfo類的實例,該屬性指向被加載對象并處理被加載對象的信息。 下面的代碼演示了Loader類加載外部圖像時,如何進行消息偵聽。
總是應該講BitmapData作為數據,交給專門處理位圖顯示的Bitmap類。Bitmap類可視為BitmapData對象的舞臺包裝。 利用Bitmap和BitmapData類,可以擺脫對外部數據的依賴,直接在代碼中創建位圖圖像。
文本不等于字符串,是指舞臺上的顯示對象。 若要在屏幕上顯示文本,在Adobe Flash player中使用TextField類。TextField類是Flash創作環境中的提供的文本操作類。該類要解決的問題是如何將String字符串類數據顯示在屏幕上。 在處理文本顯示時,TextField成為不二之選。在ActionScript 3.0中,文本操作的功能已經相當成熟了。 在flash.text包中還提供了許多輔助的類,例如TextFormat類和StyleSheet類。如果要設置復雜的文本格式,可以使用TextFormat類,TextField對象能接受TextFormat對象,并根據TextFormat對象提供的信息,改變文本自動的顯示格式。快速分析和顯示HTML是Flash的重要功能。
第十一章 事件與交互
事件機制是ActionScript 3.0的頸骨,代碼的執行,一刻也不離不開事件。Flash中的每一個動作周圍,都有事件的影子。ActionScript提供了多個類來處理SWF同運行環境的交互。 事件的處理和操作滲透進ActionScript 3.0的方方面面,很難使用一個基類來定義。 事件偵聽器并不僅檢查和偵聽事件,更主要的功能是處理事件。事件響應機制更趨向于標準的DOM結構。 事件的發送管理是Flash Player的自動機制,所有的機制由“FlashPlayer事件管理中心”統一管理。 在一個對象中可以為多個事件添加偵聽器,也可以為某個事件添加多個偵聽器。 事件的分發路徑稱為事件流,不同的事件具有不同的事件流。按照事件流的流向,將事件流分為三個階段: 1)捕獲階段 2)目標階段 3)冒泡階段 并非每個事件都參與事件流的所有三個階段
Event類 事件本身也是對象,利用類來定義。在ActionScript 3.0中,所有的事件都以Event類為超類,例如MouseEvent和TimerEvent都是子事件類。 Event類的實例屬性描述了事件對象的相關信息,這些屬性都是只讀的。 currentTarget 當前對象, target事件目標, Flash Player API自身定義了多個Event子類
IEventDispatcher接口處理有關事件的方法定義。EventDispatcher類實現了IEventDispatch接口,顯示列表上的任何對象都可以使用IEventDispatcher接口的方法。 如果在自定義類中需要操作事件,最簡單方法是擴展EventDispatcher類,這樣就不需要自己編寫IEventDispatcher接口的方法 IEventDispatcher接口的事件方法定義中,包括添加事件偵聽器的方法,addEventListener(),至少提供兩個參數,事件類型和事件偵聽器名稱。
事件偵聽器是一個函數或是方法,應該包含一個事件對象參數,并具有void類型的返回值。 removeEventListener()方法,從對象中刪除事件偵聽器。 dispatchEvent()主動將事件對象派發到事件流中
查詢系統信息的主要類是flash.system包中的Capabilities類。該類提供了一些屬性,這些屬性描述了播放swf文件的客戶端系統信息。
第十二章 使用外部數據
ActionScript 3.0應用程序最終能編譯為一個swf文件。根據具體情況,可以選擇性的將數據置于swf文件之外。swf文件通過與外部交互數據,獲得新的信息,指令和資源。從應用的角度看,數據的不同種類產生了豐富的程序功能。開發者必須掌握如何讀取,分析和操作外部數據。 媒體資源數據包括聲音,圖像,視頻,其它swf應用等類型,資源數據未必是磁盤文件,從攝像頭和麥克風獲取的持續數據流,也是一種動態資源數據。
Flash可以播放FLV格式的視頻資源,可以存放在本地,也可以部署在遠程網絡服務器。使用FLVPlayback類,幾乎可以完成視頻播放的所有操作,包括漸進式下載的Flash視頻文件,也可以播放流式加載的FLV文件。 FLVPlayback將各種功能高度集成和封裝。沒有提供直接調用的快進和快退方法。使用FLVPlayback之前需要 import fl.video.* Video類和VideoPlayer類需要配合相關的處理數據傳輸的類,才能完成視頻的讀取和播放。
在ActionScript 3.0中,聲音的播放和控制的類主要集中在flash.media包中,其中,最重要的聲音類是Sound類。該類負責處理聲音的加載,管理基本聲音屬性,以及啟動聲音播放。 播放的每種聲音具有其自己的SoundChannel對象,它控制聲音左右聲道的音量和播放進度。 SoundChannel對象在調用Sound類的Play()方法時被自動創建并作為返回值提供 使用SoundTransform類配合SoundChannel對象控制音量。
URLLoader類加載文本或二進制數據,Loader類可用于加載swf文件或是圖像(JPG, PNG,或GIF)文件 每個Loader只負責加載一個外部數據,Loader作為一個顯示對象容器,本身支持被加入其它的顯示對象容器。開發者利用addChild()方法將Loader對象裝入舞臺顯示列表。
加載圖像有不同的選擇,可以在TextField中利用HTML標記裝載圖像,也可以利用位圖顯示對象實現舞臺的顯示。 為了避免內存泄露,應盡量避免直接使用打開的圖像文件,而是將打開的文件寫入新的位圖副本,并關閉Loader對象,釋放位圖緩存。
通過外部文本和XML文件,能為SWF問題提供變量和內容,存放程序的配置信息, 使用URLLoader時,需要等到整個文件下載完成之后,才能訪問URLLoader數據。有關下載進度的通知事件,通過bytesLoaded和bytesTotal屬性,以及已調度的事件,可以監視文本的下載進度。 URLVariables類是一個輔助類,定義了處理URL字符串的常見方法。URL字符串由變量名和變量值組成,使用&相連。URLVariables對象可以使用.運算符連接任何名稱。屬性未定義時,按未定義處理。 URLLoader加載外部文本需要利用許多字符串的處理技巧。 var myid:URLLoader=new URLLoader(); myid.dataFormat=URLLoaderDataFormat.VARIABLES;
更清晰地定義外部數據,需要利用XML文件。在ActionScript 3.0中創建XML對象非常簡單,可以使用XML類的構造函數,直接將一個XML格式的字符串轉化為XML對象。XML的操作非常簡單。 XMLList實例可以包含完整的XML文檔,XML片段或是XML查詢結果。 精簡的代碼片段 var x:XML; (new URLLoader(new URLRequest("xsample.xml"))).addEventListner("complete", xl); function xl(et:Event):void{ x = XML(et.target.data); }
URLStream類提供了對下載的低級訪問,下載文件內容作為原始二進制數據提供。可以提前關閉URLStream流的下載。
Flash Player對磁盤讀寫受到很多限制,為了保存信息,需要借助于共享對象和FileReference類。使用ShareObject類管理數據共享對象,也可以將共享數據對象存放到服務器端,編譯在多個操作系統和不同計算機之間共享數據。 ShareObject對象有Flash Player自動創建,該類提供一個getLocal()和getRemote()方法,分別訪問本地和遠程的數據共享對象。 盡量將數據共享對象作為優化程序用戶體驗的方法,而不是左右程序功能和行為的關鍵技術。 本地存儲和遠程存儲各有利弊: 本地存儲不利于機器之間的數據共享,不能保證操作系統之間的數據共享,用戶數據缺乏統一的官網和備份; 遠程存儲必須保證網絡連接暢通,網絡傳輸的不穩定不利于程序的平穩運行。 ActionScript 3.0提供了雙重存儲機制,可同時本地和遠程永久存儲,建立遠程和客戶端的雙向副本。
網絡通信 網絡通信有很多類負責: FileReference類,Socket類,XMLSocket類,NetConnection類,NetStream類 套接字連接分為兩大類:二進制數據的套接字連接,XML數據的套接字連接,前者是Socket類,格式化文本傳輸,使用XMLSocket類
Socket套接字類 使用Socket類與服務器的二進制協議通信非常容易。連接成功后發送Event.CONNECT事件。當服務器關閉連接時,Flash player會接收到Event.CLOSE事件通知。 使用flush()方法,對套接字輸出緩沖區中積累的所有數據進行刷新。 XMLSocket是一個低層次的通信對象,能夠提供較低級別的讀寫控制。XMLSocket類存在的意義在于它實現了XML信息的套接字操作,XML消息通過全雙工TCP/IP 流套接字連接發送。應用場景比如,多用戶聊天室程序。在XML對象和文檔的層面發送和接收消息。
FileReference類提供了在用戶計算機和服務器之間上傳和下載文件的方法。upload方法上傳該文件,播放器正式支持的上傳或下載文件大小是100MB。 FileReferenceList類選擇了一個或是多個要上載文件的方法。 出于安全性考慮,Flash Player對于磁盤的操作非常有限。
許多遠程通信的操作都需要服務器端的支持,開發者需要了解常見的協議,并熟悉網絡環境下的異步操作。ActionScript 3.0提供 了強大的低端類和容易使用的高端類,以滿足不同場合和不同開發需求的要求。
第十五章 全屏幕FLV視頻播放器
為了在客戶端Flash應用程序中創建視頻回放,需要使用多個底層類 Video類 flash播放視頻的基本類,舞臺上的實際視頻內容框是video類的一個實例。Video類是低端的視頻處理類,不包括界面控制和網絡連接控制功能。開發者需要使用NetConnection類和NetStream類, 完成網絡連接和視頻數據加載的相關操作。若有播放視頻流,需要使用NetStream類的attachNetStream()方法,將視頻數據附加到Video對象上,Video對象將回放該NetStream流中的視頻數據。 Video類為開發者提供了底層的控制能力,適合開發具有嚴格文件體積現在和特殊自定義功能的視頻播放器。
NetConnection類 該對象是到視頻文件的連接,可以將其視為視頻數據饋送的通道。定義連接的相關選項,并不會打開具體的視頻文件。該類主要實現與視頻服務器的協作。除了FMS,還可以連接標準的HTTP服務器,借助HTTP協議漸進式 下載視頻文件。
NetStream類 在加載視頻文件時,ActionScript 3.0使用NetStream對象實例來控制視頻源。NetConnection對象通常和NetStream對象一起使用,因為創建一個NetStream對象需要NetConnection對象作為參數。 NetStream類通過NetConnection對象提供的連接,打開FlashPlayer與服務器或本地文件系統之間的單向流連接。
連接創立后,需要使用NetStream對象打開具體的數據流,傳輸某個視頻文件中的數據。類似NetConnection對象中的一個通道。該通道可以使用NetStream.publish()發布音視頻數據,也可以使用 NetStream.play()加載接收數據。
根據FLV文件的存儲方式,指定視頻部署方式 1)本地計算機上, 2)從標準web服務器上漸進式下載 3)從FMS流式加載
根據FlashPlayer安全機制,Flash Player可以播放與swf文件存儲于同一個目錄中或存儲于其子目錄中的本地FLV文件,或是播放具有絕對地址的遠程FLV視頻文件,但是不能訪問swf文件所在的目錄的上級目錄。 在自定義類中使用Video類,需要使用該類的導入聲明 import flash.media.video;
不需要視頻服務器,播放本地文件,使用 connection.connect(null); NetStream對象和NetConnection對象發出的事件不同,但是可共用一個事件偵聽回調函數,在switch時判斷發生的事件就可以了。
利用包命名空間限制不同控制類的訪問,這種換膚機制在文件管理和編譯時都非常方便。? Video類自身不提供視頻的控制方法,控制視頻的暫停,繼續,應該利用NetStream類提供的pause()方法和resume()方法 類文件只是一個文本文件,不能在其中包含任何資源,而FLA文件是一個復合文件,包含許多資源內容。一旦FLA文件中導入了組件資源,就可以在自定義類中使用這些組件。
NetStream.time記錄當前播放位置 NetStream.seek()跳轉到視頻流中的指定位置 NetStream.close()關閉視頻流,不可恢復播放,還會刪除已通過HTTP下載的FLV文件的本地副本
onMetaData() 將視頻元數據作為對象參數傳入,被內部處理,Flash Player自動響應該事件,這種內部機制一般稱為系統回調。 為了操作視頻元數據,開發者只能創建一個自定義回調函數,并讓Flash Player使用自定義的回調函數,為了綁定NetStream,需要利用NetStream.client屬性來確定視頻流的回調對象。 函數表達式可以在函數內部定義,這是非常方便的語法特性。
追蹤播放進度需要三個量: 起始時間,終止時間,以及當前時間 隨著視頻的播放,滑塊的進度會相應地改變。 NetStream類中提供了bufferTime屬性控制緩沖區大小,默認0.1秒,為了流暢播放,可以設置更大些。當前緩沖區中的數據量為bufferLength,也以秒數為單位。通過這兩個量,可以確定當前緩沖區的加載情況。 NetStream.bytesLoaded屬性,獲取當前加載的數據量,bytesTotal屬性,表示當前加載文件的總字節大小。這兩個量計算出當前加載量的百分比。
取得播放時長是個很耗時的工作,目前普遍的做法是在壓縮的過程中,將總時長直接寫入FLV的元數據。開發人員不能過分依賴該量,因為是預先寫入的。bytesTotal屬性是FLV文件的大小,具有穩定性,可以動態判斷。 全屏模式還是要受Flash Player版本的限制,如果使用ActionScript 3.0,Flash Player版本必須高于9.0才能正常播放。全屏模式下的運行技術已經非常成熟。不同的FlashPlayer版本對視頻的回放有著巨大的影響。 保證客戶端Flash Player播放器能夠使用硬件加速非常重要。視頻回放的解碼工作可以在多個線程中進行,并且真正支持多個CPU內核。
當swf嵌入網頁是,必須設置allowFullScreen屬性為true時,才能起到Flash Player的全屏模式支持。 flash.display.StageDisplayState類只包括兩個常量,必須在用戶的交互事件中設置。 進入全屏模式,Flash Player會出現自動安全警告,告訴用戶使用ESC鍵可以退出全屏。 全屏模式下,鍵盤無法控制,只有鼠標。標準模式向全屏模式的變化是一種線性映射,使用Stage.scaleMode屬性控制這種投影機制。
Adobe FlexBuilder是Adobe官方支持的最完整的RIA開發解決方案,適應專業程序員的開發習慣。 使用Adobe FlexBuilder 2可以開發出功能強大,結構健壯,跨平臺的企業級應用程序,是一個相對耗費資源的開發環境。Java虛擬機運行環境總是對磁盤要求甚高。 FlexBuilder基于Java開發環境,在安裝之前需要先安裝配置好Java運行時環境。在FlexBuilder安裝包中提供的FlashPlayer可能不是最新的,請從官網下載更新。為了調試應用程序,需要安裝瀏覽器的FlashPlayer Debug版本插件。安裝完成后,應及時檢查瀏覽器的FlashPlayer是否是debug版本。
第三章
FlexBuilder是一個很優秀的代碼編寫工具,其提供的代碼提示要比Flash強大很多。使用FlexBuilder彈出的相關代碼提示窗口,可以快速而無錯的編寫代碼 工具欄中的綠色運行按鈕,快捷鍵Ctrl+F11,編譯并在瀏覽器中執行,不僅編譯了應用程序,還生成了相關的HTML文件,所以在瀏覽器中看到的是嵌入HTML文件的SWF應用。可以勾選自動編譯。
Flex程序有自己的規范和構成 與Flash不同,Adobe公司為Flex設計了一種新的文件結構:MXML。FlexBuilder的程序,一般都由三部分組成:MXML,ActionScript, Flex類庫。這三者本質上,依然是使用ActionScript 3.0實現的。 MXML主要為用戶界面組建布局,并記錄和存儲這些信息。負責記錄界面的布局信息。它是XML 1.0語言,由一系列標簽和標簽屬性組成。 數據塊標簽:<![CDATA[......]]> 塊注釋: <!--注釋部分--> 對于MXML應用程序,一般總有一個最外層的標簽<mx:Application>,Application標簽定義了一個應用程序,命名空間的命名一般都放在這里,mx是命名空間,內部的標簽都可以使用該命名空間 MXML組件文件,一般會有一個最外層的<mx:Canvas>,它是一個容器,包含HBox,VBox,x坐標,y坐標 標簽名稱以大寫字母開頭,標簽屬性以小寫字母開頭,都可以大小寫混合。屬性需要加上雙引號。 在MXML語言中,創建組件和調整組件屬性都非常簡單,形式如下 <mx:組件名稱 屬性1="數值"?屬性2="數值"?屬性3="數值"> Flex的組件種類更加全面,功能更加強大,是對Flash基礎類的整合和加強。 使用MXML構造用戶界面非常便捷,創建組件,改變組件外觀,移動組件位置,都簡化為操作相應的標簽和屬性。MXML設計目的之一就是令外觀樣式的設計和代碼的邏輯實現分析,也就是表現層和邏輯層的分離。利用這一特性,程序部門和美術部門可以同步工作,互不影響。一旦應用需求確定了,只需要快速地開發出“原型界面”,確定交互部分各組件的ID,程序部門就可以進行深入的開發和調試,而美術部門可以依據確定的組件ID,自由調整界面的布局和風格。
應用程序的邏輯是利用ActionScript 3.0來控制,它是Flex程序的靈魂。類庫是開發軟件自身提供的一些常用功能代碼的集合,Flex類庫是ActionScript 3.0編寫的,包含組件(容器和控件),管理器類,數據服務類和所有其它功能的類庫。 上述三者相結合,產生最終編譯得到的swf文件。一個應用程序對應一個swf文件
使用FlexBuilder的MXML構建"Hello World"應用程序 應用程序舞臺的左上角是坐標系的原點(0,0) 在屏幕上輸出文本 <mx:Text x="50" y="20" text="Hello World" id="mytxt">
用戶不僅能描述界面元素,還能包含腳本代碼 添加標簽事件響應 事件和響應,可以簡單理解為,條件和結果的關系 編譯器將MXML編譯為ActionScript,再將ActionScript編譯為二進制的SWF文件
ActionScript的內聯,級聯和外聯 <mx:Script source="/Hellofunc.as"></mx:Script>
FlexBuilder中的輔助設計模式,其實本質上就是MXML的可視化編輯器,都是以MXML記錄保存的。 MXML文件的設計模式只解釋MXML文件內部的可視化標簽,可以在設計模式下調整組件的屬性。 在代碼編輯器中打開.mxml文件,在Source和Design標簽之間切換, 在編譯包含眾多復雜控件標簽的項目時,編譯過程還會很長。較長的編譯過程,是swf文件執行效率提高的重要保證。
與更改代碼的程序員和更改設計視圖的設計人員合作,開發您的應用程序。 用戶界面開發者布局 UI、匯集 MXML 組件、提供某些輕邏輯,并可以在無需進行客戶端數據處理的情況下連接到后端數據源。
對于Flash CS3創建的默認空白項目,總是擁有一層layer和一幀frame。從某種程度上,Flash是利用幀保存腳本。在Flash CS3中,ActionScript 3.0要求所有的代碼都必須寫在幀上。寫在不同的位置,代碼的作用范圍也不同。 前面幀上的ActionScript無法訪問后續幀的ActionScript,但是后續幀上的ActionScript能訪問當前幀的所有ActionScript。代碼總是寫在當前激活的幀上。如果選中的幀不止一個,則代碼會寫在選中幀的第一幀。
trace()語句是調試語句,它的功能是將括號內的內容輸出到Flash IDE的調試輸出窗口中。 凡是指定了ID的舞臺元件,都可以使用ActionScript控制。舞臺元件有其特殊性,并不是代碼所在幀之前指定的舞臺元件都能訪問。如果在代碼所在幀的時間點上,該舞臺元件不存在,則代碼依然不能訪問。 操作動態舞臺對象的屬性使用,對象ID.屬性方式訪問。Flash中的坐標系以舞臺左上角為原點,y軸向下為正方向。 ActionScript要求,任何對象,只有加入到顯示列表中,才會被顯示在舞臺上。顯示列表是一個樹狀結構,最頂端的是舞臺對象stage。任何在舞臺上顯示的對象,在顯示列表中都是stage根節點的分支,使用addChild()將顯示對象加入顯示列表中。 stage.addChild() 簡化為?addChild()
第四章 語法基礎結構
ActionScript 3.0是一種基于ECMAScript ed4規范的腳本語言,其基本語法構成包括標識符,關鍵字,數據類型,運算符和分隔符。 這些有著特定含義的專有名稱叫做標識符。按照定義的場所,標識符分為兩類:語言內建標識符(變量,類,函數的名稱)和用戶自定義標識符。比如: decodeURIComponent(), gotoAndPlay() 掌握標識符的命名規則非常重要,包括如下幾點: (1)所有標識符大小寫敏感 (2)必須英文字母或者_開頭,數字等不能開頭 (3)標識符應由0-9,A-Z,a-z和_構成,不應使用其他特殊符號 (4)不能與ActionScript 3.0內建關鍵字沖突,參見附表 (5)考慮到代碼未來的復用性,盡量避免使用保留字,參見附表
命名約定 (1)保持自然語義,如totalNumber,FirstName (2)保持標識符的術語統一 (3)利用縮寫前綴,增強代碼可讀性 (4)規范利用大小寫,標識符主要使用小寫字符,但可以利用大小字母分割單詞,比如addLastNode(),在標識符中使用數字時,一般使用_將字母和數字區分開;常數可以全部大寫 (5)保持標識符首字母小寫,便于使用代碼輸入器自動補全 (6)避免長標識符,盡量10字符以內,照顧代碼編輯器的格式和編譯器的編譯速度 (7)避免相似名稱, (8)保持標識符的格式統一,比如last_field,current_field, first_field這些
關鍵字 按照功能不同,ActionScript 3.0中的關鍵字可以分為:表達式關鍵字,語句控制,屬性關鍵字,定義關鍵字,編譯指令,保留字 (1)表達式: false,true,null,this,Infinity -Infinity,NaN null不同于_undefined NaN 表示非數字 (2)語句控制 for,while,if,switch,throw,try,break, case, for...in 遍歷對象的動態屬性或是數組中的元素,并對每個屬性或是元素執行statement with 建立要用于執行一條或是多條語句的默認對象 (3)定義 最基礎最常用的是關鍵字var,用以指定一個變量 ...param 指定函數將接受任意多個以逗號分隔的參數 (4)屬性關鍵字,用于操作變量或者對象的訪問訪問 dynamic,final,internal,native,override,private,protected,public,static, (5)編譯指令 包括一組在編譯時起作用的關鍵字,主要是輔助ActionScript 3.0的編譯器,幫助編譯器正確的處理和分析代碼 defaultxmlnamespace ?指定默認的命名空間 usenamespace? import ?使外部類或是包可用于您的代碼 include 將過長的代碼文件分塊存儲,便于代碼的管理操作
區分:import和include是兩個功能完全不同的關鍵字 import關鍵字僅僅是引領編譯器找到外部類的定義,所以編譯器不會破壞out.as文件的內容; include關鍵字執行的是文本操作層面的命令,只是簡單地將外部文件的內容插入include位置,而import關鍵字提供的是程序邏輯層面的功能,用于在多個文件之間共享類的聲明。 二者之間有著根本的區別,不能換用,也不應混淆。
(6)類的長名稱 類的長名稱并不是指類的名字比較長,而是指類的隸屬關系比頂級類要深。 Point類,長名稱卻是flash.geom.Point AS3借助包管理類的定義文件,每個包對應相應級別的同名文件夾。利用類的長名稱,編譯器能更準確的找到類的定義,并做進一步編譯。 在ActionScript 3.0中,也可以使用通配符*包含整個包。這會降低編譯器的效率,增加編譯時間。 借助開發輔助工具,并不需要經常關心類和包的結構關心。
Class和Package
數據類型 ActionScript 3.0的數據類型包含兩個大集合: 基元值 包括Boolean,int, Number,String和uint 復雜值 Array,Date,Error,Function,RegExp,XML和XMLList 還允許用戶自定義數據類型,它屬于復雜值集合。參見P121表4-6
ActionScript 3.0第一種完全的面向對象的語言,基元值和復雜值都被視為對象。 Number數據類型可以表示整數,無符號整數和浮點數。為了盡可能提高性能,應將Number數據類型僅用于浮點數,或者用于int和uint類型無法存儲的大于32位的整數值。
void數據類型僅包含一個值:“undefined”,表示未聲明類型的變量類型。 字面值是最簡單的數據形式,是直接出現在代碼中的值 在ActionScript 3.0中,聲明變量必須使用var關鍵字顯式聲明。 var 變量名標識符:數據類型 通常,在聲明變量的同時為變量賦值的方法,在創建數組或是實例化類的實例時最為常用。
變量的作用域 變量的作用域是指,能夠通過引用變量名來訪問相應變量值的代碼區域。全局變量是指在代碼的所有區域都能訪問的變量,局部變量是指盡在代碼某個部分方能訪問的變量。 變量的作用域同變量的聲明位置息息相關。
多級條件流程 for...in循環是for循環的變體。循環的運行將基于復雜對象的屬性遍歷。 var myArray:Array = {1, "two", true}; for (var i:String in myArray) { trace("Array child : " + i); trace(myArray[i] + " is :"+ typeof(myArray[i])); }
函數的定義 函數在ActionScript中始終扮演著極為重要的角色,將有效的輸入值變換為唯一的輸出值 在ActionScript 3.0中可通過兩種方法定義函數,使用函數語句和使用函數表達式。函數語句總是以function關鍵字開頭。在函數語句中,包含函數的四個要素: (1)函數名,不可以重載 (2)參數,逗號分隔,參數列表 (3)函數體,{}括起來的AS3代碼部分 (4)返回值,只能有一個 在ActionScript 3.0中函數的定義位置非常寬松,編譯器會像對待變量聲明一樣對待函數定義。函數的定義聲明將被提升。
arguments對象可以代指函數的參數列表。它本身是一個數組,儲存了函數的所有參數。
第六章 面向對象編程
本章著重介紹面向對象的一般性概念和知識。掌握了這些,就等于打開了ActionScript 3.0內部寶庫的金鑰匙。 從根本上講,OOP是一種基于過程和邏輯的編程模式。面向過程的模式是一種最基本的開發模式。面向對象的編程模式則強調將問題分解為不同的模塊,用類和對象的概念去分析和組織。
包和命名空間是兩個相關的概念,包的名稱類似于命名空間,在包內聲明的對象具有相同的包命令空間。 可以有多個對象共同屬于同一個包。 通常,import語句越具體越好,建議避免導入該類所屬的整個包,因為過多的導入類會增加編譯器的搜索負擔,降低編譯效率 在正確導入類或是包之后,可以使用類的完全限定名稱,也可以只使用類名稱本身,建議使用后者 包的機制可以完美地區分不同包中的同名類。包的使用是必要的技術。
包和命名空間 在ActionScript 3.0中,包是用命名空間實現的,但包和命名空間并不同義。使用命名空間同包沒有必然的關系,它們既不共生,也不排斥。 包可用于組織類文件。 每個包可以包含許多各類文件,這些類文件都應該存儲在同一個文件夾下面。每一個類文件聲明一個公共類,該類的名稱同該文件的名稱相同。 如果要訪問某個包中的某個類,則編譯器將按照包的名稱查找路徑中的相應文件夾,然后在該文件夾中搜索以該類名稱命名的as文件。Flash就采取的是這種策略管理類文件。
區分包的概念和類繼承 具有繼承關系的類可以分布于同一個包中,也可以分布于多個包中。同時,位于同一個包中的兩個類僅是具有共同的命名空間,其它方面都不必相關。 創建包時,該包的所有成員的默認訪問說明符時internal,默認僅對所在包的其它成員可見。如果希望某個類對包外部的代碼可用,則必須將該類聲明為public。
利用包組織代碼 包的特性決定了它最重要的作用是組織代碼并防止命名沖突。 允許一個源文件中包括多個類,每個文件中應該只有一個類可供該文件外部的代碼使用。這些類將僅在該文件中可用,對該源文件外部的代碼,它們不可見。 包的樹狀結構對應文件存儲系統的文件夾樹狀結構。多級別包結構使用.運算符,類似java,比如類 global.content.terra.civ 對應文件global/content/terra/civ.as,可以用包將代碼組織成直觀的分層結構,以供其他程序員使用。
import視為編譯器的指向牌,幫助編譯器尋找類的聲明。 ActionScript 3.0在包,類和源文件的組織方式上具有很大的靈活性。
繼承訪問控制 四個內建的訪問控制關鍵字 public,protected,private,internal public屬性,對所有位置的代碼可見 protected屬性,對子類可見,不管子類和基類是否在同一個包中 private屬性,對本類可見,子類不可見 internal屬性,對同一包中的子類可見
方法的繼承覆蓋 類繼承機制僅支持繼承覆蓋,使用override聲明,靜態方法不能繼承,也不能覆蓋。 繼承覆蓋需要具備兩個條件: 該方法必須是可以改寫的,就是不能使用final關鍵字聲明。 該方法必須是子類可以訪問的,不能使用private關鍵字聲明 ActionScript 3.0的編譯器僅根據參數數量與參數順序辨別方法,并不參考參數的名稱。
屬性的繼承覆蓋 非私有的實例屬性可以被繼承,但是不能被覆蓋。只有聲明靜態成員時,可以不理會父類中的同名屬性。 靜態屬性必須使用類的名稱來訪問,而不是實例的名稱。這樣在代碼調用成員時,不可能出現靜態成員同實例成員的混淆。 唯一可以覆蓋的成員是方法成員,也就是那些使用function關鍵字聲明的成員。鑒于方法重載的諸多限制,所以在子類中重載父類的setter/getter存取器并不能完成重新定義屬性成員的任務。
關鍵字super 關鍵字super提供了對父類的直接引用,使用使用super()調用父類的構造函數,也可以使用super.成員名稱的形式引用父類的成員。 注意: super關鍵字僅保留距離被引用子類最近的父類的引用,不能講super理解為父類的引用。將super關鍵字連用以訪問繼承樹頂層的基類,是不成立的。 在子類的構造函數中,可以使用super()的形式顯式調用父類的構造函數,也可以省略,編譯器會自動在構造函數的第一行之前添加super()。顯式添加的優勢是,能夠人工的控制調用父類構造函數的時機, 這在有些代碼中是非常關鍵的。 在子類構造函數中任何形如super.成員名稱的調用都應該在調用super()之后出現,否則后果不可預料。
多態 多態就是讓這些不同行為的方法采用同一個方法名。這里偏重廣義的多態,指根據不同的類使用相同方法名。嚴格意義上應該視作一種繼承覆蓋。 使用繼承實現多態,具體的實現方式是允許子類繼承和重新定義并覆蓋基類中的方法。 ActionScript 3.0的類繼承是以覆蓋形式實現對父類同名方法的改寫。
靜態成員和作用域鏈 只能通過定義靜態成員的類名稱來訪問靜態屬性, 類名稱.靜態成員名稱。 允許使用與靜態屬性相同的名稱定義實例屬性。可以在靜態屬性所在的類中定義同名實例成員,也可以在子類中定義同名的實例成員。調用時,同名實例成員的優先級更高。 在定義靜態屬性的類體及該類的任何子類中,可直接訪問靜態成員,而不必拘泥于“類名稱.靜態成員名稱”形式。 靜態成員總是比實例成員更靠前,更優先被調用,但是使用類名稱.靜態成員名稱也可以準備訪問到靜態成員。
面向對象進階 這些內容比較抽象,需要具備一定的理論基礎。但是在程序開發中又屬于常見內容。
聯合繼承 聯合繼承,就是一個子類可以同時擁有多個父類。通過子類,便可以將多個父類聯合起來,在子類中共享多個父類的機能。 一個父類可以擁有多個派生類,一個派生類可以具有多個父類。 聯合繼承得到的子類應該包含任何一個父類的共用成員,這就使子類可以充當父類的角色。 聯合繼承的問題 支持聯合繼承的語言中,都會引入嚴格的封包機制,以限制名稱訪問的沖突,聯合繼承在運行時的開銷非常大。 下面的寫法是錯誤的
class multi_inherit extends base1, base2{}
在ActionScript 3.0中,聯合繼承沒有得到直接的支持,但是利用接口概念可以變相實現聯合繼承。
接口的概念 接口是一種特殊的類,只包含方法的聲明,沒有方法的實現。利用普通類將接口中的聲明實現,稱為實現接口。該類相應稱為接口的實現。 接口類似C++語言中的h文件,具體的實現要在cpp文件中提供。
接口和接口的實現不是繼承關系,一個接口的多個實現可以是完全不相關的類,而接口的作用就是零這些不相關的對象具有通用的方法,能夠方便地彼此通信。 ActionScript 3.0的核心類隨著Flash和Flex的發布,供全世界開發者重復使用。核心類的設計原則之一就是方法名稱的統一。 FlashPlayerAPI定義了IEventDispatcher接口,其中包含的方法聲明可供類處理事件對象。 public interface IEventDispatcher{} EventDispatcher類實現了IEventDispatcher接口。 public class EventDispatcher implements IEventDispatcher{}
采用接口比在基類中定義空函數擁有更廣泛的用途。在基類中定義空函數,只能保證繼承樹內的類可以使用,接口不參與繼承機制,不必受繼承樹的限制。 不同繼承樹中的類,可以是同一接口的不同實現。 在調用時,可以查詢一個類是否是某個接口的實現。 接口是一種抽象類,接口可以歸屬于任何包中,接口定義應該位于包的頂級,接口不能嵌套。可以為接口指定命名空間,在一個包中,可以包含多個接口。 一個接口內,可以提供多種方法。接口中的方法應盡量避免與可能的類名稱沖突。接口中定義的方法聲明不能包含任何訪問控制說明符(public, private等),也不要包含final關鍵字。 只能使用public和internal訪問控制說明符來修飾接口定義。
接口和類的最大區別是: 接口中不能包含變量和常數,如果要提供對屬性成員操作的統一限制,建議在方法內包含setter和getter存取器,存取器將被視作方法看待。 接口可以繼承,使用extends關鍵字,支持聯合繼承,一個接口可擴展為一個或多個其他接口,只要逗號分隔開就行。
FlashPlayerAPI遵循一種約定,接口名都以大寫字母I開始。
接口實現 在ActionScript 3.0中,接口需要使用類實現。實現某個接口的類,與普通類沒有本質區別 class 類名 implements 接口名{ //類體 } 在一個類中,可以聯合使用implements和extends關鍵字。聯合接口實現類將兩個接口的方法整合在一個類中。過分別通過這兩個接口的檢測。
接口方法實現遵循的原則 相同方法名 參數匹配 返回值一致 公共訪問權限
在運行時對接口進行選擇,檢測接口需要使用ActionScript 3.0內建的關鍵字is或是as,注意是實例不是類名稱的檢測。 trace(nearbycafe is Iservice);
is和as在檢查接口時效果是一樣的,區別在于: 當檢查成功,is返回true,as返回該對象本身;當檢查失敗時,is返回false,as返回null 關鍵字instanceof不能檢測接口及接口的實現。
接口使用技巧 利用接口的聯合來實現類的聯合繼承(變相實現)。利用include分離公共接口代碼實現,做到重用。
抽象類的內部機制 ActionScript 是一種基于原型的語言, 類和對象逐漸成為腳本語言的核心內容。ActionScript 3.0引入了新的繼承對象:traits對象。 深入研究使我們始終不能回避一個問題: ActionScript 3.0中類的本質是什么? 在ActionScript 3.0中,有兩種構建類的方法,一種方法是利用class關鍵字,另一種是傳統的方式,利用function關鍵字,兩種方式的結果一樣。 (以后需要仔細研究)
動態類 動態庫是一種特殊類,具有開發式的成員定義機制。未使用dynamic關鍵字定義的普通類稱為封裝類。 創建動態類的實例時,會為其創建一個Hash表,用來記載動態添加的成員,Hash表將占用額外的內存。 動態類僅允許修改類的對象,為對象添加成員,并不能改變類定義本身,不能為類添加動態成員。 動態添加的屬性僅限當前實例使用,并不能在類的所有對象實例中分享。在運行時動態添加,在編譯時并不存在。動態成員不享有類內部成員的待遇,不能訪問類的私有成員。 dynamic屬性不由子類繼承,若動態類作為基類,其子類不自動具備動態性。只有添加了dynamic關鍵字,動態類的子類才是動態的。動態成員僅在運行時添加,在編譯階段不能檢查其數據類型。 在運行時,由Flash Player會對動態成員進行類型檢查,使用動態成員要非常小心,以免引發運行時錯誤。
使用dynamic關鍵字定義動態類 添加的動態成員可以是屬性,也可以是方法。執行效率比內部方法低。
動態方法 動態方法必須以函數表達式的形式添加。具體而言,有三種方式。 函數語句 函數變量 函數表達式 直接使用函數表達式對動態類的動態成員賦值。
成員檢查 使用關鍵字in執行成員檢查,保證成員不被非法訪問,用法如下: 實例成員名稱 in 對象名稱 靜態成員名稱 in 類名稱 使用in關鍵字只能檢測到可訪問的公共成員 使用in來判斷數組是否包含某個索引號的元素,或是是否含有某個字符串 var myary:Array=new Array(12,31,34); trace(2 in myary); //true trace(5 in myary); //false
Talii.qiaqia=105; var mystr:String="qiaqia"; trace(mystr in Talii);
刪除動態成員 使用delete關鍵字顯式地刪除一個動態成員,不能使用delete刪除非動態成員。用法如下: delete 對象名.成員名 一旦成員被刪除,則成員中原有的值便不可訪問: Talii.phorny=1492; trace(delete Talii.phorny); //true trace(Talii.phorny); //false trace("phorny" in Talii); //false 還可以刪除動態方法 Talii.outerfunc=function(){ trace("add a function out"); } Talii.outerfunc(); trace(delete Talii.outerfunc); //true Talii.outerfunc(); //error
事實上delete只是減少引用次數。 刪除一個非動態成員,請為其直接賦null。如果一個對象失去了所有的引用,則該對象會被標記為“可回收”,并在內存管理時被釋放。 ActionScript 3.0是一種自動內存管理的語言,其內存管理全部由FlashPlayer處理。
動態靜態成員 運行時在類定義之外,為一個動態類添加了一個靜態成員,則該成員就是一個“動態靜態成員”,必須在運行時添加到類名稱上。 這種情況,僅是用于個別特殊場合。動態靜態成員在父類外部代碼中是公開可見的,但是對于該屬性對于外部代碼是公開的。 運行時的特殊需要 可以使用delete刪除,有利于減少內存占用 歸類管理相關數據 使用較少的全局變量,是一種很好的編程習慣。 避免被子類繼承 如果想避免子類中的非法調用,同時情況特殊不便于使用private關鍵字,則可以使用“動態靜態成員”解決
第七章 AS3常用對象
字典Dictionary其實就是關聯數組,對象作為鍵,值可以使任意類型。字典在Flash的開發中比較有用。使用字典的主要用途就是建立對象之間的映射。 Adobe Flash Player使用垃圾回收系統來恢復不再使用的內存,依據是對象的引用計數。
顯示列表是Flash應用程序的重要對象,顯示列表包含Flash應用程序中的所有可視化元素,是一個樹狀結構。 當操作顯示列表時,FlashPlayer自動管理顯示對象的深度,也就是間接管理對象的z順序。 在Flash中,顯示在舞臺上的所有元件都是顯示對象,但是顯示對象也可以不出現在舞臺上。 顯示對象,是指,ActionScript 3.0中顯示類的實例對象,顯示類包括核心類DisplayObject的所有子類,以及這些子類的用戶自定義子類。 flash.display包中,包括了大多數常用的顯示類,還有一些顯示對象分散收錄于flash.text,flash.media包中。 該樹非常重要,請務必牢記。
如果顯示對象容器被置于屏幕上,那么該顯示對象容器包含的所有元件都會顯示在屏幕上面。顯示對象容器具有批量操作的優勢,避免對一系列對象重復的操作。
Flash在處理基元值時,開銷比較小,應該盡量使用基元值集合中的數據類型,以提高Flash的執行效率。
null和“”的區別 值為null的String變量并不占用內存資源,而如果一個值為“”的String,該變量會被初始化。使用==運算符可以檢查出null值和空字符串""的不同。
顯示列表 顯示列表在每個swf應用中只有一個且必然有一個,舞臺是顯示列表的根,顯示列表中的顯示對象如果不出現在舞臺范圍內,則該對象顯然是不可見的。 顯示對象基本上都可以經過設置alpha屬性而成為完全透明的。顯示對象列表中,除了位于最枝節的對象外,都是顯示對象容器。 顯示對象的主要部分都是由Sprite,MovieClip,Loader構成的。
第八章 腳本動畫基礎
第九章 動畫進階和腳本仿真
第十章 影片剪輯與圖形圖像
在ActionScript 3中,所有的影片剪輯MovieClip其實都是類的實例對象。對于影片剪輯,時間軸其實是一種基于計時器的switch類似的結構。 對于Flex和FlashDevelop這些沒有時間軸編輯窗口的開發工具,直接在代碼中管理Timer是創建動畫的最佳方式。直接使用語言內置的時間軸機制,就必須使用MovieClip。使用MovieClip有四種方式: 任何以MovieClip類為基類的子類都會繼承MovieClip中的時間軸機制。可以為時間軸上的任何幀分配幀標簽。幀標簽是字符串,不是標識符,不需要遵循ActionScript 3.0的標識符規則。使用幀標簽比使用幀編號具有明顯優勢。
ActionScript 3.0包括FrameLabel類,其每個實例均代表一個幀標簽,并有一個name屬性和一個frame屬性。幀標簽只能在設計階段指定和修改。
回調API是SWF應用程序的通用技術。矢量圖和點陣圖。 點陣圖(位圖)體積過大,適于描述復雜的色彩和信息,但是不利于網絡傳輸,難于創建靈活的動畫。位圖常見的文件格式:bmp,jpg,gif,tga,png,主要區別在于使用不同類型的壓縮算法。 矢量圖是使用數學算法解釋的,因此存儲信息少,在運行時根據較少的信息還原為屏幕顯示,需要計算機具有較高的運算能力。矢量圖形是Flash的靈魂,適于制作變形動畫,較小的體積也利用網絡傳播。 矢量圖基于簡單的算法和基本的形狀,最權威的工具是Adobe Illustrator。 Flash基于簡單的矢量繪制能力,ActionScript的繪圖API基于同樣的思想進行設計。可以用ActionScript的語句定義矢量圖形的繪制過程,在swf文件運行,就是矢量圖形在屏幕上繪制和顯示的過程。 ActionScript 3.0的繪圖API主要集中在flash.display包中的Graphic類,該類提供了不同的繪圖功能。 在ActionScript進行矢量繪圖,總是依賴于某個對象實例,然后調用該對象中的Graphics成員進行繪制。 在Shape,Sprite或MovieClip類中,都包含Graphics類的實例作為屬性成員,以供開發者繪圖時調用。可以在自定義類中包含一個Graphics對象。Graphics類包含用于繪制線條,填充和形狀的屬性和方法。 Shape實例的性能優于其他用于繪制的顯示對象,因為它不會產生Sprite和MovieClip類附加功能的開銷。 Graphics.lineTo(), 起始位置默認為舞臺左上角的(0,0), 連續調用可繪制出一序列首尾相連的線段。 手動指定線段的開始位置,使用moveTo()方法。使用Graphic.lineStyle()方法指定線條樣式。 carv.graphices.lineStyle(14, 0xff3300, 1) 指定該線條為14像素寬,顏色為“0xff3300”,透明度為1 繪制曲線curveTo(),4個參數,控制點的x,y坐標,錨點的x,y坐標,控制點僅影響曲線的走向,并不出現在曲線之上 在繪圖前必須指定填充樣式,在ActionScript 3.0繪圖API中,具有三種類型的填充:單色填充,漸變填充,位圖填充 在ActionScript 3.0內部, 位圖是使用bitmap類和BitmapData類管理和操作
Adobe Flash Player支持的位圖圖像格式有jpg,gif,png JPG圖像不包括透明度 PNG可以使用通用的無損壓縮算法,其體積比BMP小得多。但是PNG的體積一般還是比JPG大,還不能完全取代JPG。PNG的多級透明度也能使邊緣顯得更加平滑。 無論是GIF,PNG,JPG都僅僅是位圖的外部格式,在內存中,它們都被解碼并轉化為最基本的像素矩陣,以Bitmap形式存儲。BitmapData類中復制了此額外透明度像素字節。
在ActionScript 3.0中提供了一個專用的類:Loader類,可以處理外部swf文件和圖像的加載任務。 Loader.load()加載外部文件,兩個參數,第一個參數是文件地址,必須指定,必須是標準的URLRequest對象,第二個參數,可以省略是安全設置。
URLRequest類是ActionScript 3.0重要類,提供了對地址和的標準化存儲和操作。精簡代碼 var Sharploader:Loader = new Loader(); Sharploader.load( new URLRequest("data/f1.jpg")); 為了確保加載完畢,需要添加對Event.COMPLETE事件的響應,使用Loader的contentLoaderInfo屬性處理此消息,contentLoaderInfo屬性是LoaderInfo類的實例,該屬性指向被加載對象并處理被加載對象的信息。 下面的代碼演示了Loader類加載外部圖像時,如何進行消息偵聽。
總是應該講BitmapData作為數據,交給專門處理位圖顯示的Bitmap類。Bitmap類可視為BitmapData對象的舞臺包裝。 利用Bitmap和BitmapData類,可以擺脫對外部數據的依賴,直接在代碼中創建位圖圖像。
文本不等于字符串,是指舞臺上的顯示對象。 若要在屏幕上顯示文本,在Adobe Flash player中使用TextField類。TextField類是Flash創作環境中的提供的文本操作類。該類要解決的問題是如何將String字符串類數據顯示在屏幕上。 在處理文本顯示時,TextField成為不二之選。在ActionScript 3.0中,文本操作的功能已經相當成熟了。 在flash.text包中還提供了許多輔助的類,例如TextFormat類和StyleSheet類。如果要設置復雜的文本格式,可以使用TextFormat類,TextField對象能接受TextFormat對象,并根據TextFormat對象提供的信息,改變文本自動的顯示格式。快速分析和顯示HTML是Flash的重要功能。
第十一章 事件與交互
事件機制是ActionScript 3.0的頸骨,代碼的執行,一刻也不離不開事件。Flash中的每一個動作周圍,都有事件的影子。ActionScript提供了多個類來處理SWF同運行環境的交互。 事件的處理和操作滲透進ActionScript 3.0的方方面面,很難使用一個基類來定義。 事件偵聽器并不僅檢查和偵聽事件,更主要的功能是處理事件。事件響應機制更趨向于標準的DOM結構。 事件的發送管理是Flash Player的自動機制,所有的機制由“FlashPlayer事件管理中心”統一管理。 在一個對象中可以為多個事件添加偵聽器,也可以為某個事件添加多個偵聽器。 事件的分發路徑稱為事件流,不同的事件具有不同的事件流。按照事件流的流向,將事件流分為三個階段: 1)捕獲階段 2)目標階段 3)冒泡階段 并非每個事件都參與事件流的所有三個階段
Event類 事件本身也是對象,利用類來定義。在ActionScript 3.0中,所有的事件都以Event類為超類,例如MouseEvent和TimerEvent都是子事件類。 Event類的實例屬性描述了事件對象的相關信息,這些屬性都是只讀的。 currentTarget 當前對象, target事件目標, Flash Player API自身定義了多個Event子類
IEventDispatcher接口處理有關事件的方法定義。EventDispatcher類實現了IEventDispatch接口,顯示列表上的任何對象都可以使用IEventDispatcher接口的方法。 如果在自定義類中需要操作事件,最簡單方法是擴展EventDispatcher類,這樣就不需要自己編寫IEventDispatcher接口的方法 IEventDispatcher接口的事件方法定義中,包括添加事件偵聽器的方法,addEventListener(),至少提供兩個參數,事件類型和事件偵聽器名稱。
事件偵聽器是一個函數或是方法,應該包含一個事件對象參數,并具有void類型的返回值。 removeEventListener()方法,從對象中刪除事件偵聽器。 dispatchEvent()主動將事件對象派發到事件流中
查詢系統信息的主要類是flash.system包中的Capabilities類。該類提供了一些屬性,這些屬性描述了播放swf文件的客戶端系統信息。
第十二章 使用外部數據
ActionScript 3.0應用程序最終能編譯為一個swf文件。根據具體情況,可以選擇性的將數據置于swf文件之外。swf文件通過與外部交互數據,獲得新的信息,指令和資源。從應用的角度看,數據的不同種類產生了豐富的程序功能。開發者必須掌握如何讀取,分析和操作外部數據。 媒體資源數據包括聲音,圖像,視頻,其它swf應用等類型,資源數據未必是磁盤文件,從攝像頭和麥克風獲取的持續數據流,也是一種動態資源數據。
Flash可以播放FLV格式的視頻資源,可以存放在本地,也可以部署在遠程網絡服務器。使用FLVPlayback類,幾乎可以完成視頻播放的所有操作,包括漸進式下載的Flash視頻文件,也可以播放流式加載的FLV文件。 FLVPlayback將各種功能高度集成和封裝。沒有提供直接調用的快進和快退方法。使用FLVPlayback之前需要 import fl.video.* Video類和VideoPlayer類需要配合相關的處理數據傳輸的類,才能完成視頻的讀取和播放。
在ActionScript 3.0中,聲音的播放和控制的類主要集中在flash.media包中,其中,最重要的聲音類是Sound類。該類負責處理聲音的加載,管理基本聲音屬性,以及啟動聲音播放。 播放的每種聲音具有其自己的SoundChannel對象,它控制聲音左右聲道的音量和播放進度。 SoundChannel對象在調用Sound類的Play()方法時被自動創建并作為返回值提供 使用SoundTransform類配合SoundChannel對象控制音量。
URLLoader類加載文本或二進制數據,Loader類可用于加載swf文件或是圖像(JPG, PNG,或GIF)文件 每個Loader只負責加載一個外部數據,Loader作為一個顯示對象容器,本身支持被加入其它的顯示對象容器。開發者利用addChild()方法將Loader對象裝入舞臺顯示列表。
加載圖像有不同的選擇,可以在TextField中利用HTML標記裝載圖像,也可以利用位圖顯示對象實現舞臺的顯示。 為了避免內存泄露,應盡量避免直接使用打開的圖像文件,而是將打開的文件寫入新的位圖副本,并關閉Loader對象,釋放位圖緩存。
通過外部文本和XML文件,能為SWF問題提供變量和內容,存放程序的配置信息, 使用URLLoader時,需要等到整個文件下載完成之后,才能訪問URLLoader數據。有關下載進度的通知事件,通過bytesLoaded和bytesTotal屬性,以及已調度的事件,可以監視文本的下載進度。 URLVariables類是一個輔助類,定義了處理URL字符串的常見方法。URL字符串由變量名和變量值組成,使用&相連。URLVariables對象可以使用.運算符連接任何名稱。屬性未定義時,按未定義處理。 URLLoader加載外部文本需要利用許多字符串的處理技巧。 var myid:URLLoader=new URLLoader(); myid.dataFormat=URLLoaderDataFormat.VARIABLES;
更清晰地定義外部數據,需要利用XML文件。在ActionScript 3.0中創建XML對象非常簡單,可以使用XML類的構造函數,直接將一個XML格式的字符串轉化為XML對象。XML的操作非常簡單。 XMLList實例可以包含完整的XML文檔,XML片段或是XML查詢結果。 精簡的代碼片段 var x:XML; (new URLLoader(new URLRequest("xsample.xml"))).addEventListner("complete", xl); function xl(et:Event):void{ x = XML(et.target.data); }
URLStream類提供了對下載的低級訪問,下載文件內容作為原始二進制數據提供。可以提前關閉URLStream流的下載。
Flash Player對磁盤讀寫受到很多限制,為了保存信息,需要借助于共享對象和FileReference類。使用ShareObject類管理數據共享對象,也可以將共享數據對象存放到服務器端,編譯在多個操作系統和不同計算機之間共享數據。 ShareObject對象有Flash Player自動創建,該類提供一個getLocal()和getRemote()方法,分別訪問本地和遠程的數據共享對象。 盡量將數據共享對象作為優化程序用戶體驗的方法,而不是左右程序功能和行為的關鍵技術。 本地存儲和遠程存儲各有利弊: 本地存儲不利于機器之間的數據共享,不能保證操作系統之間的數據共享,用戶數據缺乏統一的官網和備份; 遠程存儲必須保證網絡連接暢通,網絡傳輸的不穩定不利于程序的平穩運行。 ActionScript 3.0提供了雙重存儲機制,可同時本地和遠程永久存儲,建立遠程和客戶端的雙向副本。
網絡通信 網絡通信有很多類負責: FileReference類,Socket類,XMLSocket類,NetConnection類,NetStream類 套接字連接分為兩大類:二進制數據的套接字連接,XML數據的套接字連接,前者是Socket類,格式化文本傳輸,使用XMLSocket類
Socket套接字類 使用Socket類與服務器的二進制協議通信非常容易。連接成功后發送Event.CONNECT事件。當服務器關閉連接時,Flash player會接收到Event.CLOSE事件通知。 使用flush()方法,對套接字輸出緩沖區中積累的所有數據進行刷新。 XMLSocket是一個低層次的通信對象,能夠提供較低級別的讀寫控制。XMLSocket類存在的意義在于它實現了XML信息的套接字操作,XML消息通過全雙工TCP/IP 流套接字連接發送。應用場景比如,多用戶聊天室程序。在XML對象和文檔的層面發送和接收消息。
FileReference類提供了在用戶計算機和服務器之間上傳和下載文件的方法。upload方法上傳該文件,播放器正式支持的上傳或下載文件大小是100MB。 FileReferenceList類選擇了一個或是多個要上載文件的方法。 出于安全性考慮,Flash Player對于磁盤的操作非常有限。
許多遠程通信的操作都需要服務器端的支持,開發者需要了解常見的協議,并熟悉網絡環境下的異步操作。ActionScript 3.0提供 了強大的低端類和容易使用的高端類,以滿足不同場合和不同開發需求的要求。
第十五章 全屏幕FLV視頻播放器
為了在客戶端Flash應用程序中創建視頻回放,需要使用多個底層類 Video類 flash播放視頻的基本類,舞臺上的實際視頻內容框是video類的一個實例。Video類是低端的視頻處理類,不包括界面控制和網絡連接控制功能。開發者需要使用NetConnection類和NetStream類, 完成網絡連接和視頻數據加載的相關操作。若有播放視頻流,需要使用NetStream類的attachNetStream()方法,將視頻數據附加到Video對象上,Video對象將回放該NetStream流中的視頻數據。 Video類為開發者提供了底層的控制能力,適合開發具有嚴格文件體積現在和特殊自定義功能的視頻播放器。
NetConnection類 該對象是到視頻文件的連接,可以將其視為視頻數據饋送的通道。定義連接的相關選項,并不會打開具體的視頻文件。該類主要實現與視頻服務器的協作。除了FMS,還可以連接標準的HTTP服務器,借助HTTP協議漸進式 下載視頻文件。
NetStream類 在加載視頻文件時,ActionScript 3.0使用NetStream對象實例來控制視頻源。NetConnection對象通常和NetStream對象一起使用,因為創建一個NetStream對象需要NetConnection對象作為參數。 NetStream類通過NetConnection對象提供的連接,打開FlashPlayer與服務器或本地文件系統之間的單向流連接。
連接創立后,需要使用NetStream對象打開具體的數據流,傳輸某個視頻文件中的數據。類似NetConnection對象中的一個通道。該通道可以使用NetStream.publish()發布音視頻數據,也可以使用 NetStream.play()加載接收數據。
根據FLV文件的存儲方式,指定視頻部署方式 1)本地計算機上, 2)從標準web服務器上漸進式下載 3)從FMS流式加載
根據FlashPlayer安全機制,Flash Player可以播放與swf文件存儲于同一個目錄中或存儲于其子目錄中的本地FLV文件,或是播放具有絕對地址的遠程FLV視頻文件,但是不能訪問swf文件所在的目錄的上級目錄。 在自定義類中使用Video類,需要使用該類的導入聲明 import flash.media.video;
不需要視頻服務器,播放本地文件,使用 connection.connect(null); NetStream對象和NetConnection對象發出的事件不同,但是可共用一個事件偵聽回調函數,在switch時判斷發生的事件就可以了。
利用包命名空間限制不同控制類的訪問,這種換膚機制在文件管理和編譯時都非常方便。? Video類自身不提供視頻的控制方法,控制視頻的暫停,繼續,應該利用NetStream類提供的pause()方法和resume()方法 類文件只是一個文本文件,不能在其中包含任何資源,而FLA文件是一個復合文件,包含許多資源內容。一旦FLA文件中導入了組件資源,就可以在自定義類中使用這些組件。
NetStream.time記錄當前播放位置 NetStream.seek()跳轉到視頻流中的指定位置 NetStream.close()關閉視頻流,不可恢復播放,還會刪除已通過HTTP下載的FLV文件的本地副本
onMetaData() 將視頻元數據作為對象參數傳入,被內部處理,Flash Player自動響應該事件,這種內部機制一般稱為系統回調。 為了操作視頻元數據,開發者只能創建一個自定義回調函數,并讓Flash Player使用自定義的回調函數,為了綁定NetStream,需要利用NetStream.client屬性來確定視頻流的回調對象。 函數表達式可以在函數內部定義,這是非常方便的語法特性。
追蹤播放進度需要三個量: 起始時間,終止時間,以及當前時間 隨著視頻的播放,滑塊的進度會相應地改變。 NetStream類中提供了bufferTime屬性控制緩沖區大小,默認0.1秒,為了流暢播放,可以設置更大些。當前緩沖區中的數據量為bufferLength,也以秒數為單位。通過這兩個量,可以確定當前緩沖區的加載情況。 NetStream.bytesLoaded屬性,獲取當前加載的數據量,bytesTotal屬性,表示當前加載文件的總字節大小。這兩個量計算出當前加載量的百分比。
取得播放時長是個很耗時的工作,目前普遍的做法是在壓縮的過程中,將總時長直接寫入FLV的元數據。開發人員不能過分依賴該量,因為是預先寫入的。bytesTotal屬性是FLV文件的大小,具有穩定性,可以動態判斷。 全屏模式還是要受Flash Player版本的限制,如果使用ActionScript 3.0,Flash Player版本必須高于9.0才能正常播放。全屏模式下的運行技術已經非常成熟。不同的FlashPlayer版本對視頻的回放有著巨大的影響。 保證客戶端Flash Player播放器能夠使用硬件加速非常重要。視頻回放的解碼工作可以在多個線程中進行,并且真正支持多個CPU內核。
當swf嵌入網頁是,必須設置allowFullScreen屬性為true時,才能起到Flash Player的全屏模式支持。 flash.display.StageDisplayState類只包括兩個常量,必須在用戶的交互事件中設置。 進入全屏模式,Flash Player會出現自動安全警告,告訴用戶使用ESC鍵可以退出全屏。 全屏模式下,鍵盤無法控制,只有鼠標。標準模式向全屏模式的變化是一種線性映射,使用Stage.scaleMode屬性控制這種投影機制。
總結
以上是生活随笔為你收集整理的《ActionScript 3.0权威指南》阅读笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Win 8.1上安装配置FlashDe
- 下一篇: 在Ubuntu 14.04 64bit上