googleで
カスタム検索
プロフィール

けろ&ひな

Author:けろ&ひな
大阪在住。
親ばか。
最近、転職したよ。でも、やってることは一緒なんだけどね。;-P

最近の記事
カテゴリー
月別アーカイブ
最近のコメント
最近のトラックバック
スポンサード リンク

スポンサーサイト--------(--)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[flex][as3]Clockクラスの作成2010-01-18(Mon)

_time.jpg
時間があったんで、作ってみた。
Timer使ってやってます。
一応、時・分・秒・ミリ秒でイベントが上がってきます。
良いのか悪いのか、開始直後に時・分・秒・ミリ秒すべてのイベントが一度上がってきます。。。
(使い勝手が悪そうだったら、最初はイベントあげないようにするか。。。)

time.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="{setup();}">

  <mx:Script>
    <![CDATA[
      import mx.controls.Alert;
      import time.event.TimeEvent;
      import time.Clock;
      private var clock:Clock;
      private function setup():void
      {
        clock = new Clock(TimeEvent.MSEC, 1);
        clock.addEventListener(TimeEvent.HOUR, handleHour);
        clock.addEventListener(TimeEvent.MINUTE, handleMinute);
        clock.addEventListener(TimeEvent.SECOND, handleSec);
        clock.addEventListener(TimeEvent.MSEC, handleMSec);
      }

      public function handleMSec(event:TimeEvent):void
      {
        msec.text = event.value.toString();
      }
      public function handleSec(event:TimeEvent):void
      {
        sec.text = event.value.toString();
      }
      public function handleMinute(event:TimeEvent):void
      {
        minute.text = event.value.toString();
      }
      public function handleHour(event:TimeEvent):void
      {
        var ampm:String = (Number(event.value)<12) ? "am " : "pm ";
        hour.text = ampm + (Number(event.value) -12).toString();
      }

      private function handleStart(event:MouseEvent):void
      {
        if (clock)
          handleStop(event);
        clock = new Clock(TimeEvent.MSEC, 1);
        clock.start();
      }
      private function handleStop(event:MouseEvent):void
      {
        if (!clock)
          return;
        clock.stop();
      }
    ]]>
  </mx:Script>
  <mx:VBox>
    <mx:HBox>
      <mx:Label id="hour" />
      <mx:Label id="minute" />
      <mx:Label id="sec" />
      <mx:Label id="msec" />
    </mx:HBox>
    <mx:HBox>
      <mx:Button id="start" label="start" click="{clock.start();}" />
      <mx:Button id="stop" label="stop" click="{clock.stop();}" />
    </mx:HBox>
  </mx:VBox>
</mx:Application>


time.Clock.as
package time
{
  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.events.IEventDispatcher;
  import flash.events.TimerEvent;
  import flash.utils.Timer;

  import time.event.TimeEvent;
  /**
   * 「時」が変わった際に発生するイベント
   * */
  [Event(name="changeHour",type="time.event.TimeEvent")]
  /**
   * 「分」が変わった際に発生するイベント
   * */
  [Event(name="changeMinute",type="time.event.TimeEvent")]
  /**
   * 「秒」が変わった際に発生するイベント
   * */
  [Event(name="changeSecond",type="time.event.TimeEvent")]
  /**
   * 「ミリ秒」が変わった際に発生するイベント
   * */
  [Event(name="changeMSec",type="time.event.TimeEvent")]
  /**
   *
   * @author Hori
   */
  public class Clock implements IEventDispatcher
  {

    private var _timer:Timer;
    private var _startDate:Date;
    /**
     * 開始時間の取得
     * @return 開始時間
     * */
    public function get startDate():Date
    {
      return _startDate;
    }
    /**
     * 開始時間の設定
     * @param date
     */
    public function set startDate(date:Date):void
    {
      _startDate = date;
    }

    private var _currentDate:Date;
    /**
     * イベント発生時の時間の取得
     * @return イベント発生時の時間
     */
    public function get currentDate():Date
    {
      return _currentDate;
    }
    /**
     * イベント発生時の時間の設定 <br />
     * 時・分・秒・ミリ秒を設定してイベントを発生させる。<br />
     * @param date イベント発生時の時間
     */
    public function set currentDate(date:Date):void
    {
      if (_currentDate.time!=date.time)
      {
        _currentDate = date;
        hour = _currentDate.hours;
        minute = _currentDate.minutes;
        sec = _currentDate.seconds;
        msec = _currentDate.milliseconds;
      }
    }

    /**
     * 時(hour)
     * @default 0
     */
    protected var _hour:int = 0;
    /**
     * 「時(hour)」の設定<br />
     * 前回と値が違う場合にイベントを発生
     * @param value 「時(hour)」の値
     */
    public function set hour(value:Number):void
    {
      if (_hour!=value) {
        _hour = value;
        dispatchTimeEvent(TimeEvent.HOUR, _hour);
      }
    }
    /**
     * 「時(hour)」の取得
     * @return 「時(hour)」の値
     */
    public function get hour():Number
    {
      return _hour;
    }
    /**
     * 「分(minute)」
     * @default 0
     */
    protected var _minute:int = 0;
    /**
     * 「分(minute)」の設定
     * @param value 「分(minute)」の値
     */
    public function set minute(value:Number):void
    {
      if (_minute!=value) {
        _minute = value;
        dispatchTimeEvent(TimeEvent.MINUTE, _minute);
      }
    }
    /**
     * 「分(minute)」の取得
     * @return 「分(minute)」の値
     */
    public function get minute():Number
    {
      return _minute;
    }
    /**
     * 「秒(second)」の値
     * @default 0
     */
    protected var _sec:int = 0;
    /**
     * 「秒(second)」の設定
     * @param value 「秒(second)」の値
     */
    public function set sec(value:Number):void
    {
      if (_sec!=value) {
        _sec = value;
        dispatchTimeEvent(TimeEvent.SECOND, _sec);
      }
    }
    /**
     * 「秒(second)」の取得
     * @return 「秒(second)」の値
     */
    public function get sec():Number
    {
      return _sec;
    }
    /**
     * 「ミリ秒(milli-second)」の値
     * @default 0
     */
    protected var _msec:int = 0;
    /**
     * 「ミリ秒(milli-second)」の設定
     * @param value 「ミリ秒(milli-second)」の値
     */
    public function set msec(value:Number):void
    {
      if (_msec!=value) {
        _msec = value;
        dispatchTimeEvent(TimeEvent.MSEC, _msec);
      }
    }
    /**
     * 「ミリ秒(milli-second)」の取得
     * @return 「ミリ秒(milli-second)」の値
     */
    public function get msec():Number
    {
      return _msec;
    }

    /**
     * event dispatcher
     * @default
     */
    protected var _dispatcher:EventDispatcher;
    /**
     * Timerのインターバル
     * @default
     */
    protected var _timeInerval:Number;
    /**
     * Timerのインターバルのタイプ
     * @default
     */
    protected var _type:String;

    /**
     * コンストラクタ
     * @example 3時間おきにイベントを発生させたい。(注意:イベントは3時間おきに発生しますが、時・分・秒・ミリ秒全てのイベントが発生します。)<listing version="3.0">var clock:Clock = new Clock(TimeEvent.HOUR, 3);<listing>
     * @param pType TimeEventのイベントタイプ 指定なしの場合は時、分、秒でイベント発生<br />タイプはTimeEvent.HOUR,MINUTE,SECOND,MSECで指定
     * @param pInterval イベント発生インターバル。指定なしの場合は1。
     *
     * */
    public function Clock(pType:String = null, pInterval:Number = NaN)
    {
      var interval:Number = (isNaN(pInterval)) ? 1 : pInterval;
      _timeInerval = 1000 * interval;
      _type = pType;
      if (_type)
      {
        // イベントの指定がある場合は計算
        _timeInerval = 1;
        switch (_type)
        {
          case TimeEvent.HOUR:
            // 時間単位
            _timeInerval = 60;
          case TimeEvent.MINUTE:
            // 分単位
            _timeInerval = _timeInerval * 60
          case TimeEvent.SECOND:
            // 秒単位
            _timeInerval = _timeInerval * 1000;
          case TimeEvent.MSEC:
            // ミリ秒単位
            _timeInerval = interval * _timeInerval
            break;
          default:
            // デフォルトは秒単位
            _timeInerval = 1000;
        }
      }
      _dispatcher = new EventDispatcher(this);
      _startDate = _currentDate = new Date();
    }

    /**
     * Timerの停止<br />
     * イベントが発生しなくなります。
     */
    public function stop():void
    {
      if (!_timer || !_timer.running)
        return;

      _timer.stop();
      if (_timer.hasEventListener(TimerEvent.TIMER))
        _timer.removeEventListener(TimerEvent.TIMER, timerHandler);
      _timer = null;
    }

    /**
     * Timerの起動<br />
     * イベントの発生を開始します。
     */
    public function start():void
    {
      if (_timer) {
        if (_timer.hasEventListener(TimerEvent.TIMER))
          _timer.removeEventListener(TimerEvent.TIMER, timerHandler);
          _timer = null;
      }
      _timer = new Timer(_timeInerval);
      _timer.addEventListener(TimerEvent.TIMER, timerHandler);
      _timer.start();
    }

    /**
     * _timerに対するイベントハンドラ
     * @param event
     */
    protected function timerHandler(event:TimerEvent):void
    {
        currentDate = new Date();
    }

    /**
     * 時間の設定時のイベント発生
     * @param type
     * @param value
     */
    protected function dispatchTimeEvent(type:String, value:Object):void
    {
      _dispatcher.dispatchEvent(new TimeEvent(type, true, true, _currentDate, value));
    }

    /**
     * IEventDispatcher.addEventListenerの実装
     * @param type
     * @param listener
     * @param useCapture
     * @param priority
     * @param useWeakReference
     */
    public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
    {
      _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
    }

    /**
     * IEventDispatcher.removeEventListenerの実装
     * @param type
     * @param listener
     * @param useCapture
     */
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
    {
      _dispatcher.removeEventListener(type, listener, useCapture);
    }

    /**
     * IEventDispatcher.dispatchEventの実装
     * @param event
     * @return
     */
    public function dispatchEvent(event:Event):Boolean
    {
      return _dispatcher.dispatchEvent(event);
    }

    /**
     * IEventDispatcher.hasEventListenerの実装
     * @param type
     * @return
     */
    public function hasEventListener(type:String):Boolean
    {
      return _dispatcher.hasEventListener(type);
    }

    /**
     * IEventDispatcher.willTriggerの実装
     * @param type
     * @return
     */
    public function willTrigger(type:String):Boolean
    {
      return _dispatcher.willTrigger(type);
    }

  }
}


time.event.TimeEvent.as
package time.event
{
  import flash.events.Event;

  public class TimeEvent extends Event {
      /** 時間のイベント */
      public static const HOUR:String = "changeHour";
      /** 分のイベント */
      public static const MINUTE:String = "changeMinute";
      /** 秒のイベント */
      public static const SECOND:String = "changeSecond"
      /** ミリ秒のイベント */
      public static const MSEC:String = "changeMSec"

      private var _time:Date;
      /**
       * Timeの設定
       * @param value 時間
       * */
      public function set time(value:Date):void
      {
        this._time = value;
      }
      /**
       * Timeの取得
       * @return 時間
       * */
      public function get time():Date
      {
        return this._time;
      }

      private var _value:Object;
      /**
       * 値の設定
       * @param val イベントに対応する値(TimeEvent.HOURなら24時間の「時」など)
       * */
      public function set value(val:Object):void
      {
        this._value = val;
      }
      /**
       * 値の取得
       * @return イベントに対応する値(TimeEvent.HOURなら24時間の「時」など)
       * */
      public function get value():Object
      {
        return this._value;
      }

      /**
       * コンストラクタ
       * @param type
       * @param bubbles
       * @param cancelable
       * @param __time  時間
       * @param __value  時間の値
       * @see Event
       * */
      public function TimeEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, __time:Date = null, __value:Object = null) {
        super(type, bubbles, cancelable);
        _time = __time;
        _value = __value;
      }

  }
}

関連記事

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

コメント

工事中
RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。