我在blog.flexexamples.com尝试了这个flex示例。这是一个基本的计时器示例。
但是当计时器超过30分钟时,它会自动重启并开始显示负时间值(-1,-2 ..)
。
有什么问题?为什么它在超过30分钟后会显示计时器的负值?
TimerDemo.mxml
<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2007/08/14/creating-a-simple-timer-in-flex-with-the-flashutilstimer-class/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white"
creationComplete="init()">
<mx:Script>
<![CDATA[
import flash.utils.Timer;
import flash.events.TimerEvent;
private const MIN_MASK:String = "00";
private const SEC_MASK:String = "00";
private const MS_MASK:String = "000";
private const TIMER_INTERVAL:Number = 10;
private var baseTimer:int;
private var t:Timer;
private function init():void {
t = new Timer(TIMER_INTERVAL);
t.addEventListener(TimerEvent.TIMER, updateTimer);
}
private function updateTimer(evt:TimerEvent):void {
var d:Date = new Date(getTimer()-baseTimer);
var min:String = (MIN_MASK + (d.minutes - 30.0)).toString();
var sec:String = (SEC_MASK + d.seconds).toString();
var ms:String = (MS_MASK + d.milliseconds).toString();
counter.text = String(min+":"+sec+"."+ms);
}
private function startTimer():void {
baseTimer = getTimer();
t.start();
}
private function stopTimer():void {
t.stop();
}
]]>
</mx:Script>
<mx:ApplicationControlBar dock="true">
<mx:Button label="Start timer" click="startTimer()" />
<mx:Button label="Stop timer" click="stopTimer()" />
</mx:ApplicationControlBar>
<mx:Label id="counter" fontSize="96" />
</mx:Application>
答案 0 :(得分:3)
我不确定你要做什么,但我想我知道你的问题是什么。
通过减去30 min
var,您只需操作输出。所以实际的计时器仍在计算实际的分钟数。
如果你想从你的Timer中减去30分钟,你应该在实例化d:Date
时这样做:
const TIME_OFFSET:int = 1800000; //milliseconds in 30 minutes (1000*60*30)
var d:Date = new Date(getTimer()-baseTimer-TIME_OFFSET);
请务必同时删除-30
var min:String
我希望这就是你要找的东西。
修改强>
鉴于您对getTimer()
和baseTimer
有很大差异的评论,您应该查看getTimer()引用。它陈述如下:
<强>返回强> int - 自运行时初始化(处理ActionScript 2.0时)或自虚拟机以来的毫秒数 启动(处理ActionScript 3.0时)。如果运行时启动 播放一个SWF文件,然后加载另一个SWF文件,返回 value是相对于加载第一个SWF文件的时间。
当我在baseTimer
函数中跟踪getTimer()
和startTimer()
时,它们总是(或多或少)相同。所以看来你的情况有些不妥。
解决方法可以使用new Date().time
类而不是getTimer()
,如下所示:
private function updateTimer(evt:TimerEvent):void {
var d:Date = new Date(new Date().time - baseTimer);
var min:String = (MIN_MASK + d.minutes).substr(-MIN_MASK.length);
var sec:String = (SEC_MASK + d.seconds).substr(-SEC_MASK.length);
var ms:String = (MS_MASK + d.milliseconds).substr(-MS_MASK.length);
counter.text = String(min + ":" + sec + "." + ms);
}
private function startTimer():void {
baseTimer = new Date().time;
t.start();
}
有关详细信息,请参阅reference