【问题标题】:Flex Timer example弹性定时器示例
【发布时间】:2011-12-09 14:26:47
【问题描述】:

我正在尝试在 flex 中使用计时器。我提到了这个例子:Timer : blog.flexexamples.com

这是我想要实现的目标:

我想启动计时器,显示 从计时器过去的分钟数 开始了。它应该与您所在的地区无关。( 无论您在哪个区域,计时器都应该可以正常工作 每个区域)。

定时器应该继续,除非我想点击某个按钮 在警报框中显示经过的时间(以分钟为单位),然后计时器应从 0 开始重新开始。

我尝试了我的示例,但它无法正常工作。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="vertical"
                verticalAlign="middle"
                backgroundColor="white"
                creationComplete="init()">

    <mx:Script>
        <![CDATA[
            import flash.events.TimerEvent;
            import flash.utils.Timer;

            import mx.controls.Alert;
            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 = (d.minutes).toString();
                var sec:String = (d.seconds).toString();

                counter.text = String(min+"."+sec);
            }

            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>

有人能说出问题所在吗?如何解决?

编辑: 如果我在我的电脑上运行这个例子,计时器从 30.0 开始,直到它达到 59.59,然后它变回 0.0,然后再次开始......现在我想要的是从 0.0 开始并继续计数分钟直到某个按钮被点击...这应该适用于任何时区

【问题讨论】:

  • 你应该是那个说出问题所在的人!怎么了?我们能帮你什么吗? “它不起作用”真的没有给出任何线索。
  • 如果我在我的电脑上运行这个例子,计时器从 30.0 开始,直到达到 59.59,然后它又回到 0.0,然后再次开始......我想要的是从 0.0 开始并继续计算分钟,直到单击某个按钮...这应该适用于任何时区

标签: flash actionscript-3 apache-flex timer flex3


【解决方案1】:

您的用例不需要使用 Date() 和/或时区。您需要做的就是计算经过的秒数,Timer 为您提供了一种简单的方法:将时间间隔设置为 1000(每秒计数一次)并使用 Timer.currentCount。然后你需要做的就是计算显示的分钟和秒。下面是一个可以合并到现有 mxml 中的实现:

private function init():void {
    t = new Timer(1000);
    t.addEventListener(TimerEvent.TIMER, updateTimer);
}

// it's good practice to separate event handler from functional method
private function updateTimer(evt:TimerEvent):void {
    display (t.currentCount);
}

private function display ( count : int ) : void {
    var minutes : int = count / 60; // divide by 60 to get the minutes
    var seconds : int = count % 60; // use modulo operator to get the "rest"
    var min : String = minutes < 10 ? "0" + minutes : "" + minutes; // add leading zero if necessary
    var sec : String = seconds < 10 ? "0" + seconds : "" + seconds;

    counter.text = min+":"+sec; // no need to cast to String if you use "" + something
}

private function startTimer():void {
    t.start();
}

private function stopTimer():void {
    t.stop();
    t.reset();
    display (0); // reset the display
}

【讨论】:

  • 无论时区如何,这项工作都有效吗?我的意思是这里的 UTC 没有问题?
  • 当它超过 60 分钟标记时,我希望它仅以分钟为单位继续显示时间.. 像这样 .. 61:15 .. 61 分钟,15 秒过去了 ..
  • 在这个例子中两者都是正确的:当你简单地计算定时器被调用的次数时,没有 UTC。而且由于没有“小时”,分钟会不断增加。
  • 感谢您的回答:) ...我正在运行您的代码..一旦没有问题出现,将接受您的回答..无论如何,我已经为这个答案 +1 了..
【解决方案2】:

您所指的示例是针对您的特定问题使事情变得有点复杂。下面是一个小例子,说明如何使用简单的Timer 显示分钟:

private const TIMER_INTERVAL:Number = 1000*60;
private var t:Timer;

private function init():void {
    t = new Timer(TIMER_INTERVAL);
    t.addEventListener(TimerEvent.TIMER, updateTimer);
    counter.text = "0";
}

private function updateTimer(evt:TimerEvent):void {

    counter.text = String(t.currentCount);
}

private function startTimer():void {

    t.start();
}

private function stopTimer():void {

    t.stop();

    // if you want the timer to reset make sure to reset your text also
    /*
    t.reset();
    counter.text = "0";
    */
}

【讨论】:

  • 我运行了你的代码 .. 但是,仍然在 5 分钟后 .. 它只显示 0 .. 时间没有改变 ..
  • 当它超过 60 分钟标记时,我希望它继续以分钟为单位显示时间.. 像这样 .. 61:15 .. 61 分钟,15 秒过去了
  • 您的 TIMER_INTERVAL 为 60 * 1000 毫秒 == 1 分钟。
  • 在 OP 中他要求showing minutes elapsed 所以这就是我选择最简单方法的原因。您的解决方案更完整(因此我的 +1)(@tomjerry 当我测试代码时我可以通过 5 分钟标记顺便说一句)
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多