Март 2011
Руководство по actionscript. часть 4, стр. 100
LEAVE реместился за пределы области отображения приложения MOUSE_ENTER отсутствует. Используйте событие MouseEvent. MOUSE_MOVE, чтобы определить, когда указатель мыши вновь появится в пределах области отображения Flash Player
Поближе познакомимся с четырьмя событиями, представленными в табл. 22.5.
События Event. ACTIVATE и Event. DEACTIVATE
События Event. ACTIVATE и Event. DEACTIVATE обычно применяются для разработки приложений, которые самостоятельно активизируются или деакти-визируются в ответ на получение или потерю фокуса операционной системы проигрывателем Flash Player. Например, в ответ на потерю фокуса проигрывателем приложение может заглушить все звуки, закрыть открытое меню или приостановить воспроизведение анимации.
В отличие от других событий ввода, с которыми мы познакомились в этой главе, события Event. ACTIVATE и Event. DEACTIVATE не имеют фазы захвата и фазы всплытия. Вместо этого события Event. ACTIVATE и Event. DEACTIVATE могут быть обработаны приемниками, зарегистрированными в любом экземпляре любого класса, унаследованного от класса EventDispatcher (примечание: не только классов, унаследованных от класса DisplayObject). Более того, когда функция-приемник для событий Event. ACTIVATE и Event. DEACTIVATE зарегистрирована в отображаемом объекте, она вызывается, даже когда данный объект не находится в списке отображения.
В листинге 22.18 демонстрируются основы использования событий Event. ACT IVATE и Event. DEACTIVATE — когда проигрыватель Flash Player получает системный фокус, приложение из листинга начинает воспроизведение анимации «вращающийся прямоугольник», а когда Flash Player теряет системный фокус, воспроизведение анимации останавливается (методики создания анимации будут рассмотрены в гл. 24).
Листинг 22.18. Реагирование на события Event. ACTIVATE и Event. DEACTIVATE
package { import flash. display.*; import flash. utils.*; import flash. events.*;
public class Spinner extends Sprite { private var timer:Timer; private var rect:Sprite;
public function Spinner ( ) { // Создаем изображение прямоугольника rect = new Sprite( ); rect. x = 200; rect. у = 200;
rect. graphi cs.1i neSty1e(1); rect. graphics. beginFi 11 (OxOOOOFF); rect. graphics. drawRect(0, 0, 150, 75); addChild(rect);
// Регистрируем приемник для получения уведомлений,
// когда приложение Flash Player
// получает или теряет системный фокус
addEventLi stener(Event. ACTIVATE, acti vateLi stener);
addEventLi stener(Event. DEACTIVATE, deacti vateLi stener);
// Создаем таймер,
// который будет использован для анимации timer = new Timer(50, О)-;
timer. addEventListener(TimerEvent. TIMER, timerListener);
}
// Вращает изображение прямоугольника private function timerListener (e:TimerEvent):void { rect. rotation += 10;
}
// Обрабатывает события Event. ACTIVATE
private function activateListener (e:Event):void {
// Начинаем вращение изображения прямоугольника
timer. start( );
}
// Обрабатывает события Event. DEACTIVATE
private function deactivateListener (e:Event):void {
// Останавливаем вращение изображения прямоугольника
timer. stop( );
Событие Event. RESIZE
Событие Event. RES IZE обычно используется при разработке приложений с «растягивающимся» содержимым, когда размеры элементов интерфейса изменяются автоматически для соответствия доступному пространству в области отображения проигрывателя Flash Player.
Руководство по actionscript. часть 4, стр. 101
Событие Event. RESIZE возникает тогда, когда переменной scaleMode экземпляра класса Stage Flash Player присвоено значение StageScaleMode. NO_SCALE и происходит изменение размеров области отображения проигрывателя. Изменение размеров происходит в любом из следующих случаев:
? изменяются размеры окна автономной версии Flash Player либо пользователем, либо в результате вызова функции f scommand («fullscreen», «true»);
? пользователь изменяет размеры окна браузера, содержащего SWF-файл, внедренный с применением процентных значений для атрибутов height или width тегов ИЛИ.
Следующий HTML-код демонстрирует, как можно внедрить SWF-файл с использованием процентных значений для атрибута width тегов и. Обратите внимание, что для одного измерения задан фиксированный размер в пикселах (height=»7 5″), а для другого — размер в процентах (width=»100%»).
OBJECT classid=»clsid:D27CDB6E-AE6D-llcf-96B8-444553540000″
codebase=»http://fpdownload. macromedi a. com/get/f1ashplayer/current/swf 1 ash. cab»
width=»100r
height=»75″>
height=»75″
type=»application/x-Shockwave-flash» piugi nspage=»http://www. adobe. com/go/getf1ashplayer»>
Приемники для события Event. RES I ZE должны быть зарегистрированы в экземпляре класса Stage Flash Player, как показано в следующем коде. Обратите внимание, что переменной scaleMode обязательно должно быть присвоено значение StageScaleMode. NO_SCALE.
Руководство по actionscript. часть 4, стр. 102
Package { import flash. display.*; import flash. events.*;
public class ResizeSensor extends Sprite { public function ResizeSensor ( ) { stage. scaleMode = StageScaleMode. N0_SCALE; stage. addEventLi stener(Event. RESIZE, resi zeListener);
private function resizeListener (e:Event):void { traceCFlash Player was resized»);
}
}
}
Листинг 22.19 расширяет предыдущий код, показывая, как размещать объект Sprite rect в правом верхнем углу области отображения Flash Player при каждом изменении размеров окна приложения. Обратите внимание, что приложение из листинга вручную вызывает код, осуществляющий исходное размещение объекта, поскольку при первоначальной загрузке SWF-файла в приложение Flash Player событие Event. RESIZE не возникает.
Листинг 22.19. Растягиваемая форма
package { import flash. display.*; import flash. events.*;
// Помещает объект Sprite rect в правый верхний угол области отображения // приложения Flash Player всякий раз при изменении размеров окна // приложения Flash Player public class StretchyLayout extends Sprite { private var rect:Sprite; public function StretchyLayout ( ) {
// Создаем изображение прямоугольника и помещаем его
// в список отображения
rect = new Sprite( );
rect. graphics. lineStyle( );
rect. graphi cs. begi nFi11(OxOOOOFF);
rect. graphics. drawRect(0, 0, 150, 75);
addChild(rect);
// Предотвращаем масштабирование содержимого
stage. scaleMode = StageScaleMode. N0_SCALE;
// Помещаем SWF-файл в левый верхний угол области отображения
// приложения Flash Player
stage. align = StageAlign. TOP_LEFT;
// Регистрируем приемник для событий Event. RESIZE
stage. addEventLi stener(Event. RESIZE, resi zeListener);
// Вручную вызываем код для исходного размещения объекта posi ti onRectanglе( );
}
// Обрабатывает события Event. RESIZE private function resizeListener (e:Event):void { positionRectangle( );
}
// Помещает объект rect в правый верхний угол области отображения
// приложения Flash Player
private function positionRectangle ( ):void {
rect. x = stage. stageWidth — red. width; rect. у = 0;
}
}
}
Событие Event. MOUSE LEAVE
Событие Event. MOUSE_LEAVE обычно применяется для отключения или удаления содержимого, взаимодействующего с мышью, когда указатель покидает пределы области отображения проигрывателя Flash Player. Например, в приложении, которое скрывает системный указатель мыши, заменяя его пользовательским изображением указателя мыши (как было показано ранее в листинге 22.5), изображение пользовательского указателя мыши скрывается, когда он перемещается за пределы области отображения приложения Flash Player.
Руководство по actionscript. часть 4, стр. 103
Как и в случае с Event. RESIZE, приемники для события Event. MOUSE_LEAVE должны быть зарегистрированы в экземпляре класса Stage приложения Flash Player. Следующий пример демонстрирует базовый код, необходимый для обработки событий Event. MOUSE_LEAVE:
package { import flash. display.*; import flash. events.*;
public class MouseLeaveSensor extends Sprite { public function MouseLeaveSensor ( ) { // Регистрируем приемник для событий Event. M0USE_LEAVE stage. addEventLi stener(Event. MOUSE_LEAVE, mouseLeaveLi stener);
}
// Обрабатывает события Event. MOUSE_LEAVE private function mouseLeaveListener (e:Event):void { traceCThe mouse has left the building.»);
}
}
Из программы на экран
На протяжении нескольких предыдущих глав мы рассмотрели множество методик для создания графического содержимого и его изменения в ответ на действия пользователя. В следующей главе мы узнаем, как происходит автоматическое обновление экрана для отображения текущего графического содержимого программы в средах выполнения Flash. Познакомившись с системой обновления экрана среды выполнения, мы перейдем к гл. 24, где будем использовать цикл обновления экрана для создания программной анимации.
Руководство по actionscript. часть 4, стр. 104
ПИВА 23
Обновления экрана
Говоря по существу, все обновления экрана в языке ActionScript можно разбить на две категории: происходящие через регулярные интервалы времени (запланированные обновления) и происходящие сразу после выполнения определенных функций-приемников событий (постсобытийные обновления). Независимо от категории, все обновления экрана являются автоматическими. В ActionScript отсутствуют универсальные способы, позволяющие запросить немедленное обновление экрана. Вместо этого новое графическое содержимое, создаваемое программным путем или вручную в среде разработки Flash, отображается автоматически на этапе запланированного или постсобытийного обновления. В этой главе рассматриваются две разновидности обновлений экрана в языке ActionScript.
Хотя большая часть этой книги посвящена созданию кода с использованием чистого языка ActionScript, а не рассмотрению конкретных сред разработки SWF-файлов, для чтения следующего материала вам потребуются базовые знания временной шкалы и методик создания сценариев временной шкалы в среде разработки Flash. Если вы незнакомы со средой разработки Flash, вам следует прочитать гл. 29 перед тем, как продолжить изучение предложенного здесь материала.
Запланированные обновления экрана
В ActionScript обновления экрана неразрывно связаны с анимационными возможностями среды выполнения Flash. Даже те приложения, которые созданы исключительно с использованием языка ActionScript в приложении Flex Builder 2 или с помощью консольного компилятора mxmlc, подвержены влиянию системы обновления экрана, реализующей анимационные возможности среды Flash.
Система обновления экрана среды выполнения Flash разработана для поддержки модели среды разработки Flash, предназначенной для создания анимированного содержимого с использованием сценариев. В среде разработки Flash анимированное содержимое создается вручную в виде последовательности кадров на временной шкале аналогично кадрам на обычной киноленте. Каждый визуальный кадр может быть связан с блоком кода, называемым сценарием кадра. В самых общих чертах, когда среда выполнения воспроизводит анимацию, созданную в среде разработки, она придерживается следующего цикла обновления экрана.
1. Выполнить код текущего кадра.
2. Обновить экран.
Руководство по actionscript. часть 4, стр. 105
3. Перейти к следующему кадру.
4. Повторить цикл.
Предположим, что у нас есть созданная в среде разработки Flash анимация, которая состоит из трех кадров, а с каждым кадром связан сценарий. Обобщенный процесс, в соответствии с которым среда выполнения Flash воспроизводит анимацию, выглядит следующим образом.
1. Выполнить сценарий кадра 1.
2. Отобразить содержимое кадра 1.
3. Выполнить сценарий кадра 2.
4. Отобразить содержимое кадра 2.
5. Выполнить сценарий кадра 3.
6. Отобразить содержимое кадра 3.
Руководство по actionscript. часть 4, стр. 106
На шагах 1, 3 и 5 сценарий каждого кадра может создать новое или изменить существующее графическое содержимое. Таким образом, более точное описание предыдущих шагов процесса воспроизведения анимации выглядело бы следующим образом.
1. Выполнить сценарий кадра 1.
2. Отобразить содержимое кадра 1 и визуальные результаты выполнения сценария кадра 1.
3. Выполнить сценарий кадра 2.
4. Отобразить содержимое кадра 2 и визуальные результаты выполнения сценария кадра 2.
5. Выполнить сценарий кадра 3.
6. Отобразить содержимое кадра 3 и визуальные результаты выполнения сценария кадра 3.
В приведенном описании процесса обратите внимание, что перед тем, как отобразить визуальные результаты выполнения некоторого сценария кадра, среда Flash всегда полностью завершает выполнение данного сценария.
Среда выполнения Flash никогда не прерывает выполнение сценария кадра для того, чтобы обновить экран.
Руководство по actionscript. часть 4, стр. 107
Скорость, с которой выполняются шесть предыдущих шагов, определяется скоростью кадров среды Flash, которая измеряется количеством кадров в секунду. Предположим, что для предыдущей анимации была установлена очень медленная скорость кадров — один кадр в секунду. Кроме того, предположим, что выполнение сценария каждого кадра занимает ровно 100 мс, а визуализация содержимого каждого кадра — ровно 50 мс. Относительно момента начала воспроизведения анимации теоретические времена выполнения шести описанных шагов выглядели бы следующим образом:
Оме: Начало выполнения сценария кадра 1 ЮОмс: Завершение выполнения сценария кадра 1 ЮООмс: Начало визуализации содержимого кадра 1 и результатов выполнения сценария кадра
1050мс: Завершение визуализации содержимого кадра 1 и результатов выполнения сценария кадра
1051мс: Начало выполнения сценария кадра 2 1151мс: Завершение выполнения сценария кадра 2
2000мс: Начало визуализации содержимого кадра 2 и результатов выполнения сценария кадра
2050мс: Завершение визуализации содержимого кадра 2 и результатов выполнения сценария кадра
2051мс: Начало выполнения сценария кадра 3 2151мс: Завершение выполнения сценария кадра 3
ЗОООмс: Начало визуализации содержимого кадра 3 и результатов выполнения сценария кадра
3050мс: Завершение визуализации содержимого кадра 3 и результатов выполнения сценария кадра
Обратите внимание, что после завершения выполнения сценария каждого кадра среда Flash не осуществляет немедленное обновление экрана. Вместо этого она выводит результаты выполнения сценария на следующем запланированном этапе визуализации кадра. Следовательно, обновления экрана среды выполнения Flash могут считаться запланированными обновлениями экрана, поскольку они происходят в соответствии с установленным графиком, который определяется скоростью кадров.
Руководство по actionscript. часть 4, стр. 108
Таким образом, еще более точное описание шагов предыдущего процесса воспроизведения анимации выглядело бы следующим образом.
1. Выполнить сценарий кадра 1.
2. Дождаться следующего запланированного этапа визуализации кадра.
3. Отобразить содержимое кадра 1 и визуальные результаты выполнения сценария кадра 1.
4. Выполнить сценарий кадра 2.
5. Дождаться следующего запланированного этапа визуализации кадра.
6. Отобразить содержимое кадра 2 и визуальные результаты выполнения сценария кадра 2.
7. Выполнить сценарий кадра 3.
8. Дождаться следующего запланированного этапа визуализации кадра.
Руководство по actionscript. часть 4, стр. 109
9. Отобразить содержимое кадра 3 и визуальные результаты выполнения сценария кадра 3.
Теперь давайте представим, что сценарий кадра 1 регистрирует функцию-приемник clickListener ( ) в экземпляре класса Stage для событий MouseEvent. CLICK. Всякий раз, когда выполняется функция clickListener ( ), из точки, где на настоящий момент находится указатель мыши, рисуется красная линия. Рассмотрим код сценария кадра для кадра 1:
import flash. events.*; import flash. display.*;
stage. addEventLi stener(MouseEvent. CLICK. cli ckLi stener);
function clickListener (e:MouseEvent):void { graphics. lineStyle(2. OxFFOOOO); graphics. lineTo(e. stageX. e. stageY);
}
Сразу после завершения выполнения сценария кадра 1 метод clickListener ( ) может получать уведомления о возникновении событий MouseEvent. CLICK.
Теперь предположим, что пользователь щелкнул кнопкой мыши в области отображения среды выполнения Flash через 500 мс после начала воспроизведения анимации (то есть в период ожидания, который представлен шагом 2 в предыдущем описании процесса). Метод clickListener ( ) выполняется немедленно, однако визуальные результаты этого не будут отображены до момента наступления следующего запланированного этапа визуализации кадра. На следующем этапе визуальные результаты выполнения метода clickListener ( ) будут отображены вместе с содержимым кадра 1 и результатами выполнения сценария кадра 1.
Таким образом, еще более точное описание шагов предыдущего процесса воспроизведения анимации выглядело бы следующим образом.