AS3有了按鈕類:SimpleButton ,可以為四種狀態(tài)分別指定不同的 DisplayObject 。但是 SimpleButton 沒有繼承 DisplayObjectContainer 類,也就是不能給它添加其他的 child 。如果要創(chuàng)建一個帶文字的 Button 怎么辦?兩種方案:
- 方案一:把文字加到每種 state 里。因為 Shape 也沒有繼承 DisplayObjectContainer 類,要添加文字 state 就要用 Sprite 。優(yōu)點是每種狀態(tài)可以有不同的文字顏色、大小、位置等。缺點是不方便改文字內(nèi)容。
- 方案二:把 SimpleButton 和 TextField 一起放到一個 Sprite 里。這樣 SimpleButton 的 state 可以用 Shape 以節(jié)省內(nèi)存空間。優(yōu)缺點和方案一相反。
代碼 和 演示
創(chuàng)建一個按鈕很簡單,為它的四種狀態(tài)分別指定一個 DisplayObject 就可以了:
btn = new SimpleButton(); btn.name = "btn"; btn.downState = new BtnStatusShape2(downColor,w,h); btn.overState = new BtnStatusShape2(overColor,w,h); btn.upState = new BtnStatusShape2(upColor,w,h); btn.hitTestState = btn.upState; addChild(btn);
注意必須指定 hitTestState ,就是Flash IDE里創(chuàng)建 Button 時的 hit 幀,響應鼠標事件的區(qū)域,如果沒有它按鈕就失去作用了。一般設置它和 upState 一樣就可以了。
第二種方案的每種 state 都是一個 Shape(→ DisplayObject → EventDispatcher → Object):
internal class BtnStatusShape2 extends Shape{ public function BtnStatusShape2(bgColor:uint,w:uint,h:uint) { graphics.lineStyle(1,0x000000,0.8) graphics.beginFill(bgColor,0.8); graphics.drawRoundRect(0,0,w,h,8); graphics.endFill(); } }
方案一沒有什么好說的。方案二如果想讓 btn 響應鼠標事件可以重寫裝載它的 Sprite 的 addEventListener 方法:
public override function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{ btn.addEventListener(type,listener); }
要重寫繼承自父類的方法必須使用 override 關(guān)鍵字。而且重寫的方法必須有父類方法完全相同的參數(shù)名稱、數(shù)量和類型。
當然方案二也可以通過監(jiān)聽 MOUSE_OVER、MOUSE_OUT、CLICK 等 MouseEvent 來改變不同狀態(tài)的文本顯示。其他內(nèi)容參考類代碼 。
源文件:button.rar
出處:藍色理想
責任編輯:moby
上一頁 Function 下一頁 label
◎進入論壇Flash專欄版塊參加討論
|