王瑩
摘要:文章分析了Flash類綁定的基本原理,探討了類綁定的幾種方式和優(yōu)缺點,并通過代碼演示了類綁定的技巧,總結(jié)出在RIA項目開發(fā)中,采用類綁定是美工和代碼分離的重要途徑,既保證了界面友好和代碼邏輯完整,也可以提高整個開發(fā)效率。
關(guān)鍵詞:Flash;類綁定;代碼;元件
中圖分類號:TP311文獻標(biāo)識碼:A文章編號:1009-3044(2012)09-2039-03
Class-binding Mechanisms Research and Application in Flash
WANG Ying
(Zhengzhou Financial Technician Institute, Zhengzhou 450013, China)
Abstract: The article analyzes the Flash class of binding of the basic principles discussed several advantages and disadvantages of the class bind, demonstrated through the code, binding techniques, summed up in the RIA project development, by using the binding is the art andan important way to separate code, both to ensure a friendly interface and complete code logic, can also improve the development efficiency.
Key words: Flash; class-binding; code; component
當(dāng)前,互聯(lián)網(wǎng)帶寬不斷提高,各類RIA層出不窮,在應(yīng)用中融入更多的交互式動畫元素顯得越來越重要。交互式動畫需要解決美工元素和控制代碼相互配合的問題,不僅要求界面友好帶給人們愉快的視覺享受,同時要做到所執(zhí)行的代碼邏輯完整,與顯示對象完美結(jié)合。在Flash創(chuàng)作工具中,類綁定是實現(xiàn)動畫和腳本相結(jié)合的主要方法,采用類和庫中的元件綁定是目前業(yè)界標(biāo)準(zhǔn)的通用做法,可以使動畫中的影片剪輯具有像程序一樣的模塊功能。一旦某個影片剪輯與類綁定后,該剪輯將被視為類的實例,影片中的子顯示對象和幀都可以被類定義中的代碼控制。從應(yīng)用層面看,一個類不僅可以與多個庫元件綁定,實現(xiàn)代碼集中管理,同時,一個元件也可以重復(fù)綁定多個不同的類,實現(xiàn)不同階段的不同顯示效果;從項目層面看,類綁定使得設(shè)計人員和腳本開發(fā)人員可以相對獨立的專注于自己的工作,減輕雙方勞動量,提高工作效率。
1類綁定的原理
從Flash CS3引入了ActionScript3.0后,庫中的元件都被看成是某個類的實例,即影片剪輯與某個MovieClip子類進行了綁定。即使沒有指定具體綁定類,編譯系統(tǒng)也會自動生成一個MovieClip類與之綁定。其原理為,如果影片剪輯類元件在滿足沒有指定綁定類,幀中沒有加入腳本,沒有手工輸入子元件的name屬性的條件下下,編譯器就將該元件作為一個普通的MovieClip對象進行編譯;如果不符合上述條件編譯器則自動生成一個MovieClip子類,將舞臺上的剪輯元件編譯成該類的實例。該類的類名默認為“文檔名::庫元件名_數(shù)字”。例如:某文檔命名為“示例文檔.fla”,在其中新建一個影片剪輯類元件“示例剪輯”,“示例剪輯”的任意幀中包含代碼“stop()”,那么編譯器會將舞臺上的該剪輯編譯成“示例文檔::示例剪輯_數(shù)字”類的實例,而“示例剪輯_數(shù)字”類是繼承自MovieClip的子類。此外,不僅可以綁定庫中的元件,整個舞臺(stage)甚至SWF文件也可以實現(xiàn)類綁定,這是因為可以把flash中的舞臺看成是一個大的容器對象,而事實上舞臺容器也是顯示列表中的根容器,舞臺容器被看成是Stage類的實例。SWF文件可以被看成SWF主類的實例,當(dāng)類綁定SWF文件時,類被稱為文檔類,文檔類是類綁定的一個特例。如果SWF沒有指定文檔類,那么編譯器會自動生成一個MainTimeLine的類與之綁定。如果設(shè)計元素是交互動畫的外殼,那么類綁定則賦予其靈魂。
在Flash創(chuàng)作工具中,即可以將動作腳本寫入影片剪輯的關(guān)鍵幀中,也可以寫在綁定類中。那么,幀代碼和綁定類的適用范圍是什么呢?一般來講,應(yīng)遵循以下原則,凡是和影片結(jié)構(gòu)、播放流程相關(guān)的代碼都應(yīng)寫在關(guān)鍵幀中,而與影片結(jié)構(gòu)無關(guān)的代碼寫在綁定類中。當(dāng)然,在實際應(yīng)用中要靈活處理,例如,在某綁定類綁定多個影片剪輯的時候,要求所有的剪輯播放到一定幀的時候都執(zhí)行共同的播放控制類代碼,這時候就應(yīng)將代碼寫入綁定類,通過代碼對不同剪輯實現(xiàn)統(tǒng)一管理,因為這是綁定類的通用要求,并不針對某一特定影片剪輯。
在Flash CS3及以上版本中,庫中創(chuàng)建的原件一般默認為基于MovieClip類。但是如果一個影片剪輯類元件只有一幀而不需要時間軸播放支持,則沒有必要使用MovieClip類,可以采用更輕量級的Sprite類,這樣做的好處在于不但節(jié)省資源,還可以使代碼意圖更加明顯。具體做法為,右鍵單擊庫中的元件,選擇屬性,在彈出的對話框中勾選“為ActionScript導(dǎo)出”,然后在基類文本框中輸入“flash.display.Sprite”,點擊確定按鈕即可將元件綁定為Sprite類的子類。
2類綁定的方法
類綁定的方法有兩類,一類最常用的是自動生成綁定綁定,二是手工編寫綁定的類文件。
在ActionScript2.0時代可以通過鏈接標(biāo)識符來實現(xiàn)使用代碼在舞臺上顯示庫元件,在AS3.0已經(jīng)不存在鏈接標(biāo)識符的概念,可以通過下述方法來實現(xiàn)綁定并顯示元件。右鍵單擊庫中元件A,在彈出的對話框中選擇“為ActionScript”導(dǎo)出,這時類名默認與元件名一致且繼承自MovieClip類,編譯時,會自動生成一個同名類A,然后類A會和元件A綁定,生成類A的對象并加入顯示列表,舞臺上會根據(jù)代碼要求出現(xiàn)庫元件A的實例。關(guān)鍵幀代碼如下:
Var a:A=new A;addChild(a);a.x=100;a.y=100;
如果不希望綁定類與庫元件同名,可以在類名文本框中輸入自定義名稱。這種自動生成的類綁定好處在于簡單,不必再手工創(chuàng)建獨立的類文件,缺點是不能對庫元件做任何修改,也不能添加任何新的屬性。
如果希望通過類綁定對庫元件進行更多的操作,如添加屬性和控制對象行為,就需要手工編寫外部類文件。一般情況下,一個庫元件只允許和一個類文件進行綁定,若要多個元件實現(xiàn)共同的行為,就要編寫不同的對應(yīng)類文件,否則會造成編譯錯誤,這種做法不符合面向?qū)ο蟠a復(fù)用的原則。如果希望用一個類文件,控制不同的庫元件行為,又不造成編譯器報錯,可以采用類繼承的方式,首先將所有元件都要實現(xiàn)的相同方法和屬性寫入一個基類,各元件的綁定類都繼承自該類,然后由編譯器自動實現(xiàn)類綁定。例如:存在一個CarMove.fla文件,其中有兩輛汽車CarA和CarB,希望這兩輛汽車的實例實現(xiàn)從舞臺左側(cè)到右側(cè)的移動。首先編寫一個基類CarMoveMC實現(xiàn)兩輛汽車的共同屬性“speed”,然后將庫中的兩個汽車元件“為ActionScript導(dǎo)出”,類名為CarA和CarB,都以CarMoveMC為基類?;惔a如下:
//CarMove.fla與CarMoveMC.as都在根目錄中
package{
import flash.display.MovieClip;
import flash.events.Event;
public class CarMoveMC extends MovieClip
{private var _speed:Number = 1;
//speed是兩輛汽車的共同屬性
public function CarMoveMC (){
super();
addEventListener(Event.ENTER_FRAME, move);
}
public function set speed(nS:Number):void {
_speed = nS;
}//控制汽車移動的速度
private function move(evt:Event):void {
this.x -= _speed;
}}}
為舞臺根容器編寫一個文檔類,實現(xiàn)顯示類表子對象的顯示,即讓CarA和CarB的實例在舞臺上顯示,并顯示出相同的speed屬性。文檔類的DisplayCar.as文件與CarMove.fla也在同一根目錄中,代碼如下:
//as與fla在同一目錄下,不必寫包路徑
package
{import flash.display.Sprite;
import flash.utils.getDefinitionByName;
public class DisplayCar extends Sprite
{private var __CarA:Class; private var __CarB:Class;
//背景
private var __Bg:Class;
public function DisplayCar () {
initDisplay();
var bg:Sprite = new __Bg();//背景為單幀,以Sprite為基類
//三輛汽車,都繼承自基類CarMoveMC
var carA1: CarMoveMC= new __CarA();
var carA2: CarMoveMC= new __CarA();
var carB : CarMoveMC= new __CarB();
//設(shè)置三輛汽車的位置、大小、速度和透明度
carA1.speed = 1.5;
carA1.x = 300;
carA2.speed = 1;
carA2.scaleX = 0.5;
carA2.scaleY = 0.5;
carA2.x = 200;
carA2.y = 125;
carA2.alpha = 0.5;
carB.y = 150;
carB.x = 500;
carB.speed = 0.5;
//將汽車對象加入顯示列表
addChild(bg);
addChild(cloudB);
addChild(cloudABig);
addChild(cloudASmall);
}private function initDisplay():void {
__CarA = getDefinitionByName("CarA") as Class;
__CarB = getDefinitionByName("CarB") as Class;
__Bg = getDefinitionByName("Bg") as Class;}}}
3綁定類訪問影片剪輯子元件的方法
在綁定類中,可以用代碼直接控制影片剪輯內(nèi)的各種子顯示內(nèi)容,例如在某個影片剪輯內(nèi)存在一個子剪輯child_mc,那么可以通過child_mc.play()實現(xiàn)子剪輯的播放。通過綁定類訪問剪輯子元件的方法有兩種:自動聲明和手工聲明。
自動聲明的原理是,編譯器為綁定類的類體中和構(gòu)造函數(shù)中自動加上一行代碼:
public var child_mc:MovieClip//類體
child_mc=getChildByName(“child_mc”);//構(gòu)造函數(shù)
這種自動聲明的優(yōu)點在于簡單易行,開發(fā)人員不必關(guān)心影片剪輯內(nèi)的字顯示內(nèi)容的聲明,一切由編譯器完成;缺點在于,如果其他ActionScript3 IDE使用這種剪輯的時候,則會提示出錯,從而掩蓋其他更重要的錯誤。
手工聲明子剪輯的方法是,首先在flash的文件菜單中選擇“發(fā)布設(shè)置”,其次在“flash”選項卡中點擊腳本“設(shè)置”按鈕,然后取消“自動聲明舞臺實例”的狀態(tài)。取消自動聲明后,需要在綁定類中手工寫入子剪輯的屬性,而且這個屬性必須和影片子剪輯同名,訪問控制為public。這種方法可以被其他IDE識別且不會報錯,但是存在兩個問題。第一個問題是,有可能會造成類定義的封裝被破壞,如果我們不希望子剪輯元件對外部可見,應(yīng)該盡量減少不必要的公共屬性和方法。第二是代碼與元件之間耦合度太高,手工聲明時要求這個public屬性和子剪輯同名,一旦子剪輯命名改變,類文件中的相關(guān)代碼也要更改,如果涉及到的代碼比較多,缺乏可維護性。
為解決上述兩個問題,可以將子剪輯的引用賦值給新增private屬性,再對新增屬性進行操作,以此避免屬性對外部可見。這里需要使用as關(guān)鍵字對子剪輯的引用進行類型轉(zhuǎn)換為新增屬性類型。示例如下:
public class Sample extends MovieClip
{private var __child_mc:MovieClip;//新增屬性
public function Sample() {
initDisplay();
}
private function initDisplay():void {
__child_mc = getChildByName("child_mc") as MovieClip;//用as轉(zhuǎn)換
} }
這樣,即實現(xiàn)了元件與代碼的脫耦,也保護了類的封裝。
4總結(jié)
類綁定是實現(xiàn)美工與代碼分離的重要途徑,降低了設(shè)計和開發(fā)人員雙方的工作量,可以使其更專注于各自的工作,保證了界面美觀和代碼質(zhì)量,同時也提高了整個RIA項目開發(fā)的效率。
參考文獻:
[1]楊鵬飛.基于Flash的電子白板的設(shè)計與實現(xiàn)[J].電腦知識與技術(shù), 2011,8(2):432-435.
[2]王愉.Flash ActionScript3.0溢彩編程[M].北京:清華大學(xué)出版社,2010.
[3]孫穎.Flash ActionScript3殿堂之路[M].北京:電子工業(yè)出版社,2007.