Класс Timer в ActionScript 3.0

Как уже ранее отмечалось (пост «Программная анимация в ActionScript»), в языке ActionScript 3.0 появился абсолютно новый класс - класс Timer (далее - просто таймер). И именно возможности класса Timer настоятельно рекомендуется использовать при создании программной анимации на AS 3.0.

В самом простом случае применение класса Timer может выглядеть следующим образом.

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer и в качестве параметра указываем периодичность вызова функции (в миллисекундах) */ var timer:Timer = new Timer(100); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ trace("timer"); } /* запускаем таймер */ timer.start();

или

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(0); /* указываем периодичность вызова функции (в миллисекундах) */ timer.delay = 100; /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ trace("timer"); } /* запускаем таймер */ timer.start();

В приведённом выше примере класс Timer используется для периодического (раз в 100 миллисекунд) вызова функции anim. И этот пример довольно сильно напоминает работу с рассмотренным ранее методом setInterval(). Но возможности класса Timer гораздо шире, чем у метода setInterval.

Так, например, мы можем не только указать периодичность вызова пользовательской функции, но и количество этих вызовов...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer и в качестве параметров указываем: - периодичность вызова функции (500) - количество вызовов функции (5) */ var timer:Timer = new Timer(500, 5); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ trace("timer"); } /* запускаем таймер */ timer.start();

или

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(0); /* указываем периодичность вызова функции (500) */ timer.delay = 500; /* указываем количество вызовов функции (5) */ timer.repeatCount = 5; /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ trace("timer"); } /* запускаем таймер */ timer.start();

В приведённом выше примере функция anim вызывается каждые полминуты (500 миллисекунд), но только ПЯТЬ раз. После пятого вызова функции работа таймера прекращается. Кстати, момент прекращения работы таймера можно отследить...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer и в качестве параметров указываем: - периодичность вызова функции (500) - количество вызовов функции (5) */ var timer:Timer = new Timer(500, 5); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* ловим момент окончания работы таймера */ timer.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ trace("timer"); } /* функция, которая будет вызвана в момент завершения работы таймера */ function onComplete(event:TimerEvent):void{ trace("The End") } /* запускаем таймер */ timer.start();

В примере, приведённом выше, мы отлавливаем момент завершения работы таймера (событие timerComplete) и в этот самый момент запускаем функцию onComplete.

Здесь уже упоминались два свойства класса Timer - это свойства delay и repeatCount. Свойство delay отвечает за интервал между срабатываниями таймера. А свойство repeatCount хранит число запусков, которые должен сделать данный таймер. Значения этих свойств можно и читать, и изменять.

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(0); /* указываем периодичность вызова функции (500) */ timer.delay = 500; /* указываем количество вызовов функции (5) */ timer.repeatCount = 5; /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ /* считываем значение свойства delay */ trace("delay = " + timer.delay); /* считываем значение свойства repeatCount */ trace("repeatCount = " + timer.repeatCount); } /* запускаем таймер */ timer.start();

Есть у класса Timer и другие полезные свойства. Чего только стоит currentCount! Свойство currentCount хранит общее число срабатываний таймера. Дело в том, что на практике часто требуется не только периодически вызывать функции, выполняющие какие-то определённые действия, но и точно знать, сколько раз эти функции сработали. В случае с setInterval() это решалось через использование дополнительной переменной...

ActionScript 3.0:

import flash.utils.setInterval; var count:uint = 0; function anim(){ count++; trace("count = " + count) } setInterval(anim,100);

Но для таймера надобность в переменной count отпадает. Ведь есть свойство currentCount...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(1000); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ trace("currentCount = " + timer.currentCount); } /* запускаем таймер */ timer.start();

Вы, конечно, можете возразить, что переменную-счётчик count можно в любой момент обнулить...

ActionScript 3.0:

import flash.utils.setInterval; var count:uint = 0; function anim(){ count++; if(count > 10){ count = 0; } trace("count = " + count) } setInterval(anim,100);

Но и свойство currentCount у таймера тоже можно обнулить. Для этого надо воспользоваться методом reset(). Метод reset() останавливает работу таймера и обнуляет значение у свойства currentCount...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(1000); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ if(timer.currentCount > 10){ /* останавливаем работу таймера и сбрасываем значение свойства currentCount */ timer.reset(); } trace("currentCount = " + timer.currentCount); } /* запускаем таймер */ timer.start();

или

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(1000); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ if(timer.currentCount > 10){ /* останавливаем работу таймера и сбрасываем значение свойства currentCount */ timer.reset(); /* снова запускаем таймер */ timer.start(); } trace("currentCount = " + timer.currentCount); } /* запускаем таймер */ timer.start();

Кстати, остановить работу таймера можно не только с помощью метода reset(). Есть ещё метод stop(), который останавливает работу таймера, но не обнуляет значения свойства currentCount...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(1000); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ if(timer.currentCount > 10){ /* останавливаем работу таймера */ timer.stop(); } trace("currentCount = " + timer.currentCount); } /* запускаем таймер */ timer.start();

Хорошо. Теперь мы знаем, как запускать и останавливать работу таймера. А как определить, работает или не работает таймер? Очень просто. Для этого надо обратится к свойству running класса Timer. Если таймер в данный момент запущен, то свойство running вернёт значение true...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(100); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ } /* запускаем таймер */ timer.start(); /* проверяем, запущен ли таймер */ trace(timer.running)

А если таймер остановлен (с помощью методов reset(), stop() или мы просто забыли запустить таймер с помощью метода start()), то свойство running вернёт значение false...

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(100); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ } /* запускаем таймер */ timer.start(); /* останавливаем таймер */ timer.stop(); /* проверяем, запущен ли таймер */ trace(timer.running)

или

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(100); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ } /* запускаем таймер */ timer.start(); /* останавливаем таймер */ timer.reset(); /* проверяем, запущен ли таймер */ trace(timer.running)

или

ActionScript 3.0:

/* импорт классов */ import flash.utils.Timer; import flash.events.TimerEvent; /* создаём объект Timer */ var timer:Timer = new Timer(100); /* ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim */ timer.addEventListener(TimerEvent.TIMER, anim); /* функция, периодически запускаемая таймером */ function anim(event:TimerEvent):void{ } /* проверяем, запущен ли таймер */ trace(timer.running)

Во всех трёх приведённых выше примерах мы получим значение FALSE. Обхитрить таймер не получится.

Приведённые выше примеры показывают, что возможности класса Timer гораздо шире, чем у старого-доброго setInterval(). Знаю, к работе с таймером надо ещё привыкнуть. Возможно, с первого взгляда Timer не выглядит удобным и, тем более, компактным. Но со временем вы на собственном опыте признаете превосходство таймера и не захотите возвращаться к "старичку" setInterval-у...

Как-то так :-)

Автор: admin

Дата добавления: 2012-05-24

Просмотров: 10852

Рейтинг поста: +14-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-01-24
Количество срабатываний таймера хранится в свойстве currentCount. Если вызвать метод stop, то currentCount не обнулится, а если метод reset - обнулится. Я использовал именно метод reset, так как, на мой взгляд, это логично. Если вам не надо обнулять, то используйте метод stop.
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-24
Но есть еще одна маленькая проблема. После err.visible = true при нажатии на кнопке должна быть остановка таймера. А он запускается снова. Как тут быть?
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-24
Спасибо вам преогромное! Я уже 3 дня голову безрезультатно ломаю. ВЫ - просто мой спаситель.

Успехов вам во всем! Если и я в чем то смогу вам помочь, то буду очень рада!
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-01-24
Надеюсь, я правильно понял ваш замысел:


import flash.utils.Timer;
import flash.events.TimerEvent;

var maxCount:uint = 10;

var timer:Timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, fl_TimerHandler);

err.visible = false;//клип с сообщением, что время истекло
timerTF.text = "";

btn.addEventListener(MouseEvent.CLICK, onClick);
function onClick(event:MouseEvent):void
{

if (timer.running)
{
timer.reset();
timerTF.text = "";
}
else
{
timer.start();
timerTF.text = "" + maxCount;
err.visible = false;
}
}

function fl_TimerHandler(event:TimerEvent):void
{
timerTF.text = "" + (maxCount - timer.currentCount);
if (timer.currentCount >= maxCount)
{
timer.reset();
err.visible = true;
}
}
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-24
Спасибо за подробные, исчерпывающие объяснения. Но как быть с управляемым таймером? Я ни как не могу добить его остановки. Прошу вас, помогите!!!
import flash.utils.Timer;
import flash.events.TimerEvent;
err.visible = false; //клип с сообщением, что время истекло
timerTF.text = "";
btn.addEventListener(MouseEvent.CLICK, onClick);
function onClick(event:MouseEvent):void
{
//trace(timer)
timerTF.text = "";
err.visible = false;
var fl_SecondsElapsed:Number = 10;
var timer:Timer = new Timer(1000,fl_SecondsElapsed);


timer.addEventListener(TimerEvent.TIMER, fl_TimerHandler);
timer.start();



function fl_TimerHandler(event:TimerEvent):void
{
trace("Осталось: " + fl_SecondsElapsed);
timerTF.text = "" + fl_SecondsElapsed;
fl_SecondsElapsed--;
if (fl_SecondsElapsed==0)
{
timerTF.text = "0"
err.visible = true;
}
}

if (!timer.running)
{
//если таймер запущен, то он будет остановлен
this.timer.stop();
timerTF.text = ""
timer=null
timer.removeEventListener(TimerEvent.TIMER, fl_TimerHandler);


}
}
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Страница 2 из 2: 12
Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика