組件基類
Flash 自帶的組件都位於mx.controls包中。組件直接或間接繼承於UIComponent類,UIComponent類對UIObject類做了擴展,而UIObject類又是MovieClip類的子類。MovieClip類不屬於任何包,
定義檔案位於FlashInstalDir\en\First Run\Classes目錄。UIComponent類和UIObject類都位於mx.core包中,
定義檔案位於FlashInstalDir\en\First Run\Classes\mx\core目錄。
UIObject類對MovieClip類進行封裝,所有Flash V2組件都可以共享它的方法、屬性和事件。UIObject類使組件在樣式、事件和縮放比例調整上得到了實現。它提供了動態創建刪除組件的方法:
·createObject方法:直接調用attachMovie函式,返回一個MovieClip類型的引用。
·createClassObject方法:調用createObject方法,創建一個指定類的組件實例,並返回所創建的組件的引用。
·createEmptyObject方法:創建一個空的UIObject實例。
·destroyObject方法:使用delete語句刪除已經創建的組件實例。
UIObject還封裝了其它的一些方法,包括:
·redraw方法:在當前幀重新繪製組件。
·invalidate方法:標記組件,使之在下一個幀間隔重新繪製。
·move方法:把組件移動到指定位置。
·setSize方法:設定組件大小。
·setSkin方法:設定組件皮膚。
·getStyle方法:獲取樣式信息。
UIObject類的屬性除了scaleX和scaleY外,其它都是唯讀屬性,使用時需要注意。所以如果要在運行時調整組件外觀,就必須使用UIObject類的方法。對於唯讀屬性的賦值是無效的,即使是對非唯讀屬性的賦值,有時也會造成組件在外觀顯示上的差錯。UIObject類還定義了一系列的事件,包括載入事件(load)、
卸載事件(unload)、移動事件(move)、重繪事件(draw)和大小調整事件(resize)。
利用UIObject類的組件創建方法,可以在運行時創建組件實例。
UIComponent類從UIObject類繼承,它並不是一個可視的組件。和UIObject類一樣,所有Flash V2組件都可以共享它的方法和屬性。它實現了組件的焦點獲取、鍵盤輸入,組件的禁用和啟用以及組件的按布局調整自動大小。
UIComponent類的主要方法有:
·getFocus方法:利用焦點管理器(Selection)返回一個當前獲取焦點的對象的引用。
·setFocus方法:使組件獲取焦點。
UIComponent類的enabled屬性指定組件實例是否可用;tabIndex屬性指定組件的焦點獲取順序。UIComponent類還定義一系列焦點和鍵盤事件:焦點獲取事件(focusIn),焦點轉移事件(focusOut)、鍵盤按下事件(keyDown)和鍵盤釋放事件(keyUp)。
使用方法
在Flash MX 2004和 Flash MX Professional 2004自帶了一套組件稱為Flash V2組件,它是從Flash MX的V1組件升級而來的,V1組件和V2組件儘量不要一起使用以免發生一些錯誤。V2組件支持
實時預覽,使開發者在
編輯狀態下就能看到組件的外觀效果。開發者可以自行設定是否需要
實時預覽和實時預覽的模式,以節省計算機資源。在ControlàEnable Live Preview選單設定是否使用
實時預覽,在ViewàPriview Mode選單選擇預覽模式。組件實質上是一些被編譯好的電影剪輯,其格式為SWC。SWC檔案類似與Zip檔案,可以使用一般的
解壓縮程式進行解壓查看其內容。電影剪輯可以在編輯環境中直接發布為組件,也可以直接編譯存儲為swc格式的組件檔案,便於其他開發者使用。同樣,開發者也可以從外部導入組件。
使用組件,必須把組件面板中所需要的組件拖到舞台(Stage),使組件出現在
庫面板。這樣組件就可以象普通的庫項目一樣被使用。使用
腳本可以動態的創建組件實例,運行時創建組件可以有三個方法:createObject()、creatClassObject()和attachMovie()。attachMovie()是MovieClip類的方法,createObject()和creatClassObject()是UIObject類方法,但事實上它們都是對attachMovie()的直接或間接調用。
組件被添加後可以在屬性或參數面板中直接設定組件的參數。另外還要為組件定義事件,最簡單的方法是使用on(eventName)進行定義。另外還可以使用偵聽器和事件處理函式等定義組件事件的處理方法。組件的事件定義比較靈活,使用何種方式定義取決與個人的習慣與偏好。當事件發生時,組件會廣播一個Object類型的事件參數,該參數中包括了事件發生對象和事件類型的信息。另外,使用深度管理器(DepthManager)可以對組件進行深度管理。
Flash組件最大的特點是開發者可以自定義組件,尤其是界面元素的自定義,使其更具有吸引力。V2組件有它自己的一套默認界面方案,稱為主題(Theme)。主題包括兩個方面:樣式(Style)和外觀(Skin)。UIObject類的setStyle()和getStyle()方法可以獲取和設定組件的樣式。樣式的設定比較簡單,主要有以下三種方式:
·直接設定屬性:
T.color=0xff5567;
·使用簡單的setStyle()名值對方法自定義樣式:
instanceName.setStyle("property", value);
·把樣式對象與setStyle()方法結合使用來自定義樣式:
//創建一個樣式對象
var styleObj = new mx.styles.CSSStyleDeclaration;
//刻畫樣式細節
//……
styleObj.fontSize = 18;
//把樣式套用到組件實例
b.setStyle("styleName", styleObj);
樣式的級別包括4個層次:全局樣式,套用於所有組件;組件類單獨的默認樣式,套用於某一類的組件;自定義樣式;直接設定組件實例的屬性。對於不同級別的樣式Flash按照一定的順序分別把這些樣式套用到組件。
首先,Flash 查找組件實例上的樣式屬性,如果實例上沒有直接設定樣式,Flash 將查看實例的styleName 屬性,確定是否向它分配了樣式聲明。如果 styleName 屬性沒有被分配樣式聲明,Flash 將查找默認類樣式聲明上的屬性。如果沒有類樣式聲明,並且屬性沒有繼承它的值,則將檢查 _global 樣式聲明。如果屬性未在 _global 樣式聲明中定義,則該屬性為 undefined。
另外,如果沒有類樣式聲明,但屬性確實繼承了它的值,Flash 將查找該實例父級上的屬性。如果屬性未在父實例上定義,Flash 將檢查父實例的 styleName 屬性;如果未定義該屬性,Flash將繼續查看父實例,直到 _global 級別。如果屬性未在 _global 樣式聲明中定義,則該屬性為undefined。
另一方面,為了更好的使用組件,還需要修改或重新定義組件外觀。Flash V2的外觀
定義檔案位於FlashInstralDir\en\First Run\ComponentFLA資料夾下。在修改外觀時,需要把原始的外觀
定義檔案作為外部庫導入(FileàOpen External Library),並把外部庫中的外觀定義庫項目拖到當前文檔的庫中,外觀庫項目通常都是電影剪輯(MovieClip)。每一個組件外觀定義庫項目資料夾中都包含一個States資料夾,其中定義了組件在不同狀態下的外觀,每一個狀態都指定了一個連結名(linkageName)作為腳本引用,如果修改了這個名稱,則會使組件在該狀態下的外觀載入發生錯誤。在組件的類檔案中,每一個狀態都使用一個字元串屬性指定其外觀庫項目的連結名,如果要重新定義組件某一狀態下的外觀,只要在
腳本中修改這個字元串屬性的值就可以了,當然首先必須存在可鏈的新的外觀庫項目。
了解了這樣一個組件外觀機制以後,組件外觀的修改就變的非常簡單。其關鍵就是修改或重新定義一組新的外觀庫項目並指定其連結名,然後修改組件類檔案中指定組件外觀的屬性。開發者可以在組件實例的初始化事件(initialize)中修改組件實例的外觀。修組件所有實例外觀的方法比較多,例如_root的第一幀使用ClassName. prototype.stateName=value語句,該語句也可以直接在#initclip和#endinitclip代碼塊中使用;另外還可以使用類繼承的方式,在組件初始化時就為組件外觀連結屬性指定新的值,這裡也需要用到#initclip、#endinitclip代碼塊。#initclip和#endinitclip是Flash的編譯器命令,作為初始化代碼塊的開始標記和結束標記。只要符號(symbol)被定義,那么初始化代碼就被先於第一幀執行,而且緊執行一次。所以在這個代碼塊中,可以為整個組件類指定不同狀態下的外觀。