События кнопок

Отличие от клипов, кнопки неразрывно связаны со сценариями ActionScript. Если у кнопки нет обработчика того или иного ее события, то ее наличие абсолютно бессмысленно. Всего для масса Button характерно 11 событий; 9 из них мы рассмотрим в данном разделе. О событиях же onSetFocus и on Kill Foe us поговорим, когда будет рассматриваться вопрос о клавиатурном фокусе.

onPress
Событие onPress возникает, если левая клавиша мыши нажимается в тот момент, когда ее указатель располагается над активной областью кнопки. Данному событию соответствует переход проигрывающей головки временной диаграммы кнопки на кадр Down. Причем до тех пор, пока связанный с обработчиком onPress код не будет проделан, изменения вида кнопки не произойдет. Это нужно учитывать, если при нажатии кнопки должен быть выполнен большой объем расчетной работы. В таких случаях гораздо лучше использовать событие onRelease.

Событие onPress активно применяется и в случае клипов. Используя его, можно максимально просто установить факт щелчка по экземпляру.

onRelease
Событие onRelease соответствует отпусканию кнопки. Оно возникает непосредственно после события onPress, но только в том случае, если при освобождении левой клавиши мыши ее указатель располагался над активной областью кнопки.


Если пользователь сместил указатель за пределы активной области или нажатие левой клавиши мыши не сопровождалось событием onPress, то событие onRelease не происходит.

Событие onRelease связано с переходом кнопки в состояние Over. Однако изменение ее вида осуществляется лишь тогда, когда заканчивается выполнение кода функции-обработчика.

onReleaseOutside
Событие onReleaseOutside происходит, если кнопка отпускается в тот момент, когда указатель мыши располагается вне активной зоны. Во всем остальном оно полностью схоже с событием onRelease.

На практике событие onReleaseOutside обычно используется как дополняющее событие onRelease. Его необходимо применять, если на отпускание кнопки нужно среагировать вне зависимости оттого, где при этом располагался указатель мыши. А так как чаше всего именно так и бывает, обработчик onRelease редко когда не дублируется обработчиком onReleaseOutside.

onRollOver
Событие onRollOver возникает при вхождении указателя мыши в активную область кнопки. Ему соответствует смена режимов кнопки с Up на Over (она происходит лишь после выполнения кода в обработчике). Важным условием возникновения события onRollOver является то, что левая клавиша мыши не должна быть нажата.

В случае кнопок класса Button событие onRollOver применяется не очень часто.


Это связано с тем, что они реагируют на него сменой режимов автоматически. Гораздо важнее данное событие, если в качестве кнопки выступает клип. Используя его, можно осуществить в нужный момент переход на кадр, изображающий режим Over.

Кроме того, событие onRollOver может быть полезно при разработке игр, в которых нужно оперативно реагировать на наведение на объект указателя мыши.

onRollOut
Событие onRollOut происходит при выходе указателя мыши за пределы активной области кнопки. При этом режим Over сменяется режимом Up (но только после того, как будет выполнен код и обработчике). Событие onRollOut возникает лишь в том случае, если левая кнопка мыши была не нажата.

При помощи события on RollOut можно решать несколько важных задач. Во-пер-иых, оно позволяет осуществлять переход между режимами Over и Up, если в качестве кнопки используется клип. Во-вторых, оно дает возможность зарегистрировать момент выхода указателя мыши за пределы клипа или кнопки. В-третьих, используя его, можно среагировать на выход указателя мыши за пределы окна плейера. Для этото нужно создать прозрачный клип (или кнопку), полностью закрывающий поле фильма.


Если указатель мыши будет перемещаться не очень быстро, то при его пересечении границы окна плейера для данного клипа возникнет событие onRollOut.

onDragOut
Событие onDragOut полностью схоже с событием onRollOut затем исключением, что оно происходит, если при выходе указателя за границу активной области кнопки левая клавиша мыши была нажата. Обычно onDragOut дублирует onRollOut, если факт выхода указателя за пределы кнопки должен быть установлен вне зависимости от того, в каком положении находилась левая клавиша мыши.

onDragOver
Пожалуй, самое малоиспользуемое событие кнопок. Происходит, если пользователь нажимает кнопку (событие onPress), потом, не отпуская ее, выводит указатель мыши за пределы активной области (событие onDragOut), а затем возвращает его в границы кнопки. Обычно событие onDragOver дополняет событие onRollOver, позволяя реагировать на появление указателя в активной области вне зависимости от обстоятельств. Роль событий onDragOver и onDragOut повышается, если для кнопки используется режим элемента меню.

onKeyDown и onKeyUp
События onKeyDown и onKeyUp аналогичны одноименным событиям класса MovieClip, которые мы рассматривали в предыдущей главе.


Им соответствует нажатие и отпускание клавиш клавиатуры. Подробно о данных событиях мы поговорим тогда, когда будем разбирать объект Key. Сейчас же обсудим лишь особенности использования onKeyDown и onKeyUp в случае кнопок, В обычном состоянии кнопки не «слышат» (точно также, как и клипы) событий клавиатуры. Они становятся им доступными лишь при наведении фокуса. Это связано с тем, что только в режиме фокуса с кнопками можно работать при помощи клавиатуры (например, чтобы задействовать помещенную в фокус кнопку, нужно нажать ).

Если необходимо, чтобы события onKeyDown и on KeyUp были доступны кнопке и в обычном состоянии, ее нужно сделать листенером объекта Key. Для примера приведем код, который делает кнопку в два раза большей при нажатии пробела:

Key.addListener(but); // Делаем кнопку but листенером
// объекта Key
but.onKeyDown = function():Void {
// Данное событие возникает при нажатии
// любой клавиши
if (Key.getCode() == Key.SPACE) { // Проверяем, пробел ли был нажат
this.xscale *= 2, this._yscale *= 2;
}
}

События onKeyDown и onKeyUp стали доступными кнопкам только в последней версии Flash.


Во Flash MX у класса Button было только 9 событий.

Особенности событий кнопок
Главной особенностью «кнопочных» событий является то, что они возникают только для того экземпляра, который непосредственно взаимодействует с указателем мыши. Если несколько кнопок расположены друг над другом, то события будут регистрироваться только для верхней из них, Если необходимо, чтобы «кнопочные» события можно было использовать для кнопки, перекрывающейся с другой кнопкой, последнюю нужно сделать неактивной, используя свойство enabled.

По умолчанию клипы не «слушают» событий кнопок. Это означает, что, во-первых, при наведении на клип указателя мыши его форма не будет меняться со стрелки на очертания руки. Во-вторых, если под клипом располагается кнопка, то она сохранит свою восприимчивость к действиям со стороны пользователя.

Клипы начинают вести себя как кнопки лишь тогда, когда им присваивается обработчик одного из «кнопочных» событий. При этом не важно, обработчик какого события был создан: клип будет «заглушать» все события для расположенной под ним кнопки. При удалении обработчика обычное поведение клипов восстанавливается.

Обработчики «кнопочных» событий не могут быть созданы для основной временной диаграммы. Если клип используется как кнопка, то по умолчанию его активная зона задается на основании объектов проигрываемого в данный момент кадра. Однако активная зона может и не совпадать с клипом — системе нужно указать, какой клип должен применятся в качестве ее. Это можно сделать, используя свойство hitArea.

Особенности таких событий, как onDragOver и onDragOut, зависят от выбора режима для кнопки — Track As Button (Отслеживать как кнопку) или Track As Menu Item (Отслеживать как элемент меню).

События кнопок в стиле Flash 5
Во Flash 5 (и ранее) обработчики событий кнопок помещались непосредственно на сами экземпляры, а не на кадры временной диаграммы. Задавались они по следующей схеме:

on (event) {
statements
}
где:

• on — ключевое слово, указывающее транслятору, что данная структура является
обработчиком;

• event — имя события. Оно имеет такое же написание, как и в современной модели, за малым исключением — в нем нет приставки on (например, HeonPressn onDragOver, a press и dragOver);

• statements — код, который должен быть выполнен при возникновении события.

Пример:
on(press) {
trace("Кнопка нажата!");
}

Начиная со Flash MX обработчики on(event) могут быть созданы и для клипов наряду с обработчиками onClipEvent(event).

При использовании модели событий Flash 5 доступно событие, прямого аналога которого нет в списке событий класса Button — keypress. Оно, в отличие от всех остальных событий кнопок модели Flash 5, не связано с мышью и возникает при нажатии определенной клавиши. Например, чтобы среагировать на опускание клавиши с буквой «а», нужно набрать:

on (keyFress "а") {
trace("Кнопка 'а' нажата");
}

Если необходимо «отловить» нажатие служебной клавиши, то нужно использовать особый ее идентификатор. Данные идентификаторы имеются лишь для 14 клавиш: , , , , , , , , , , , , , .

Пример:
on(keyPress "") {
trace("Старт!");
}

В настоящее время использовать событие keyPress не имеет смысла, так как существуют куда более мощные возможности по взаимодействию с клавиатурой, предоставляемые объектом Key, Так, они позволяют реагировать на нажатие большего числа клавиш, а также обрабатывать клавиатурные сочетания.

Обработчики для 4 событий — onSetFocus, onKillFocus, onKeyUp, nonKeyDown — не могут быть заданы в стиле Flash 5. Их можно создать лишь как методы кода кадров.

Модель событий Flash 5 не имеет никаких преимуществ по сравнению с современными концепциями создания обработчиков (см. главу 8). Однако она куда менее пластична и приводит к децентрализации кода. Поэтому применять обработчики on(event) не стоит, но иметь о них представление нужно — хотя бы для того, чтобы без проблем разбираться в коде сторонних разработчиков.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Клипы как кнопки
Отключение кнопок
Режим элемента меню
Управление кнопками при помощи клавиатуры

Вернуться в раздел: Action Script / 11. Кнопки