/**
* ComingX.com
* Copyright 2012. All rights reserved.
*
* @Author: Jingle
* @Email: jingdongemail#gmail.com
* @Created date: 2012-2-6
*/
package com.jingle.view.component
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.text.TextLineMetrics;
import flash.utils.Timer;
import mx.controls.Label;
import mx.core.UIComponent;
[Event(name="timeUp", type="flash.events.Event")]
public class TimeCounter extends UIComponent
{
private var timer:Timer;
private var timeLabel:Label;
/**
* 剩余时间,毫秒单位
*/
private var leftTime:Number;
/**
* 时间到之后显示替代文本
*/
private static const TIME_UP:String = "时间到";
/**
* 结束时间,毫秒单位
*/
private var _endTime:Number;
/**
* 字体大小
*/
public var fontSize:Number = 20;
/**
* 字体颜色
*/
public var fontColor:uint = 0x000000;
public function TimeCounter()
{
super();
timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER,onTimer);
}
public function get endTime():Number{
return this._endTime;
}
public function set endTime(value:Number):void
{
if(value != this._endTime && value)
{
_endTime = value;
var timeNow:Number = (new Date()).getTime();
leftTime = _endTime - timeNow;
timer.stop();
timer.reset();
timer.start();
}
}
override protected function createChildren():void
{
if(!timeLabel)
{
timeLabel = new Label();
addChild(timeLabel);
this.setStyle("fontSize",fontSize);
this.setStyle("color",fontColor);
var lineMatrics:TextLineMetrics = measureText("00 : 00 : 00");
timeLabel.width = lineMatrics.width + 10;
timeLabel.height = lineMatrics.height + 4;
timeLabel.setStyle("textAlign","center");
timeLabel.setStyle("verticalAlign","middle");
}
timer.start();
}
protected function onTimer(evt:TimerEvent):void
{
leftTime = leftTime - 1000;
if(leftTime <= 0)
{
//到时间了
timer.stop();
dispatchEvent(new Event("timeUp"));
}
updateTimeLabel();
}
protected function updateTimeLabel():void
{
if(leftTime <= 0)
{
timeLabel.text = TimeCounter.TIME_UP;
return;
}
var h:Number = Math.floor(leftTime / (1000 * 60 * 60) );
var m:Number = Math.floor(leftTime % (1000 * 60 * 60) / (1000 * 60));
var s:Number = Math.floor(leftTime % (1000 * 60) / 1000);
timeLabel.text = oneToTow(h) + " : " + oneToTow(m) + " : " + oneToTow(s);
}
private function oneToTow(value:Number):String
{
var str:String;
if(value < 10)
{
str = "0" + value;
}
else
{
str = "" + value;
}
return str;
}
}
}
使用方法
<component:TimeCounter endTime="{model.deadline}" fontSize="30" timeUp="timeUpHandler(event)" />
博文链接