既に説明したように、AlarmClock クラスが実際に提供する機能は、アラームの設定とトリガーに関する機能だけです。 組み込みの Timer クラス(flash.utils.Timer)を使用して、指定された時間が経過した後で実行するようにコードを定義できます。 AlarmClock クラスは Timer インスタンスを使用して、アラームを鳴らす時刻を判断します。
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* The Timer that will be used for the alarm.
*/
public var alarmTimer:Timer;
...
/**
* Instantiates a new AlarmClock of a given size.
*/
public override function initClock(faceSize:Number = 200):void
{
super.initClock(faceSize);
alarmTimer = new Timer(0, 1);
alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm);
}
AlarmClock クラスで定義された Timer インスタンスは
alarmTimer
と呼ばれます。AlarmClock インスタンスに必要なセットアップ操作を実行する
initClock()
メソッドは、
alarmTimer
変数を使用して 2 つの処理を行います。まず、Timer インスタンスが 0 ミリ秒待機し、タイマーイベントを 1 回だけトリガーするように指示するパラメーターを使用して、変数をインスタンス化します。
alarmTimer
をインスタンス化した後、コードは変数の
addEventListener()
メソッドを呼び出し、変数の
timer
イベントを監視しようとしていることを示します。指定された時間が経過した後、
timer
イベントを送出することで、Timer インスタンスが動作します。AlarmClock クラスは、独自のアラームを鳴らすために、いつ
timer
イベントが送出されたかを知る必要があります。
addEventListener()
を呼び出すことで、AlarmClock コードは自分自身をリスナーとして
alarmTimer
に登録します。2 つのパラメーターは、AlarmClock クラスが
timer
イベントを監視しようとしていることを示し(定数
TimerEvent.TIMER
で指定)、イベントが発生したときに、イベントに対する応答として AlarmClock クラスの
onAlarm()
メソッドを呼び出す必要があることを示しています。
実際にアラームを設定するために、AlarmClock クラスの
setAlarm()
メソッドが次のように呼び出されます。
/**
* Sets the time at which the alarm should go off.
* @param hour The hour portion of the alarm time.
* @param minutes The minutes portion of the alarm time.
* @param message The message to display when the alarm goes off.
* @return The time at which the alarm will go off.
*/
public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date
{
this.alarmMessage = message;
var now:Date = new Date();
// Create this time on today's date.
alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes);
// Determine if the specified time has already passed today.
if (alarmTime <= now)
{
alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY);
}
// Stop the alarm timer if it's currently set.
alarmTimer.reset();
// Calculate how many milliseconds should pass before the alarm should
// go off (the difference between the alarm time and now) and set that
// value as the delay for the alarm timer.
alarmTimer.delay = Math.max(1000, alarmTime.time - now.time);
alarmTimer.start();
return alarmTime;
}
このメソッドは、アラームメッセージの格納、Date オブジェクトの作成(
alarmTime
)、アラームが鳴る実際の時刻の表示など、複数の機能を実行します。この章と最も関係がある部分として、メソッドの最後の数行で、
alarmTimer
変数のタイマーが設定され、アクティブ化されます。まず、
reset()
メソッドが呼び出され、タイマーが停止され、既に実行されていた場合はリセットされます。次に、現在時刻(
now
変数で表現)が
alarmTime
変数の値から減算され、アラームを鳴らすまでに経過する時間がミリ秒単位で決定されます。Timer クラスは
timer
イベントを絶対時間ではトリガーしないため、この相対的な時間差が
alarmTimer
の
delay
プロパティに割り当てられます。最後に
start()
メソッドが呼び出され、タイマーが実際に開始されます。
指定された時間が経過すると、
alarmTimer
は
timer
イベントを送出します。AlarmClock クラスは、このイベントのリスナーとして
onAlarm()
メソッドを登録しているため、
timer
イベントが発生すると、
onAlarm()
が呼び出されます。
/**
* Called when the timer event is dispatched.
*/
public function onAlarm(event:TimerEvent):void
{
trace("Alarm!");
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
}
イベントリスナーとして登録されたメソッドは、適切なシグネチャ(つまり、メソッドのパラメーターと戻り値の型のセット)を使用して定義する必要があります。 メソッドを Timer クラスの
timer
イベントのリスナーとして使用するには、データ型が Event クラスのサブクラス TimerEvent(flash.events.TimerEvent)であるパラメーターを 1 つ定義する必要があります。Timer インスタンスはイベントリスナーを呼び出すときに、TimerEvent インスタンスをイベントオブジェクトとして渡します。