Flash Flex定时器示例。。。计时器变为负数
我尝试了这个flex示例。这是一个基本的计时器示例 但当计时器超过30分钟标记时,它会自动重新启动并开始显示负时间值Flash Flex定时器示例。。。计时器变为负数,flash,actionscript-3,apache-flex,timer,flex3,Flash,Actionscript 3,Apache Flex,Timer,Flex3,我尝试了这个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-flashutil
(-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>
我不太确定你想做什么,但我想我知道你的问题是什么。 通过减去
min
var中的30,您只能操作您的输出。因此,实际计时器仍在计算实际分钟数
如果要从计时器中减去30分钟,则应在实例化d:Date
时执行此操作,例如:
const TIME_OFFSET:int = 1800000; //milliseconds in 30 minutes (1000*60*30)
var d:Date = new Date(getTimer()-baseTimer-TIME_OFFSET);
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();
}
请记住,还要删除变量最小值:字符串的-30
我希望这就是你要找的
编辑
考虑到您对getTimer()
和baseTimer
有很多不同之处的评论,您应该看看参考资料。它声明如下:
返回
int—自运行时初始化(处理ActionScript 2.0时)或自虚拟机启动以来的毫秒数
已启动(在处理ActionScript 3.0时)。如果运行时启动
播放一个SWF文件,然后加载另一个SWF文件,返回
值与加载第一个SWF文件的时间相关
在startTimer()
函数中跟踪baseTimer
和getTimer()
时,它们总是(或多或少)相同。看来你的案子有问题
解决方法是使用newdate().time
class而不是getTimer()
这样:
const TIME_OFFSET:int = 1800000; //milliseconds in 30 minutes (1000*60*30)
var d:Date = new Date(getTimer()-baseTimer-TIME_OFFSET);
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();
}
更多关于这方面的信息可以在中找到,我不确定你想做什么,但我想我知道你的问题是什么。
通过减去min
var中的30,您只能操作您的输出。因此,实际计时器仍在计算实际分钟数
如果要从计时器中减去30分钟,则应在实例化d:Date
时执行此操作,例如:
const TIME_OFFSET:int = 1800000; //milliseconds in 30 minutes (1000*60*30)
var d:Date = new Date(getTimer()-baseTimer-TIME_OFFSET);
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();
}
请记住,还要删除变量最小值:字符串的-30
我希望这就是你要找的
编辑
考虑到您对getTimer()
和baseTimer
有很多不同之处的评论,您应该看看参考资料。它声明如下:
返回
int—自运行时初始化(处理ActionScript 2.0时)或自虚拟机启动以来的毫秒数
已启动(在处理ActionScript 3.0时)。如果运行时启动
播放一个SWF文件,然后加载另一个SWF文件,返回
值与加载第一个SWF文件的时间相关
在startTimer()
函数中跟踪baseTimer
和getTimer()
时,它们总是(或多或少)相同。看来你的案子有问题
解决方法是使用newdate().time
class而不是getTimer()
这样:
const TIME_OFFSET:int = 1800000; //milliseconds in 30 minutes (1000*60*30)
var d:Date = new Date(getTimer()-baseTimer-TIME_OFFSET);
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();
}
有关这方面的更多信息,请参见您修改了原始代码,您的目的是什么?我刚刚修改了这一行<代码>变量min:String=(d.minutes-30.0).toString()代码>。。bcz在原始代码中,计时器从30分钟开始计时。我希望它从0分钟开始…所以从d.minutes
中减去30分钟…奇怪的是,原来不是从30分钟开始,而是从0开始。而且读代码也没有理由。您的flash player版本是什么?@Kodiak是对的,也许您的系统时间已关闭?@Kodiak如果您运行链接上给出的代码,计时器将递增,直到达到30分钟,然后继续,它将变为负数。请在给定的链接中运行该代码并检查您是否修改了原始代码,您的目的是什么?我刚刚修改了这行<代码>变量min:String=(d.minutes-30.0).toString()代码>。。bcz在原始代码中,计时器从30分钟开始计时。我希望它从0分钟开始…所以从d.minutes
中减去30分钟…奇怪的是,原来不是从30分钟开始,而是从0开始。而且读代码也没有理由。您的flash player版本是什么?@Kodiak是对的,也许您的系统时间已关闭?@Kodiak如果您运行链接上给出的代码,计时器将递增,直到达到30分钟,然后继续,它将变为负数。请在给定的链接中运行该代码,并检查如果您在该链接上运行给定的代码,计时器将递增,直到达到30分钟,然后继续,它将变为负数。请在给定的链接中运行该代码,并检查我是否从中运行该代码,它是否工作正常。您是否可以跟踪startTimer()
函数中getTimer()和baseTimer
返回的值?每次都不同。有一次,我发现:getTimer()
:3511
和baseTimer
:4073
hmm,当我测试时,它们几乎都是一样的。所以我对我的答案做了一些调整,以进一步帮助你们。请你们在这个疑问上给我指点指点?如果运行链接上给出的代码,计时器将递增,直到达到30分钟,然后再继续,它将变为负数。请在给定的链接中运行该代码,并检查我是否从中运行该代码,它是否工作正常。您是否可以跟踪startTimer()
函数中getTimer()和baseTimer
返回的值?每次都不同。有一次,我发现:getTimer()
:3511
和baseTimer
:4073
hmm,当我测试时,它们几乎都是一样的。所以我对我的答案做了一些调整,以进一步帮助你们。请你们在这个疑问上给我指点指点?