Пример Flex Timer ... Таймер становится отрицательным - PullRequest
0 голосов
/ 06 декабря 2011

Я попробовал этот пример из blog.flexexamples.com . Это базовый пример таймера.

Но когда таймер пересекает отметку 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 Ответ

3 голосов
/ 06 декабря 2011

Я не совсем уверен, что вы пытаетесь сделать, но я думаю, что знаю, в чем ваша проблема.Вычитая 30 из min var, вы только манипулируете своим выводом.Таким образом, фактический таймер все еще считает реальные минуты.

Если вы хотите вычесть 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-файл загружается позже, возвращаемое значение относится к моменту загрузки первого 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();
}

Более подробную информацию можно найтив ссылка

...