《Flash ActionScript 3殿堂之路》讀書筆記


本讀書筆記根據孫毅的《Flash ActionScript 3殿堂之路》整理而成。全書分成五個部分:(1)ActionScript3語言基礎(2)ActionScript3面向對象編程(3)ActionScript3核心類(4)ActionScript3主要的Flash Player API(5)ActionScript3視頻編程。本讀書筆記應該掌握的知識而采用問答的方式進行整理。

 1.ActionScript 3中的數據類型有哪幾種類型?

答:ActionScript 3的數據類型分為基元數據類型和復雜數據類型。ActionScript 3中預定義的基元數據類型一共有:Boolean,int,Number、String和unit。經常用到的ActionScript 3復雜數據類型有:Array、Data、Error、Function、RegExp、XML和XMLList。我們自己定義的類也全部屬於復雜數據類型。

2.值類型和引用類型的區別?

答:值類型直接存儲值;而引用類型存儲引用,指向要操作的對象。ActionScript 3中值類型只有Boolean、int、Number、String和unit這幾種,其余的數據類型就全是引用類型。還有一個典型的特征:值類型的數據不用new關鍵字來創建;必須使用new關鍵字創建的一定不是值類型。值類型和引用類型的行為有這么大的區別原因就在於,引用類型數據儲存的是引用。在ActionScript 3中,值類型變量持有的是指向值類型數據的引用;引用變量持有的是指向引用類型數據的引用。

3.在ActionScript 3中關鍵字...(rest)的作用?

答:為了提供傳入任意參數的靈活性。只要在參數中定義了...(rest),那么就可以接受任意多的參數。這些參數,以數組形式保留在rest中。一旦使用了...(rest)關鍵字,那么arguments就不能再使用了。

4.靜態屬性和靜態方法的特點?

答:靜態屬性和靜態方法不依賴實例而獨立存在。簡單地說,即使不創建一個類的實例,我們也可以訪問到該類的靜態屬性和靜態方法。這一點就和實例屬性、實例方法完全不同。

靜態屬性:存儲所有對象共同的狀態,和任何實例都沒有關聯。每個對象的實例屬性值可以各不相同,但所有同類對象的靜態屬性值都是一致的。改變一個對象的實例屬性不會影響另一個對象的實例屬性值,但改變一個類的靜態屬性值則會影響該類所有對象。

靜態方法:也是獨立於所有實例的。靜態方法只和每個類綁定,不和類的任何具體實例綁定。

靜態方法和靜態屬性只是為每個類創建一次,在這個類被調用時創建。與類實例是否創建、創建多少次沒有關系。

5.ActionScript 3一些特殊的知識點?

(1)final關鍵字可以避免類被繼承而被改寫。

(2)const將枚舉成員定義為常量,一旦定義不再改寫。

6.構造函數的特點?

答:在ActionScript 3中,創建對象時會自動調用構造函數;刪除則是由垃圾回收機按照自己計划自動執行。

在ActionScript中,構造函數必須要和類名相同。如果在類中沒有定義構造函數,那么編譯器在編譯時會自動生成一個默認的空的構造函數。

構造函數可以有參數,通過給構造函數傳入參數來初始化成員是很常見的做法。

構造函數不支持重載,ActionScript 3中的方法都不支持重載。

在ActionScript 3中,構造函數只能使用public訪問控制。private、protected、internal及其他所有自定義的命名空間都不能用於構造函數。

構造函數是一個特殊的方法,不能聲明返回類型,必須留空。構造函數不會返回任何值,只有當new關鍵字加上構造函數一起使用時才會返回類的實例。

7.Class的種類?

答:從是否可以動態添加實例屬性或方法,可以將類區分為動態類和密封類。動態類生成的實例可以在運行時動態添加實例屬性,而密封類不可以。從語法上區分的話,如果類名前有dynamic關鍵字,那么這個類就是動態類;如果沒有就是密封類。

8.this關鍵字

答:this關鍵字持有對當前對象的引用。

this關鍵字將各個實例屬性和方法綁定在了當前對象中,所以,對象的狀態才能在對象的內部邏輯中得以共享。

this關鍵字只限於實例屬性和實例方法。因為this關鍵字必須要指代一個具體的實例,而靜態方法和靜態屬性是不和任何實例相關聯的。因此this關鍵字不能用在靜態方法中,也不能用來訪問靜態屬性。

this關鍵字在如下三種情況下會用到。

(1)向第三方提供對象自身的引用。

(2eturn結合,在類方法中返回自身的引用。

(3部變量、方法參數、靜態屬性同名時,加上this關鍵字明確指定使用實例屬性。

9.封裝

答:ActionScript 3中的封裝包括:類的成員訪問控制、包和類的訪問控制、命名空間的使用。

封裝又叫隱藏現實,具體的意思就是將實現的細節隱藏起來,只將必要的功能接口對外開放。

封裝在代碼中的一種表現:類的創建者只將類的功能性接口對外公開,而將其他細節設為私有,對外不公開。

好的OPP程序,沒有流程執行先后的概念,只有代碼單元之間如何相互交流和協同工作的模式。這些代碼單元,又被稱為模塊。模塊在代碼中的表現形式是一個單獨的類或多個類。

從更本上說,降低復雜度才是封裝這個思想產生的最真實的原因。

 10.4個常用的訪問控制。

答:internal:如果一個類成員前面沒有加任何訪問控制符,那么將被默認為internal。它表示,只要是和當前類在同一個包中的其它類都可以訪問這個類成員。但是,不屬於同一個包的類是無法訪問到這個類成員的。所以,internal,又可被稱為包內訪問。其實質是封裝思想和package模塊化思想的體現。

public:在類成員前使用public訪問控制符,則是宣告在任何地方、任何對象都可以訪問這個類成員。

private:private修飾的類成員,成為私有成員,除了當前類中的成員,所有其他類的方法都不可以訪問到該成員,即使是同一個包中的類或擴展當前類的子類也不可以。對於復雜數據類型的屬性來說,private的封裝只是說不能通過當前類的實例來訪問,並不意味着這個屬性持有的引用所指向的對象不能被訪問。private訪問控制只是限制了直接訪問實例私有成員,卻不能阻止用引用來訪問私有屬性指向的對象。

protected:protected訪問控制與類的繼承有關。protected修飾的類成員只能被當前類和當前類的子類訪問,protected的訪問控制和package沒有關系,即使當前類和子類不在同一個包中,也可以訪問到protected類成員。

 11.類的訪問控制

答:在ActionScript 3中類的訪問控制只有兩種:包內可見internal(默認的)和包外可見public。

12.命名空間

答:引用命名空間的方式有兩種:一種是使用use namespace指令打開命名空間,另一種是使用命名限定符“::”直接指定命名空間。

如果使用namespace在類體中定義命名空間,則命名空間不是依賴於每個實例的,而是相當於一種靜態成員,屬於整個類。

use namespace 編譯時會被提前到前端。

use namespace指令不受上下文邏輯影響。

命名空間可以用於:(1)防止命名沖突(2)更靈活的訪問控制(3)實現不公開的API。

13.何時初始化復合的對象?

答:有3種選擇。(1)定義屬性時就初始化復合對象(餓漢式初始化)。(2)在構造函數中初始化。(3)在使用對象時再初始化。

14.靜態成員的繼承。

答:在ActionScript 3中,類的靜態成員不被子類繼承。靜態成員雖然不被子類繼承,但是在子類中可以訪問父類靜態成員。父類的靜態成員存在的范圍鏈包括父類和其所有子類。

15.繼承與重寫。

答:在子類中,經常要改變繼承自父類中的某個屬性或方法中的內容,但不改變名稱,從而達到子類同名方法實現不同功能的多態效果,這種方式叫做重寫(Override)。

在ActionScript 3中,只能重寫實例方法,不能重寫實例屬性。而靜態成員由於不能被繼承,如果要“重寫”,可以直接在子類中定義同名成員。

被關鍵字final定義過的實例方法不能被重寫,父類的private成員不能被重寫。

要成功重寫實例方法必須滿足以下幾個條件,缺一不可:必須用override關鍵字在行首標明這是重寫;子類中被重寫的方法要和父類的方法有同樣的訪問控制、同樣的參數數目和參數類型、同樣的返回值類類型。重寫的方法中定義的參數名稱不必與父類的方法相同。

不能重寫實例屬性,其主要意思是不能在子類中改變父類實例屬性的類型。這是一種很好的保障,確保使用父類的地方都可以替換成子類,即確保強制轉換始終有效。

16.簡述里氏代換原則

答:使用父類對象的地方,一定可以適用於其子類對象,而不會感到使用方法上有什么區別。實際上,這就是著名的里氏代換原則(Liskov Substituion Principle,LSP)的簡要表達。向上轉換是里氏代換原則的必備條件,里氏代換原則是繼承復用的基石。只有子類對象才可以真正替換掉父類對象,軟件功能不受影響,使父類達到正真的復用。利用子類不斷地在父類基礎上增加新的功能。

里氏代換原則准確描述:在一個程序中,將所有類型為A的對象,都換成類型為B的對象,而程序的行為沒有變化,那么類型B是類型A的子類型。注意,這里的類型不僅僅指類(Class),也包括接口(Interface)。

但要注意,里氏代換原則反過來不能成立,即使用子類對象的地方,不一定能替換成父類對象。

17.向下轉換和向上轉換

答:向上轉換,是將子類的對象當成父類的對象來使用。向下轉換的意思是,當一個子類對象以父類數據類型使用時,可以將它在還原成子類對象。

向上轉換是安全的,向下轉換是不安全的。

18.抽象類

答:在面向對象設計中,類分為具體類和抽象類兩種。具體類就是可以生成實例的類,抽象類是不需要生成實例的類。

簡單的說,當一個父類不需要生成自己的實例,只是用來繼承時,這個類就是抽象類。

抽象類,代表着子類的一些共同特征和行為。

一個理性的繼承架構設計中,所有的具體類都應該繼承於抽象類。

設計抽象類要掌握以下兩個原則:(1)抽想類應當擁有盡可能多的子類共同代碼。即將子類共同的行為,盡可能移動到抽象的父類中去。這樣代碼的重用率會得到很大的提高。只要改動抽象父類的代碼,所有子類的都會得到同樣的改變。

(2)抽象類中的數據能少則少。子類的狀態數據時,不應當存放於抽象的父類中。一方面會增大系統的開銷,另一方面也會給日后的改變帶來不必要的限制。

(3)抽象類中定義的抽象方法都必須在子類中重寫。

19.接口

答:接口的實際意義是,接口僅包含一組方法聲明,沒有具體的代碼實現。實現接口的類必須按照接口的定義實現這些方法,從而,實現同一個接口的類都具有這個接口的特征,接口如同協議,描述了實現接口的對象向外部的承諾。這樣其他的對象就可以根據這個協議和實現接口的對象交流。

能夠以其他數據類型向上轉型,是接口的核心。

要根據接口編程,而不是根據實現來編程。

20.數組

答:ActionScript 3中數組(Array)是以非零整數為索引的稀疏數組。不要求所有元素統一類型,不支持類型化數組。

(1)數組.length:數組長度。

(2)目標數組.indexOf(要查找的元素):indexOf按照索引值從小到大查找,一旦找到就立刻返回索引值。如果沒有找符合要求的元素,則返回整數值-1。

(3)目標數組.lastIndexOf(要找到的元素):lastIndexOf按照索引值從大到小查找,一旦找到就立刻返回索引值。如果沒有找符合要求的元素,則返回整數值-1。

(4)目標數組.indexOf(要查找的元素,查找的起始位置):indexOf從起始位置開始向數組尾部查詢。

(5)目標數組.lastIndexOf(要查找的元素,查找的起始位置):lastIndexOf則是從起始位置向數組頭部查詢。

(6)數組.push(元素):向數組尾部新增一個或多個元素。一個可以添加多個元素,元素之間用逗號隔開。

(7)數組.unshift(元素):在數組頭部新增一個或多個元素。一個可以添加多個元素,元素之間用逗號隔開。

(8)數組.pop():不需要參數,用於將數組最后一個元素刪除。返回值就是那個被刪除的元素。

(9)數組.shift():不需要參數,將數組第一個元素刪除,剩余元素索引值自動減1。返回值就是那個被刪除的元素。

(10)splice方法可以刪除數組當中的一個或多個連續的元素。splice有返回值,返回的是一個數組,包含的就是刪除的那些元素。splice改變了原數組的內容。一般有以下四種用途。

(I)數組.splice(刪除點的索引,要刪除的元素數目,新元素1,新元素2,...新元素n):從數組某位置開始,刪除指定數組的元素,並插入一些新元素。刪除點的索引值可以是負值,表示數組從尾部倒數的位置。比如,索引值-3,指的是數組倒數第三個元素。

(II)數組.splice(刪除點的索引,要刪除的元素數目):刪除數組中某位置之后幾個元素。

(III)數組.splice(刪除點索引):刪除數組中某位置之后所有元素。

(IV)數組.splice(刪除點索引,0,新元素1,新元素2...新元素n):在數組中某位置之后,插入新元素。

(11)獲取數組中部分元素:slice。slice可以獲取數組中一段連續的元素,而不改變原有數組的內容。它有兩個參數:一個是截取范圍的起點索引。另一個是截取范圍的終點索引。slice的起點和終點索引值都可以是負值。返回值是截取的元素組成的新數組,而且不改變原有數組的內容,新數組中包括起始點索引的元素,而不包括終點索引的元素。

(I)數組.slice(起始索引,終點索引)。如果輸入時,不慎將輸入的起點索引設置為大於終點索引值,那么slice只會返回一個空數組。

(II)數組.slice(起始索引)。如果只傳一個參數給slice,那么將把這個參數當成起始索引值,截取從這個索引值開始,到數組終點這一段元素,生成新數組。

(12)slice和splice的區別:

(I)slice不改變原有數組內容,splice改變

(II)slice根據指定起點和終點確定截取范圍,splice根據指定起點和截取數量確定截取范圍。

(13)將多個元素或數組拼和成新的數組:concat。

(I)concat可將多個元素或數組拼成一個新的數組,並通過返回值返回,不改變原有數組內容。

(II)數組.concat(參數1,參數2,參數3...參數n)

(14)concat和push比較

(I)concat相同之處:都是將參數中的元素按順序加到數組的后面。

(II)concat和push不同點:

(i)concat不改變原有數組內容,而是生成一個新數組返回。push直接改變原有數組內容。

(ii)當參數是數組時,concat和push的行為不同。concat會將數組分開成各個元素按順序加入,而push則把這個是數組的參數當成一個元素加入到原數組后面。

21.ActionScript3網絡通信三個過程

答:ActionScript3把一個成功的網絡通信抽象成以下過程:

(1)構建通信請求對象(URLRequest)

(2)使用通信請求對象,構建URLLoader對象,並發出數據請求。

(3)數據收到之后,發出完成事件,調用“讀取完成”事件的偵聽器處理返回的數據。

注:提交的數據放在URLRequest對象中,讀取到的數據放在URLLoader隊形中。

22.構建請求對象

答:要建立一個成功的通信請求,通信請求對象必須含有足夠的信息,必須知道要向誰請求、通過什么方式、有沒有要提交的數據。因此,這些信息包括:

(1)請求的URL地址:對應於URLRequest對象的url屬性。

(2)請求的方式:對應於method屬性,默認是GET方式。

注:(1)有兩種方式可選GET和POST,使用URLRequestMethod.GET和URLRequestMethod.POST常量賦值。GET傳送的數據量較小,不能大於2KB。POST傳送的數據量較大,一般被默認不受限制。而且,兩者傳遞參數時所用的編碼不一定是一樣的。

(2)有沒有要提交的數據:數據對應於data屬性,數據的格式對應於contentType屬性。

(3)如果是純粹的加載,那么不需要data屬性。如果是要提交一部分數據,那么就要放在data屬性中,比如XML文本等。

23.發出數據請求

發出數據請求,其實就是按照數據請求對象攜帶的信息,向指定地址發出請求。這部分由URLLoader對象來完成。

(1)直接將URLRequest對象傳入URLLoader對象構造函數,這樣URLLoader對象一建立,就可以立刻發送請求。

var loader:URLLoader=new URLLoader(request);//request即定義好的URLRequest對象
View Code

(2)可以先建立URLLoader對象,在合適的時候發送請求:

var loader:URLLoader=new URLLoader();
//......
loader.load(request);
View Code

注:如果有數據返回,那么將會放在這個URLLoader對象的data屬性中。可以通過URLLoader對象的dataFormat屬性來判斷data屬性中存儲的數據格式是三種哪一種?
(1)文本型(URLLoaderDataFormat.TEXT)

(2)二進制型(URLLoaderDataFormat.BINARY);

(3)變量名值對型(URLLoaderDataFormat.VARIABLES)

24.URLLoader對象會發出如下6種事件,可以讓我們監聽,並更好地控制加載流程:

(1)load()一調用,就發出Event.OPEN事件。

(2)加載過程中,發出ProgressEvent.PROGRESS事件,包含下載字節數信息。

(3)加載完成,發出Event.COMPLETE。

(4)加載完成或者失敗之前,會發出HTTP狀態事件HTTPStatusEvent.HTTP_STATUS

(5)記載失敗,發出IOErrorEvent.IO_ERROR事件

(6)發出加載內容不合安全規則,發出SecurityErrorEvent.SECURIY_ERROR.

25.讀取3種數據格式的例子

(1)服務器端的數據文件、服務器端腳本返回的數據、在本機執行時本機上的數據文件,都屬於外部數據。

(2)URLLoader把讀取到的外部數據划分為3中格式:文本、值對、二進制。其中,普通文本、XML等以普通UTF-8字符組成的字符串文本都屬於文本格式。值對格式,就是一個URLVariables對象。二進制格式數據是最強大和靈活的一種數據格式,使用ByteArray對象表示。

(3)XML類型是文本格式數據的一種,URLLoader默認的數據格式就是文本,即dataFormat=URLLoaderDataFormat.TEXT。

(4)如果服務器端腳本是值對形式的數據,且是URL編碼形式,那么就是URLVariables類型的數據。讀取值對格式時,要注意設置dataFormat=URLLoaderDataFormat.VARIABLES。

(5)讀取二進制格式數據后,二進制格式數據以ByteArray對象存儲在URLLoader對象的data中。

26.監控加載進度

答:監控加載進度很簡單,只需要增加一個偵聽器,偵聽URLLoader對象發出的ProgressEvent.PROGRESS事件。事件對象是flash.events.ProgressEvent類的實例,有兩個屬性:bytesLoader屬性用來記錄當前下載的字節數;bytesTotal 屬性記錄總共要下載的字節數。

27、打開網址

答:在ActionScript 3中使用函數navigateToURL()。使用navigateToURL()之前,必須導入flash.net包。API格式如下:

public function navigateToURL(request:URLRequest,window:String=null):void

request對象包含要跳轉的網址,window字符串表示要顯示request指定網址的瀏覽器窗口或者HTML框架(HTML frame)。如果不出入window參數,那么就是默認在新窗口打開。

window的常用字符串有4種:“_self”表示在當前框架當前窗口打開網址;“_blank”表示在新窗口中打開網址;“_parent”表示在當前框架的父框架上打開網址;“_top”表示在當前窗口的頂級框架中打開網址。

28.提交數據

答:如果只想提交數據,不需要讀取返回數據,那么可以使用sendToURL()。使用格式如下:

public function sendToURL(request:URLRequest):void

但是,一般來說,向服務器端提交數據實際上總是包括兩個步驟,提交數據和讀取返回信息;

(1)提交的數據放入URLRequest對象的data屬性中,使用URLLoader對象提交。

(2)讀取服務端腳本返回的數據,這些數據存儲在URLLoader的data屬性中。

提交數據格式中,XML格式應用最為普遍。

29.沙箱模型

答:安全沙箱是一個虛擬的概念,代表着不同程度權限的環境。不同的安全沙箱(Sandbox),分配着不同來源資源的環境。資源主要包括數據、圖形和各種文件。比如說,本機文件就在本地沙箱中,來自Internet的資源在遠程沙箱中。

如何知道當前運行的SWF文件屬於哪一個沙箱?使用只讀屬性Security.sandboxType即可。

SWF文件所使用的沙箱公有四種:

(1)Security.REMOTE:SWF文件來自Internet URL,並遵守基於域的沙箱規則。不能讀取不同域中的資源,除非另有設置。

(2)Security.LOCAL_WITH_FILE:SWF文件是本地文件,可以讀取本地數據,但無法與Internet進行通信。

(3)Security.LOCAL_WITH_NETWORK:SWF文件是本地文件,可與Internet通信,但不能讀取本地數據。

(4)Security.LOCAL_TRUSETD:SWF文件是本地文件,且已使用“設置管理器”或Flash Player信任配置文件收到用戶信任。此SWF文件既可以從本地數據源讀取數據,也可以與Internet進行通信。權限最高。

安全沙箱有兩條基本的原則:

(1)位於相同安全沙箱中的資源始終可以互相訪問。

(2)遠程沙箱中的SWF文件始終不能訪問本地文件和數據。

任何 不符合安全沙箱的代碼行為,都會導致拋出SecurityError異常。

30.跨域文件

答:跨域文件,即crossdomain.xml,一般放置在網站的根目錄下。

當SWF文件試圖向非本域的網址讀取資源時,如發現該網址所在域沒設跨域安全文件,或者跨域安全文件中並不包括SWF文件所在域,那么在運行時會發生安全異常。

31.授予腳本訪問權限

答:跨域文件授予文件訪問權限,Security.allowDomain()方法授予腳本訪問權限。這個API授予的權限,主要包括下面幾個部分:

(1)SWF文件之間的跨腳本訪問。

(2)顯示列表訪問

(3)事件檢測

(4)對Stage對象的屬性和方法的完全訪問

當在一個父SWF文件加載本域的子SWF文件時,雙方沒有腳本訪問限制:子SWF文件可以調用父SWF文件的腳本;父SWF文件也可以訪問子SWF文件腳本。

但如果加載其他域的SWF時,就會遇到安全限制。這時,就需要使用代碼授予制定來源的SWF文件以訪問權限。

32.顯示對象

答:(1)從ActionScript3的角度來看,不管多復雜的視覺圖像都是由顯示對象和顯示對象容器組合而成。

(2)同一的視覺等級結構中,包含兩大類型的顯示對象:一種是可以包括其他顯示對象的顯示對象容器,簡稱容器;另一種是單純的顯示對象,除自身以外不能包括其他顯示對象,簡稱為非容器對象。

(3)只有容器才擁有管理子對象的方法,非容器對象沒有管理子對象的方法。

(4)舞台是最根本的容器,包含着當前SWF所有的顯示對象。舞台又是一種特殊的容器,每個Flah應用程序只能有一個舞台容器。舞台也是整個對象樹結構的根節點。

33.顯示對象種類划分

答:ActionScript3顯示對象種類划分:一個統一、兩個層次

(1)一個統一是指,所有的顯示對象都統一於DisplayObject類。所有的顯示對象(包括容器)都是其子類的實例。

(2)第一大層次:可以接受互動事件稱為可互動的顯示對象,不可接受的互動事件稱為不可互動顯示對象。(所謂接受互動事件,是指能夠接受鼠標單擊、鍵盤敲擊等人機交互事件)。

(3)第二大層次:可以容納其他顯示對象的稱為顯示對象容器,不可容納其他顯示對象的稱為非容器顯示對象。

34.顯示對象類庫架構

答:(1)所有顯示對象都是繼承自父類DisplayObjectde。父類DisplayObject繼承自EventDispatcher類。這意味着,ActionScript3中所有的顯示對象天生就可以發送事件。

(2)類圖的核心是3個抽象類:DisplayObject、InteractiveObject、DisplayObjectContainer。

35.顯示對象

答:(1)顯示對象類(DisplayObject)是所有顯示對象的抽象父類,歸集了一些明顯對象共有的特性。它的構造函數不能被調用,從而不可以被實例化。我們只能實例化它的子類,操作它子類對象。我們不能直接創建繼承自DisplayObject類的子類,而是只能繼承自DisplayObject具體子類。

(2)"顯示對象.mouseX"和“顯示對象.nouseY”得到當前鼠標指針離這個顯示對象注冊點的橫向距離和縱向距離。

36.矢量圖(Shape)

答:(1)Shape類專門用來繪制簡單的矢量圖。

 (2)Shape直接繼承自DisplayObject,並不是容器,它與父類的區別就在於多了一個graphics的實例屬性。

(3)Graphics對象繪制方法的分類:

(I)填色:

(i)單一顏色填充:beginFill(color:uint,alpha:Number=1.0):void

(ii)漸變填充:beginGradientFill

(iii)使用位圖填充:beginBitmapFill

(II)畫線:

(i)繪制曲線:curveTo

(ii)繪制直線:lineTo

(III)繪制基本圖形

(i)繪制圓形:drawCircle

(ii)繪制橢圓:drawEllipse

(iii)繪制矩形:drawRect

(iv)繪制圓角矩形:drawRoundRect

(IV)線頭樣式:

(i)線條樣式:lineStyle

(ii)漸變線條樣式:lineGradientStyle

(V)清除圖形:清除繪制到此Graphics對象的圖形,並重置填充和線條樣式設置。clear();

(VI)移動當前繪制點位置:moveTo(x:Number,y:Number):void

37.位圖(Bitmap)

答:一般來說,矢量圖體積小,但比較消耗計算資源,而位圖則比較消耗內存資源,但對計算資源消耗小。

38.遮罩(mask)

答:(1)如果想給可視對象B設置一個遮罩,將顯示對象A用於遮罩。DisplayObjectB.mask=displayObjectA;如果不想再使用遮罩了,那么將mask設置為null即可:DisplayObjectB.mask=null;

(2)如果將遮罩顯示對象和被遮罩的顯示對象都使用位圖緩存,則可以使用Alpha通道遮罩。

39.捕獲HTML文本超鏈接的信息

答:HTML中的超鏈接必須以“event:”開頭,將超鏈接要發送的信息防止在它的后面,以字符串的形式表現。這樣,當用戶單擊超鏈接時,會發出一個事件,是flash.events.TextEvent類的實例,事件類型是TextEvent.LINK。“event:“后面的字符串信息會包括在這個事件對象的text屬性中,供監聽器使用。

40.碰撞檢測

答:在ActionScript3中,只要是顯示對象都可以使用如下兩種方法來檢測碰撞。

(1)hitTestObject(obj:DisplayObject):Boolean,檢測是否與某個顯示對象(obj)碰撞。

(2)hitTestPoint(x:Number,y:Number,shapeFlag:Boolean=false):Boolean,檢測是否和某個舞台坐標點發生碰撞。其中shapeFlag定義的是檢查顯示對象的實際像素(true),還是檢查顯示對象的邊框(false)。

41.Flash程序中所有對象的添加流程

答:(1)首先,當一個Flash程序運行時,不論是在獨立播放器中,還是嵌套在網頁里,最先自動生成的是stage容器對象。stage容器對象是顯示列表中的第一個顯示對象容器。每個Flash程序只能有一個stage容器。顯示列表從Stage開始。

(2)其次,當第一個SWF文件被載入后,會自動成為Stage容器的一個子顯示對象。

(3)然后,SWF文件主要對象中創建的顯示對象,才會按照它們加入顯示列表的代碼順序,逐一被顯示出來。

(4)如果一個容器沒有加入顯示列表,那么它里面的所有顯示對象也不會加入到顯示列表中,從而不會被顯示。

42.Animator提供的所有控制動畫播放的方法和屬性:

答:方法:

(1)end():void   停止播放動畫,Flash Player會立即轉到動畫序列中的最后一幀。

(2)nextFrame():void 使Flash Player前進到動畫序列中的下一幀。

(3)pause():void 暫停動畫,直到調用resume()方法

(4)play():void 開始播放動畫

(5)resume():void 在動畫由pause()方法暫停后繼續播放動畫。

(6)rewind():void 將Flash Player設置到動畫的第一幀。

(7)stop():void 停止播放動畫,Flash Player將返回到動畫序列中的第一幀

屬性:

(1)autoRewind:Boolean=false  將動畫設置為完成后重新開始播放

(2)isPlaying:Boolean[read-only] 指示動畫當前是否正在播放。

(3)target:DisplayObject 正呈現動畫效果的顯示對象

(4)time:int 從零開始,指示和控制當前動畫中的時間。

43.排序

答:(1)數組.reverse()。reverse方法是對數組元素倒序,返回值是新的數組。

(2)sort方法是對數組元素元素排序。有3種使用方式。

(I)數組.sort();//默認排序。默認排序時按照字符串字母順序排序的,返回值是排序后的數組。

(II)數組.sort(排序方式);//使用“排序方式”參數來排序,排序方式是一些定義好的整數常量

(III)數組.sort(比較函數);//使用自定義的比較函數,注意此處只寫函數名即可

(3)當數組元素是復雜數據類型,且需要根據這種對象的某個屬性值來排序時,就需要用到sortOn方法。

例如:某數組元素都有一個屬性值name,希望根據name來排序,那么使用方法如下:

(I)數組.sortOn("name");//根據指定屬性,默認排序

(II)數組.sortOn("name",排序方式);//根據指定屬性,使用指定的“排序方式”來排序

(III)數組.sortOn("name",比較函數);//根據指定屬性,使用自定義函數排序

(4)排序方式:所謂排序方式,實際上是一些在Array類中定義好的整形常量,代表幾種不同的排序方式。排序方式可以同時用多個,使用“|”號隔開。一共有5種:

(I)Array.CASEINSENSITIVE 值為:1,表示大小寫不敏感按字母順序排序,如果是數字則從小到大。

(II)Array.DESCENDING值為:2,表示按字母倒序排列

(III)Array.UNIQUESORT值為:4,表示必須是唯一性排序,如果比較值結果相同,則放棄排序

(IV)Array.RETURNINDEXEDARRAY:值為8,讓sort()和sortOn()函數返回值返回排序后的索引列表,同時保持原數組不變。

(V)Array.NUMERIC or 16 值為16,強制sort()和sortOn()中對數值采用從小到大排序,否則,不設方式,sort()和sortOn()將把數字當成字符串來排序

44.操作數組每個元素的方法

答:

(1)遍歷操作     forEach(callback:Function,thisObject:*=null):void 操作數組中每一項元素。回調函數不需要返回任何值。

(2)過濾器        filter(callback:Function,thisObject:*=null):Array 將符合回調函數條件的元素提出來,構成一個新的數組並返回。回調函數返回單個新數組元素。

(3)映射器        map(callback:Function,thisObject:*=null):Array   根據回調函數操作原數組每個元素,並利用回調函數返回結果生成新的數組。回調函數返回單個新數組元素。

(4)有一個滿足則為真     some(callback:Function,thisObject:*=null):Boolean 只要有一個元素能讓回調函數返回true,則some()返回true,否則為false。回調函數返回單個元素比較結果,布爾值。

(5)全員滿足才為真   every(callback:Function,thisObject:*=null):Boolean 必須所有元素都讓回調函數返回true,every()才返回true,否則為false。回調函數返回單個比較結果,布爾值。

45.ActionScript3中提供了3種函數可以方便地操作String中的每一個字符

答:(1)使用charAt()訪問目標位置的字符。

(2)使用charCodeAt()得到目標位置字符的Unicode字符的整數字符代碼。

(3)使用fromCharCode()從指定的Unicode值得到相應的字符串。

46.幾種字符串操作

 答:(1)indexOf()方法是用來判斷一個字符串是否存在於一個更長的字符串中。從長字符串左端到右端來搜索,如果存在該字符串就返回它所處的位置(即索引)。如果在被索引的字符串中沒有查找的字符串就返回-1。lastIndexOf(),從長字符串的右端搜索。很多的時候用indexOf()不是為了真的想知道字符串的位置,而是想知道長字符串中有沒有包含這個子字符串。如果返回索引值是-1,那么說明沒有;不等於-1,那么就是有。

(2)substring()、slice()和substr()的使用及區別

(I)三者都是從長的字符串中提出的子字符串。三者相同之處在於,都不會改變原來長字符串的內容,只是返回符合條件的子字符串。

(II)用法:

(i)substring:長字符串變量.substring(起始位置,終點位置)

(ii)slice:長字符串變量.slice(起始位置,終點位置)

(iii)substr:長字符串變量.substr(起始位置,要截取的字符串長度)

(3)split()可以將字符串按指定的分隔符分開。

47.使用的mx.utils.StringUtil工具類,它提供了4中靜態方法:

答:(1)截斷字符串首尾空白:StringUtil.trim(str:String):void

(2)替換字符串:StringUtil.substitute(str:String,...rest):String

(3)trim分割符分割的字符串:StringUtil.trimArrayElements(value:String,delimiter:String):String

(4)檢測空白符:StringUtil.isWhitespace(character:String):Boolean

48.DOM3事件的執行流程

答:DOM3事件機制包含着4個步驟:注冊偵聽器、發送事件、偵聽事件、移除偵聽器。

49.Event類的屬性

答:Event類的公開的實例屬性只有6個:type、target、currentTarget、eventPhase、bubbles和cancelable。這些事例屬性全都是只讀屬性。

(1)type用來存儲事件對象的名稱,是字符串類型。

(2)target是Object類型,持有引用、指向最初發出事件的那個對象。

(3)currentTarget、eventPhase和bubbles這3個屬性都和事件流機制相關。

(4)cancelable屬性是一個布爾值,表示這個事件引起的默認動作是否可以被取消。

50.Event對象擁有7種實例方法

(1)使用clone()方法可以返回當前事件對象的一個拷貝。

(2)toString()返回對象表示的值的字符串形式。

(3)stopImmediatePropagation()、stopPropagation()用來阻止事件的傳播,從而使偵聽器失去效用。

51.自定義類發送事件的3種方式

答:有3種方式可以發送事件:

(1)繼承EventDispatcher:讓自定義類類直接繼承EventDispatcher,就可以進行事件發送了,這是最方便、最快的一種方式。

(2)復合EventDispatcher對象:只有不需要把這個類的實例看成是EventDispatcher或IEventDispatcher類型時,才能考慮使用這種復合EventDispatcher對象的方式發送事件。

(3)實現IEventDispatcher接口。

52.異常

答:(1)由於ActionScript3沒有對線程的支持,所以異常分為兩種:同步異常和異步異常。Error和其子類一般用來處理同步時的程序異常。在異常處理時,所產生的異常用相關的異常事件(ErrorEvent)表示。這兩種異常的本質和處理機制都不同:對於同步異常來說,使用try-catch來處理;對於異步異常,采用的是事件偵聽機制來處理。而且,異常事件並不是Error的子類,而是flash.events.ErrorEvent的子類。

53.對異常事件處理

答:異常事件有兩類

(1)擴展ErrorEvent類的異常事件

(2)基於狀態的異常事件

異常事件處理分為以下兩步

(1)添加偵聽器,負責偵聽可能 發出的異常事件,與添加try作用類似

(2)編寫偵聽器函數,里面放置處理異常事件的代碼,與catch作用類似

54.用API實現的一些常用XML操作

答:(1)appendChild(child:Object):XML:在當前子元素列表之后添加

(2)prependChild(value:Object)XML:在當前子元素列表之前添加

(3)insertChildAfter(child1:Object,child2:Object):*在子元素child1之后添加

(4)insertChildBefore(child1:Object,child2:Object):*:在子元素child1之前添加

(5)contains()對比該XML對象與給定value參數

(6)elements()列出某XML對象的元素

55.正則表達式與字符串的結合使用

答:正則表達式與字符串結合使用的方式有兩類:使用RegExp類的兩個方法,即exec()和test();或使用String類的方法,在字符串中匹配正則表達式match()、replace()、search()和splice()。

(1)RegExp類的test()方法只檢查提供的目標字符串是否包含正則表達式的匹配內容。如果包含,返回true;不包含,則返回false。

(2)RegExp類的exec()方法也可以來檢查提供的字符串是否有正則表達式的匹配,不過它返回的是一個數組,內容包括匹配的子字符串、同正則表達式中的任意括號組匹配的子字符串。這個數組還有index屬性,指明子字符串匹配起始的索引位置。

(3)String類的search()方法返回與給定模式相匹配的第一個子字符串的索引位置。match()搜索匹配的子字符串,找到了就返回匹配的子字符串。如果在正則表達式模式中使用了全局標志g,match()將返回一個包含匹配子字符串的數組。

(4)String類的replace()需要兩個參數,第一個參數是傳入的正則表達式,第二個是要替換的字符串。如果正則表達式沒有設置g標志符,那么只替換一個;如果設置了g標識符,將替換多個。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM