Flex定时器示例...定时器变为负数

时间:2011-12-06 13:49:01

标签: flash actionscript-3 flex timer flex3

我在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>

1 个答案:

答案 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