天天看點

積少成多Flash(5) - ActionScript 3.0 執行個體之鬧鐘(自定義事件, 畫圖, 動畫)

<a href="http://webabcd.blog.51cto.com/1787395/342175" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/100162" target="_blank">[源碼下載下傳]</a>

積少成多Flash(5) - ActionScript 3.0 執行個體之鬧鐘(自定義事件, 畫圖, 動畫)

介紹

通過一個經典示例,即鬧鐘,對使用 Flash ActionScript 3.0 畫圖、做動畫有一個大概的了解,并通過此示例學習自定義事件的開發

自定義事件 - 繼承自 Event ,一個 public static const 定義事件類型,其他 public 變量定義事件屬性

畫圖 - 通過 Shape 對象的 graphics 屬性來執行矢量繪圖指令 

動畫 - 通過 Timer 對象或監聽 Event.ENTER_FRAME 事件 

1、自定義事件(鬧鐘到點後所觸發的自定義事件)

AlarmEvent.as

package    

        import flash.events.Event; 

        public class AlarmEvent extends Event    

        { 

                // 定義事件類型 

                public static const ALARM:String = "alarm"; 

                // 定義鬧鐘在響鈴時所顯示的資訊 

                public var alermMessage:String; 

                // 構造函數,msg 為提醒資訊 

                public function AlarmEvent(msg:String = "ALARM!") 

                { 

                        // 調用父類的構造函數。參數為事件類型,可以作為 Event.type 通路 

                        super(ALARM); 

                        alermMessage = msg; 

                } 

                // 重寫 Event 的 clone() 方法 

                public override function clone():Event 

                        return new AlarmEvent(alermMessage); 

                // 重寫 Event 的 toString() 方法 

                public override function toString():String 

                        // Event.formatToString() - 在自定義 Event 類中實作 toString() 方法的 utility 函數 

                        return formatToString("AlarmEvent", "type", "bubbles", "cancelable", "eventPhase", "message"); 

        } 

}

2、畫圖(繪制表盤,刻度,時分秒針等)

ClockUI.as

package 

        import flash.display.Shape; 

        import flash.display.Sprite; 

        import flash.display.StageAlign; 

        import flash.display.StageScaleMode; 

        import flash.text.StaticText; 

        import flash.events.*; 

        import flash.text.TextField; 

        import flash.text.TextFormat; 

        // 繪制表盤 UI 

        public class ClockUI extends Sprite    

                // 表盤半徑 

                public var radius:uint; 

                // 表盤中心點的 X 坐标和 Y 坐标 

                public var centerX:int; 

                public var centerY:int; 

                // 時, 分, 秒指針的形狀 

                public var hourHand:Shape; 

                public var minuteHand:Shape; 

                public var secondHand:Shape; 

                // 表盤背景顔色,以及時, 分, 秒指針顔色(0x代表16進制) 

                public var bgColor:uint = 0xEEEEFF; 

                public var hourHandColor:uint = 0x003366; 

                public var minuteHandColor:uint = 0x000099; 

                public var secondHandColor:uint = 0xCC0033; 

                // 構造函數,r 為表盤半徑 

                public function ClockUI(r:uint)    

                        this.radius = r; 

                        this.centerX = r; 

                        this.centerY = r; 

                // 初始化表盤 

                public function init():void    

                        // 畫表盤的邊框 

                        drawBorder(); 

                        // 畫表盤上的小時的标記 

                        drawHourLabel(); 

                        // 畫時, 分, 秒指針 

                        drawHand(); 

                public function drawBorder():void 

                        // 指定線條樣式,兩個參數分别為線條的粗細(以磅為機關)和線條的顔色 

                        this.graphics.lineStyle(0.5, 0x999999); 

                        // 以指定的顔色開始填充,在調用 endFill() 後才會呈現填充 

                        this.graphics.beginFill(bgColor); 

                        // 畫園,三個參數分别為圓心的 X 坐标、圓心的 Y 坐标和園的半徑。之前調用的 beginFill() 方法将填充此園 

                        this.graphics.drawCircle(centerX, centerY, radius); 

                        // 呈現上次的 beginFill() 的結果 

                        this.graphics.endFill(); 

                public function drawHourLabel():void 

                        for (var i:Number = 1; i &lt;= 12; i++) 

                        { 

                                // 表盤的刻度辨別,1 到 12 

                                var lbl:TextField = new TextField(); 

                                lbl.text = i.toString(); 

                                // 小時刻度辨別所需旋轉的弧度(使用弧度是為了友善之後的 sin() 和 cos() 計算) 

                                var angle:Number = i * 30 * (Math.PI / 180); 

                                // 計算刻度辨別的位置 

                                lbl.x = centerX + (0.9 * radius * Math.sin(angle)) - 5; 

                                lbl.y = centerY - (0.9 * radius * Math.cos(angle)) - 9; 

                                // 格式化刻度辨別的文本樣式 

                                var tf:TextFormat = new TextFormat(); 

                                // tf.font = "Arial"; 

                                tf.bold = "true"; 

                                tf.size = 12; 

                                lbl.setTextFormat(tf); 

                                // 在 Container 中添加指定的 DisplayObject ,傳回值為被添加到 Container 後的 DisplayObject 

                                this.addChild(lbl); 

                        } 

                public function drawHand():void 

                {                

                        hourHand = new Shape(); 

                        hourHand.graphics.lineStyle(3, hourHandColor); 

                        // 移動目前的繪畫起點到指定的位置 

                        hourHand.graphics.moveTo(0, -radius * 0.5); 

                        // 畫直線到指定位置,起點位置由 moveTo() 決定 

                        hourHand.graphics.lineTo(0, 0); 

                        hourHand.x = centerX; 

                        hourHand.y = centerY;                 

                        addChild(hourHand); 

                            minuteHand = new Shape(); 

                        minuteHand.graphics.lineStyle(2, minuteHandColor); 

                        minuteHand.graphics.moveTo(0, -radius * 0.8); 

                        minuteHand.graphics.lineTo(0, 0); 

                         minuteHand.x = centerX; 

                        minuteHand.y = centerY; 

                        addChild(minuteHand); 

                         secondHand = new Shape(); 

                        secondHand.graphics.lineStyle(0.5, secondHandColor); 

                        secondHand.graphics.moveTo(0, -radius * 0.9); 

                        secondHand.graphics.lineTo(0, 0); 

                        secondHand.x = centerX; 

                        secondHand.y = centerY; 

                        addChild(secondHand); 

                // 以目前系統時間重新整理表盤的呈現 

                public function refresh():void 

                        // new Date() - Flash 宿主的系統時間 

                        var currentTime:Date = new Date(); 

                        var hour:uint = currentTime.getHours(); 

                        var minute:uint = currentTime.getMinutes(); 

                        var second:uint = currentTime.getSeconds(); 

                        // 時, 分, 秒指針做相應的旋轉。機關:度數 

                        this.hourHand.rotation = hour * 30 + minute * 0.5; 

                        this.minuteHand.rotation = minute * 6; 

                        this.secondHand.rotation = second * 6; 

3、動畫(讓時,分,秒針動起來)

SimpleClock.as

        public class SimpleClock extends Sprite 

                import flash.events.TimerEvent; 

                import flash.utils.Timer; 

                private var timer:Timer; 

                private var clockUI:ClockUI; 

                // 構造函數,radius 為表盤半徑 

                public function SimpleClock(radius:Number = 100):void    

                {                         

                        // 執行個體化一個 ClockUI 對象,并将其添加到舞台上 

                        clockUI = new ClockUI(Math.max(20, radius)); 

                        clockUI.init(); 

                        addChild(clockUI); 

                        // 重新整理表盤 UI 

                        clockUI.refresh(); 

                        // 執行個體化一個計時器,每 1 秒 tick 一次 

                        timer = new Timer(1000);                

                        timer.addEventListener(TimerEvent.TIMER, onTick); 

                        timer.start(); 

                private function onTick(e:TimerEvent):void    

                }                 

4、組裝以上各個類,以成為一個完整的鬧鐘對象(這裡來确定如何觸發我們開始寫的那個自定義事件)

AlarmClock.as

        public class AlarmClock extends SimpleClock    

                import flash.events.MouseEvent; 

                private var alarmHour:Number = -1;    

                private var alarmMinute:Number = -1; 

                private var alarmMessage:String; 

                // 構造函數, radius 為表盤半徑 

                public function AlarmClock(radius:Number = 100):void 

                        // 調用父類的構造函數 

                        super(radius); 

                        // 計時器,每 1 秒 tick 一次 

                        timer = new Timer(1000); 

                /* 

                 * 設定提醒時間 

                 * @param hour                提醒時間的小時數 

                 * @param minute        提醒時間的分鐘數 

                 * @param message        提醒資訊 

                 * @return 無傳回值 

                 */ 

                public function setAlarm(hour:Number = 0, minute:Number = 0, message:String = "Alarm!"):void 

                {                     

                        alarmHour = hour; 

                        alarmMinute = minute; 

                         alarmMessage = message; 

                 * 清除提醒時間 

                public function clearAlarm() 

                        alarmHour = alarmMinute = -1; 

                        var date:Date = new Date(); 

                        if (alarmHour == date.hours &amp;&amp; alarmMinute == date.minutes) 

                                // 如果到了提醒時間則執行個體化 AlarmEvent,并通過 dispatchEvent() 觸發該事件 

                                var alarm:AlarmEvent = new AlarmEvent(alarmMessage); 

                                dispatchEvent(alarm); 

5、将鬧鐘對象顯示到 UI 上,通過使用者操作設定鬧鐘時間

在 UI 上放置兩個 NumericStepper ,分别取名為 txtHour 和 txtMinute ,用來設定響鈴的時間。再放置兩份名稱分别為 txtSet 和 txtClear 的 Button ,用來設定鬧鈴和取消鬧鈴。再放置一個名為 txtMessage 的 TextArea ,用來顯示鬧鈴資訊

Clock.as

        import flash.display.MovieClip; 

        import flash.events.MouseEvent; 

        public class Clock extends MovieClip    

                var alarmClock:AlarmClock; 

                public function Clock():void 

                        btnSet.addEventListener(MouseEvent.CLICK, onSetAlarm); 

                        btnClear.addEventListener(MouseEvent.CLICK, onClearAlarm); 

                        txtHour.maximum = 23; 

                        txtMinute.maximum = 59; 

                        txtHour.value = new Date().hours; 

                        txtMinute.value = new Date().minutes; 

                        // 執行個體化 AlarmClock,并在舞台上添加此對象 

                        alarmClock = new AlarmClock(80); 

                        alarmClock.x = 200; 

                        alarmClock.y = 200; 

                        alarmClock.addEventListener(AlarmEvent.ALARM, onAlarm); 

                        addChild(alarmClock); 

                function onSetAlarm(e:MouseEvent):void 

                        alarmClock.setAlarm(txtHour.value, txtMinute.value, "起床啦"); 

                function onClearAlarm(e:MouseEvent):void 

                        alarmClock.clearAlarm(); 

                        txtMessage.text = ""; 

                function onAlarm(e:AlarmEvent):void 

                        txtMessage.text += e.alermMessage + " " + new Date().toString() + "\n"; 

                        txtMessage.verticalScrollPosition = txtMessage.maxVerticalScrollPosition;         

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/342192,如需轉載請自行聯系原作者

繼續閱讀