Flash MX的出現(xiàn)讓我們看到了實現(xiàn)問題的各種捷徑,而且內(nèi)部對象全部Object化,而其中一個讓人興奮的對象就是Button Object——曾經(jīng)是不可Programmable(AS控制)的頑固分子之一。
Button對象是Object對象的繼承(言下之意即是所有Object的屬性方法都可以使用),現(xiàn)在已經(jīng)可以和MovieClip一樣可以有自己的Instance Name屬性,同樣在設(shè)置MovieClip的Instance Name的PropertyInspector面板內(nèi)設(shè)置(Ctrl+f3,圖1)。
(圖1)
Button的InstanceName可以看作為一個指針I(yè)D,指向被Action編程操作MovieClip;當(dāng)然,逆向地,動態(tài)產(chǎn)生的MovieClip如果具有了使用了Button對象的方法,也即是“變成”了Button對象的指針I(yè)D。
我們做兩個例子來看看:
1) 手動制作的Button。通常,在編程風(fēng)的跟隨下,很多人已經(jīng)走入了編程的誤區(qū),就是無論什么都主張編程(不要學(xué)我哦,我寫教程而已),其實解決問題需要在速度和效率間尋找那個臨界點,如果你覺得自己手動速度更快一些就可以用手動來做,例如圖1的按鈕就是很簡單的用一個Rectangle Tool做出來的Button,并且給于Instance Name“btn1”。
2) 雖然手動在某種情況下是非常直觀而且迅捷的,但是我們也看看另一個做法:
Movieclip.prototype.makeBoxV2 = function(x, y, l, w) {
this.lineto(x, y+w);
this.lineto(x+l, y+w);
this.lineto(x+l, y);
this.lineto(x, y);
};
with (btn2) {
moveto(120, 180);
beginfill(0x333333, 100);
linestyle(.1, 0x333333, 100);
makeBoxV2(120, 180, 65, 16);
endfill();
}
改進(jìn)的MakeBoxV2支持長和寬的設(shè)定,這樣可以實現(xiàn)制作長方形;程序動態(tài)產(chǎn)生一個btn2,并且用粗度.1并且用色碼333333的顏色填充顏色代碼為333333的65x16的長方形區(qū)域,這樣就有了形成一個Button的前提。
接著,賦予Button的屬性,即把Button的事件給于MovieClip:
btn2.onRollOver=function(){
this.myClr=new color(this);
this.myClr.setRGB(0xdddddd)
}
btn2.onRollOut=function(){
this.myClr=this.myClr.setRGB(0x333333);
}
接觸過Flash 5的朋友也許一下就看到里面用到了Color對象,這個對象在Flash MX沒有太大的改進(jìn),所以我們也就不多說它;把onRollOver鼠標(biāo)浮動事件的Handler寫為一個function,并設(shè)置這個按鈕的顏色為發(fā)亮的0xdddddd;由于鼠標(biāo)不會在浮動上之前就會有RollOut,所以把初始化Color對象的語句可以寫入onRollOver事件。
測試一下兩個不同實現(xiàn)的結(jié)果:
(圖2)
下面介紹Button對象的屬性、方法等。
Button對象的屬性:
Button對象在默認(rèn)狀態(tài)下的屬性是:
useHandCursor = true;
enabled = true;
useHandCursor在true狀態(tài)下是當(dāng)鼠標(biāo)移動上來時顯示手形圖像,反之保持鼠標(biāo)箭頭狀態(tài),說到enabled,就直接影響B(tài)utton的狀態(tài)了,默認(rèn)狀態(tài)總是true,否則當(dāng)前不響應(yīng)用戶鼠標(biāo)事件,這個在不需要用戶響應(yīng)的時候十分有效。
Button對象的方法:
Button對象的方法很簡單,只有g(shù)etDepth一個,目的是獲取目標(biāo)Button的Level:
trace(btn2.getDepth());
TAB鍵關(guān)聯(lián)
在處理成組的很多Button 同時存在時,會遇到按TAB鍵按鈕間組內(nèi)切換的情況,在Flash MX中會把需要切換的Button按照tabIndex順序排列:
Button.Prototype.onKillFocus=function(){trace("kill focus"+this._name)}
btn1.tabIndex=2
btn2.tabIndex=3
btn1.tabEnabled=btn2.tabEnabled=true
(圖3)
試驗的結(jié)果發(fā)現(xiàn)了問題,在有手動和程序?qū)崿F(xiàn)的Button同時存在的時候,tab并不起什么作用,而在無手動Button的時候卻只能使tabIndex和tabEnabled起作用,但killfocus毫無響應(yīng),可見程序作的按鈕的可靠性。
btn2.tabEnabled=true
btn2.tabIndex=3
(圖4)
Button對象大概就是這個樣子了,值得高興的是可以用程序作button了,不過程序和設(shè)計總是有個點,那個點的把握就決定著Flash MX的應(yīng)用性。
感謝DnVsystem,源代碼:
注:Button對象的getDepth其實也就是MovieClip的getDepth(代碼號全為105)。