日付と時刻の例:単純なアナログ時計
Flash Player 9 以降、Adobe AIR 1.0 以降
日付と時刻に関する次の 2 つの内容について、単純なアナログ時計の例を使って示します。
-
現在の日付と時刻を取得し、時、分、秒の値を抽出する方法
-
Timer を使用してアプリケーションの進行ペースを制御する方法
このサンプルのアプリケーションのファイルを入手するには、
www.adobe.com/go/learn_programmingAS3samples_flash_jp
を参照してください。 SimpleClock アプリケーションのファイルは、Samples/SimpleClock フォルダーにあります。 このアプリケーションは次のファイルで構成されています。
ファイル
|
説明
|
SimpleClockApp.mxml
または
SimpleClockApp.fla
|
Flash(FLA)または Flex(MXML)のメインアプリケーションファイル。
|
com/example/programmingas3/simpleclock/SimpleClock.as
|
メインアプリケーションファイル。
|
com/example/programmingas3/simpleclock/AnalogClockFace.as
|
時計の丸い文字盤と時間に合わせた時針、分針、秒針を描画するコード。
|
SimpleClock クラスの定義
この時計のように単純なアプリケーションであっても、構造をわかりやすく整理しておけば、後で容易に拡張できて便利です。そこで、この SimpleClock アプリケーションの場合は SimpleClock クラスで起動時とタイマー制御の処理を扱い、時刻を実際に表示する処理には別の AnalogClockFace というクラスを使用しています。
次のコードでは、SimpleClock クラスの定義と初期化を行います(Flash バージョンでは、代わって SimpleClock が Sprite クラスを拡張することに注意してください)。
public class SimpleClock extends UIComponent
{
/**
* The time display component.
*/
private var face:AnalogClockFace;
/**
* The Timer that acts like a heartbeat for the application.
*/
private var ticker:Timer;
このクラスには、2 つの重要なプロパティがあります。
-
face プロパティ: AnalogClockFace クラスのインスタンス
-
ticker プロパティ: Timer クラスのインスタンス
SimpleClock クラスではデフォルトのコンストラクターを使用します。
initClock()
メソッドでは実際のセットアップ処理を担当し、文字盤を作成して Timer インスタンスの動作を開始します。
文字盤の作成
次のコードでは、時刻の表示に使用する文字盤を作成します。
/**
* Sets up a SimpleClock instance.
*/
public function initClock(faceSize:Number = 200)
{
// creates the clock face and adds it to the display list
face = new AnalogClockFace(Math.max(20, faceSize));
face.init();
addChild(face);
// draws the initial clock display
face.draw();
initClock()
メソッドに対して、文字盤のサイズを指定できます。
faceSize
の値を指定しない場合、デフォルト値の 200 ピクセルが使用されます。
次に、このアプリケーションでは文字盤を初期化し、DisplayObjectContainer クラスから継承した
addChild()
メソッドを使用して表示リストに文字盤を追加します。さらに、いったん現在の時刻で盤面を表示するために
AnalogClockFace.draw()
メソッドを呼び出します。
タイマーの開始
文字盤を作成した後は、
initClock()
メソッドでタイマーをセットアップします。
// creates a Timer that fires an event once per second
ticker = new Timer(1000);
// designates the onTick() method to handle Timer events
ticker.addEventListener(TimerEvent.TIMER, onTick);
// starts the clock ticking
ticker.start();
このメソッドは、1 秒(1000 ミリ秒)ごとにイベントを送出する Timer インスタンスを最初に作成します。 第 2 パラメーターの
repeatCount
を
Timer()
コンストラクターに渡していないので、この Timer はイベントの送出を無期限に繰り返します。
SimpleClock.onTick()
メソッドは、
timer
イベントを受け取って 1 秒ごとに実行されます。
public function onTick(event:TimerEvent):void
{
// updates the clock display
face.draw();
}
AnalogClockFace.draw()
メソッドは、単に時計の盤面と針を描画します。
現在時刻の表示
AnalogClockFace クラスのコードのほとんどは、時計の盤面を構成する表示要素のセットアップに関するものです。AnalogClockFace が初期化される際には、丸い輪郭を描き、個々の定時目盛りの位置にテキストラベルで数字を配置し、さらに、時針、分針、秒針を表す 3 つの Shape オブジェクトを作成します。
SimpleClock アプリケーションが動作し始めた後は、次のように
AnalogClockFace.draw()
メソッドが 1 秒ごとに呼び出されます。
/**
* Called by the parent container when the display is being drawn.
*/
public override function draw():void
{
// stores the current date and time in an instance variable
currentTime = new Date();
showTime(currentTime);
}
このメソッドは、時計の針を描画している間に時刻が変化しないように、現在時刻を変数に保存します。それから、次のように
showTime()
メソッドを呼び出して針を表示します。
/**
* Displays the given Date/Time in that good old analog clock style.
*/
public function showTime(time:Date):void
{
// gets the time values
var seconds:uint = time.getSeconds();
var minutes:uint = time.getMinutes();
var hours:uint = time.getHours();
// multiplies by 6 to get degrees
this.secondHand.rotation = 180 + (seconds * 6);
this.minuteHand.rotation = 180 + (minutes * 6);
// Multiply by 30 to get basic degrees, then
// add up to 29.5 degrees (59 * 0.5)
// to account for the minutes.
this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5);
}
このメソッドでは、最初に現在時刻の時、分、秒それぞれの値を抽出し、 それらに基づいて 3 本の針の角度を計算します。 秒針は 60 秒で 1 周するので、1 秒につき 6 度(360/60)だけ進むことになります。 分針も 1 分につきこれと同じ角度だけ進みます。
分針が進むにつれて、時針も少しずつ動きます。 時針は 1 時間につき 30 度(360/12)だけ進みますが、その間も 1 分につき 0.5 度(30 度 / 60 分)ずつ変化していきます。
|
|
|