Класс 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

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

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

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

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-26
Ой, какой вы молодец!
Спасибо! Спасибо! Спасибо!Спасибо! Спасибо! Спасибо!Спасибо!
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-01-25
Хосподи, как всё запутанно :-) Тогда, возможно, так:



Код:


import flash.utils.Timer;
import flash.events.*;

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.stop();
}
else
{
if (timer.currentCount >= maxCount)
{
timer.reset();
err.visible = false;
timerTF.text = "";
}
else if (timer.currentCount == 0)
{
timer.start();
err.visible = false;
timerTF.text = "" + maxCount;
}
else
{
timer.start();
}
}
}

function fl_TimerHandler(event:TimerEvent):void
{
timerTF.text = "" + (maxCount - timer.currentCount);
if (timer.currentCount >= maxCount)
{
timer.stop();
err.visible = true;
}
}
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-01-25
Оля, то есть, таймер начинает с 10 и доходит до 0. Появляется сообщение, что время истекло. При этом таймер продолжает работать: -1, -2, -3, -4, -5, ... Если при этом нажать кнопку, то таймер остановится. При следующем нажатии всё начинается заново (с 10). Я правильно понял?
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-25
Да, нет! Кнопка у вас правильная. Она многофункциональная. И работает отлично. Кроме одного варианта. Хотя и этот, в принципе, возможен. Проблема в том, что таймер обратного отсчета запускает определенное время на выполнение заданий 2 х команд детей. Как только заканчивается время. Таймер сообщает об этом. Нажимают на кнопку. Останавливают таймер. Обсуждают выполнение задания одной команды. Таймер в это время не работает. Потом дают задание второй команде. Снова включают таймер.
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-01-25
Эммм... Как-то странно... Но, если таймер дойдёт до 0, а пользователь не успеет нажать кнопку, то таймер начнёт показывать отрицательные значения. Вы так хотите? То есть, кнопка ТОЛЬКО ОСТАНАВЛИВАЕТ таймер?
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-25
Добрый день! Спасибо вам большое за все предлагаемые варианты. Ваши варианты все работают прекрасно. Наверное,я объясняю коряво. Постараюсь изложить подробнее. Запустили таймер. Он работает. Дошло до 0 и появился клип с сообщением об истекшем времени. После этого, нажимаем на кнопку, таймер должен остановиться, а он запускается снова.
Комментатор
Комментарий добавил(а): 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.stop();
}
else
{
timer.start();
err.visible = false;
if(timer.currentCount == 0)
{
timerTF.text = "" + maxCount;
}
}
}

function fl_TimerHandler(event:TimerEvent):void
{
timerTF.text = "" + (maxCount - timer.currentCount);
if (timer.currentCount >= maxCount)
{
timer.reset();
err.visible = true;
}
}
Комментатор
Комментарий добавил(а): 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.stop();
timerTF.text = "";
}
else
{
timer.start();
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
Мне надо, чтобы после этого таймер просто остановился. А при новом нажатии на кнопке, заработал снова.
Комментатор
Комментарий добавил(а): Ольга
Дата добавления: 2014-01-24
Еще раз, добрый день! Спасибо за объяснение. Кстати, больше нигде я не видела подобного глубокого аналитического объяснения. Примеры в справочниках не всегда понятны и убедительны. С написанном вами кодом работало все прекрасно. Я заменила на stop(),:
function fl_TimerHandler(event:TimerEvent):void
{
timerTF.text = "" + (maxCount - timer.currentCount);
if (timer.currentCount >= maxCount)
{
timer.stop();
err.visible = true;
}
}
но тогда в текстовом поле появляется сначала максимально большое число, потом минус 1 и клип с сообщением об ошибке.
Добавить комментарий:







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

Идиот-тест

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

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