Flash Flex定时器示例。。。计时器变为负数

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

我尝试了这个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>

我不太确定你想做什么,但我想我知道你的问题是什么。 通过减去
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,当我测试时,它们几乎都是一样的。所以我对我的答案做了一些调整,以进一步帮助你们。请你们在这个疑问上给我指点指点?