Події кнопок
На відміну від кліпів, кнопки пов'язані зі сценаріями ActionScript. Якщо кнопка не має обробника тієї чи іншої її події, то її наявність абсолютно безглуздо. Усього для маси Button характерно 11 подій; 9 з них ми розглянемо у цьому розділі. Про події onSetFocus і on Kill Foe us поговоримо, коли буде розглядатися питання про клавіатурний фокус.
onPressПодія onPress виникає, якщо ліва клавіша миші натискається в той момент, коли її покажчик розташовується над активною областю кнопки. Ця подія відповідає перехід програваючої головки тимчасової діаграми кнопки на кадр Down. Причому, доки пов'язаний з обробником на Press код не буде зроблено, зміни виду кнопки не відбудеться. Це потрібно враховувати, якщо при натисканні кнопки має бути виконаний великий обсяг розрахункової роботи. У разі набагато краще використовувати подію наРеал.
Подія onPress активно застосовується і у разі кліпів. Використовуючи його, можна максимально просто встановити факт натискання на екземплярі.
onReleaseПодія onRelease відповідає відпусканню кнопки. Воно виникає безпосередньо після події на Press, але тільки в тому випадку, якщо при звільненні лівої клавіші миші вказівник розташовувався над активною областю кнопки.
Якщо користувач змістив покажчик за межі активної області або натискання лівої клавіші миші не супроводжувалося подією onPress, то подія onRelease не відбувається.
Подія onRelease пов'язана з переходом кнопки в стан Over. Однак зміна її виду здійснюється лише тоді, коли закінчується виконання коду функції-обробника.
onReleaseOutsideПодія onReleaseOutside відбувається, якщо кнопка відпускається в той момент, коли вказівник мишірозташовується поза активною зоною. У всьому іншому воно цілком схоже на подію наРеал.
На практиці подія 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 on DragOver, a press та dragOver);
• statements — код, який має бути виконаний у разі виникнення події.
Приклад: on(press) trace("Кнопка натиснута!"); >
Починаючи з Flash MX, обробники on(event) можуть бути створені і для кліпів поряд з обробниками onClipEvent(event).
При використанні моделі подій Flash 5 є подія, прямого аналога якої немає в списку подій класу Button - keypress.Воно, на відміну від інших подій кнопок моделі Flash 5, не пов'язане з мишею і виникає при натисканні певної клавіші. Наприклад, щоб відреагувати на опускання клавіші з літерою «а», потрібно набрати:
on (keyFress "а") trace("Кнопка 'а' натиснута"); >
Якщо необхідно «відловити» натискання службової клавіші, потрібно використовувати особливий її ідентифікатор. Дані ідентифікатори є лише для 14 клавіш: , , , , , , , , ,
В даний час використовувати подію keyPress не має сенсу, так як існують куди більш потужні можливості по взаємодії з клавіатурою, що надаються об'єктом Key. Так, вони дозволяють реагувати на натискання більшої кількості клавіш, а також обробляти клавіатурні поєднання.
Обробники для 4 подій - onSetFocus, onKillFocus, onKeyUp, nonKeyDown - не можуть бути задані в стилі Flash 5. Їх можна створити лише як методи коду кадрів.
Модель подій Flash 5 не має жодних переваг у порівнянні з сучасними концепціями створення обробників (див. Розділ 8). Однак вона набагато менш пластична і призводить до децентралізації коду. Тому застосовувати обробники on(event) не варто, але мати про них уявлення потрібно хоча б для того, щоб без проблем розбиратися в коді сторонніх розробників.