Руководство по actionscript. часть 4, стр. 033

Sprite. dispatchEvent(new Event(CustomEventDemo. SOME_EVENT, true));

private function someEventListener (e:Event):void { trace(«SOMEJVENT occurred.»);

}

}

}

В результате вызова метода dispatchEvent ( ) из листинга 21.5 среда выполнения Flash осуществит диспетчеризацию события Cus tomEventDemo. SOME_EVENT, получателем которого является объект sprite, через цепочку диспетчеризации события.

Цепочка выглядит следующим образом:

Экземпляр класса Stage I

|-> Объект CustomEventDemo I

|-> Объект Sprite

В фазе захвата событие CustomEventDemo. SOME_EVENT проходит от экземпляра класса Stage до объекта CustomEventDemo. В фазе получения событие переходит к объекту Sprite. Наконец, в фазе всплытия событие снова переходит к объекту CustomEventDemo и затем вновь к экземпляру класса Stage. Когда экземпляр класса Stage в фазе всплытия получает уведомление о возникновении события, вызывается функция someEventLis tener ( ). Несмотря на то что событие CustomEventDemo. SOME_EVENT является пользовательским, оно все равно передается по цепочке диспетчеризации события.

Руководство по actionscript. часть 4, стр. 034

Как и в случае с внутренними событиями, иерархическая событийная архитектура языка ActionScript позволяет централизовать код, реагирующий на пользовательские события. Предположим, что мы создаем интернет-систему подачи заказов с элементом управления «корзина», который содержит значки выбранных продуктов. Элемент управления «корзина» представляется экземпляром пользовательского класса ShoppingBasket. Подобным образом значок каждого продукта представляется экземпляром пользовательского класса Product. Экземпляры этого класса являются отображаемыми детьми экземпляра класса ShoppingBasket. Экземпляр класса ShoppingBasket имеет строку заголовка, которая выводит название выбранного на настоящий момент продукта.

Когда пользователь выбирает значок продукта в элементе управления «корзина», приложение осуществляет диспетчеризацию пользовательского события Product. PRODUCT SELECTED, получателем которого является соответствующий экземпляр класса Product. Поскольку экземпляр класса ShoppingBasket является предком всех экземпляров класса Product, он получает уведомления всякий раз, когда возникает событие Product. PRODUCT_SELECTED.

Таким образом, чтобы синхронизировать текст строки заголовка экземпляра ShoppingBasket с выбранным в настоящий момент продуктом, мы просто регистрируем единственный приемник productSelectedListener ( ) для события Product. PRODUCT_SELECTED в экземпляре класса ShoppingBasket. Когда вызывается метод productSelectedListener ( ), мы знаем, что был выбран продукт, поэтому заменяем текст строки заголовка корзины названием нового выбранного продукта.

В листингах 21.6 и 21.7 показаны классы ShoppingBasket и Product. Пояснения к коду представлены в виде комментариев. Части кода, относящиеся к событиям, выделены полужирным шрифтом.

Листинг 21.6. Класс ShoppingBasket

package { import flash. display.*; import flash. text.*; import flash. events.*;

// Интернет-корзина, которая может визуально содержать объекты Product, public class ShoppingBasket extends Sprite {

// Отображаемая на экране строка заголовка панели «корзина»

private var title:TextField;

// Массив товаров в этой корзине

private var products:Array;

// Выбранный в настоящий момент продукт

private var selectedProduct:Product;

// Конструктор

public function ShoppingBasket ( ) { // Создаем новый пустой массив для хранения объектов — Product products = new Array( );

// Создаем отображаемую на экране строку заголовка

title = new TextField( );

title. text = «No product selected»;

title. autoSize = TextFieldAutoSize. LEFT;

title. border = true;

title. background = true;

title. selectable = false;

addChild(title);

// Регистрируем приемник для событий Product. PRODUCT_SELECTED, // получателями которых являются дочерние объекты Product. addEventLi stener(Product. PRODUCT_SELECTED, productSelectedLi stener);

}

// Добавляет новый объект Product в корзину public function addProduct (product:Product):void {

// Создаем новый продукт и добавляем его в массив products

products. push(product);

// Добавляем новый продукт в иерархию отображения данного объекта addChiId(products[products. length-1]);

// Теперь, когда у нас появился новый продукт, изменяем // положение всех продуктов updateLayout( );

}

// Очень простой алгоритм размещения продуктов, // упорядочивающий все продукты в одну строку

// в том порядке, в котором они были добавлены // в корзину, слева направо public function updateLayout ( ):void { var totalX:Number = 0;

for (var i:int = 0; i < products.length; i++) { products[i].x = total x;

totalX += products[i] .width + 20; // 20 — интервал между колонками products[i].у = title. height + 20; // 20 — интервал между строками

}

}

// Реагирует на возникновение событий Product. PRODUCT_SELECTED, // получателями которых являются дочерние объекты Product. // Когда продукт выбран, этот метод обновляет // строку заголовка корзины, используя // название выбранного продукта.

Руководство по actionscript. часть 4, стр. 035

Private function productSelectedListener (e:Event):void { // Запоминаем выбранный продукт на тот случай, // если нам в дальнейшем потребуется // обратиться к нему selectedProduct = Product(е. target);

// Обновляем строку заголовка корзины title. text — selectedProduct. getName( );

}

}

}

Листинг 21.7. Класс Product

package { import flash. display.*; import flash. events.*; import flash. text.*;

// Значок продукта, который может быть помещен в объект ShoppingBasket

// с помощью метода ShoppingBasket. addProduct( ).

Руководство по actionscript. часть 4, стр. 036

// В этой упрощенной версии класса значок — просто текстовое поле

// без соответствующего графического значка.

public class Product extends Sprite {

// Событийная константа для пользовательского события PRODUCT_SELECTED

public static const PRODUCT_SELECTED:String = «PRODUCT_SELECTED»;

// Отображаемая на экране надпись, представляющая название продукта

private var label:TextField;

// Название продукта

private var productName:String;

// Конструктор

public function Product (productName:String) { // Сохраняем название продукта this. productName = productName; // Создаем отображаемую на экране надпись label = new TextField( );

label. text = productName;

label. autoSize = TextFieldAutoSize. LEFT;

label. border = true;

label. background = true;

label. selectable = false:

addChild(label);

// Регистрируем приемник для событий щелчка кнопкой мыши. // Регистрируя приемник для событий MouseEvent. CLICK в этом объекте, // мы будем получать уведомление о возникновении события всякий раз, // когда пользователь щелкает кнопкой мыши на его дочерних объектах // (например, на надписи).

Руководство по actionscript. часть 4, стр. 037

AddEventListener(MouseEvent. CLICK, clickListener);

}

// Возвращает название продукта public function getName ( ):String { return productName;

}

// Обрабатывает события MouseEvent. CLICK. В этом примере, чтобы выбрать // продукт и осуществить диспетчеризацию события // Product. PRODUCT_SELECTED, достаточно просто щелкнуть кнопкой мыши // на названии продукта. В более сложной реализации могут учитываться // другие факторы. Например, можно добавить возможность выбора // продуктов с помощью клавиатуры, а на время трансакции с сервером // отключать возможность выбора продуктов, private function clickListener (е:MouseEvent):void { // Уведомляем всех зарегистрированных приемников о том, что был выбран // данный продукт. Благодаря системе иерархической диспетчеризации // событий языка ActionScript, в процессе диспетчеризации // пользовательского события, получателем которого является данный // объект, вызываются не только приемники события // Product. PRODUCT_SELECTED данного объекта, но и приемники события // Product. PRODUCT_SELECTED, зарегистрированные в экземпляре класса // ShoppingBasket.

dispatchEvent(new Еvent(Product. PRODUCT_SELECTED, true));

}

}

}

В листинге 21.8 представлено очень простое приложение, демонстрирующее основы использования классов ShoppingBasket и Product из листингов 21.6 и 21.7.

Руководство по actionscript. часть 4, стр. 038

Листинг 21.8. Демонстрация использования класса ShoppingDemo

package { import flash. display. Sprite:

public class ShoppingBasketDemo extends Sprite { public function ShoppingBasketDemo ( ) { var basket:ShoppingBasket = new ShoppingBasket( ): basket. addProduct(new Product(«Nintendo Wii»)); basket. addProduct(new Product(«Xbox 360″));

basket. addProduct(new Product(«PlayStation 3″)); addChild(basket);

}

}

Переходим к событиям ввода

Мы рассмотрели практически все вопросы, касающиеся основных процессов, происходящих в иерархической событийной системе языка ActionScript. В следующем разделе мы применим полученные теоретические знания на практике, знакомясь с внутренними событиями пользовательского ввода приложения Flash Player.

ПИВА 22

Интерактивность

В этой главе мы рассмотрим, как можно добавить интерактивность в приложение, реагируя на события ввода Flash Player. В частности, мы познакомимся с пятью различными категориями событий ввода:

? мыши;

? фокуса;

? клавиатуры;

? текстовыми событиями;

? уровня приложения Flash Player.

Руководство по actionscript. часть 4, стр. 039

Для каждой из перечисленных категорий мы рассмотрим конкретные события, предлагаемые интерфейсом API приложения Flash Player, и код, необходимый для обработки этих событий.

Представленные в этой главе описания событий относятся к приложению Flash Player (к версии, реализованной в виде модуля расширения браузера, и к автономной версии), но в целом данная информация применима и к любой другой среде, поддерживающей ввод данных с помощью мыши и клавиатуры (например, приложение Adobe AIR). Если вы используете другие среды выполнения, обязательно просмотрите соответствующую документацию по событиям ввода. Официальную справочную информацию, относящуюся к событиям ввода приложения Flash Player, можно найти в разделе Constants описания класса Event и его подклассов в справочнике по языку ActionScript корпорации Adobe. Полезная информация также находится в разделе Events описания классов TextField, DisplayObject, InteractiveObject и Stage.

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

Только экземпляры класса InteractiveObject. Уведомления о возникновении событий ввода отправляются экземплярам только тех классов, которые наследуются от класса InteractiveObject (Sprite, TextField, Stage, Loader, MovieClip, SimpleButton и подклассов этих классов). Объекты других типов не получают уведомления о возникновении событий ввода, даже если эти объекты находятся в списке отображения. Например, экземпляры класса Shape могут помещаться в список отображения, однако класс Shape не наследуется от класса InteractiveObject, поэтому экземпляры класса Shape не получают уведомления о возникновении событий ввода. Если объект Shape визуально перекрывает объект TextField и пользователь щелкает кнопкой мыши на объекте Shape, получателем результирующего события щелчка будет являться не Shape,

a TextField. Чтобы организовать взаимодействие с объектом Shape или объектом Bitmap, поместите его в контейнер (Sprite или MovieClip) и зарегистрируйте приемник в этом контейнере для событий ввода.

Только объекты из списка отображения. Объекты, не находящиеся в списке отображения на момент диспетчеризации приложением Flash Player некоторого события ввода, не смогут получить уведомление о возникновении этого события.

Поведение по умолчанию. Некоторые события ввода вызывают стандартную реакцию приложения Flash Player, называемую поведением по умолчанию. Например, перемещение указателя мыши над экземпляром класса SimpleButton приводит к тому, что этот экземпляр отображает графическое изображение, связанное с состоянием «над» (когда указатель мыши находится над данным экземпляром). В некоторых случаях поведение по умолчанию приложения Flash Player может быть отменено путем вызова метода экземпляра preventDefault ( ) класса Event. Дополнительную информацию можно найти в разд. «Отмена стандартного поведения событий» гл. 12.

Теперь переходим непосредственно к событиям!

События мыши

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

? нажатие или отпускание левой кнопки мыши;

? перемещение указателя;

? использование колесика прокрутки мыши (например, вращение).

Руководство по actionscript. часть 4, стр. 040

Обратите внимание, что «щелчок правой кнопкой мыши» (то есть нажатие вспомогательной кнопки мыши) не включен в приведенный список. Приложение Flash Player генерирует события мыши только для основной (левой) кнопки мыши. Тем не менее стандартное контекстное меню приложения Flash Player, которое открывается щелчком вспомогательной кнопкой мыши, является настраиваемым. Дополнительную информацию можно найти в описании класса ContextMenu справочника по языку ActionScript корпорации Adobe.

Внутренние события мыши приложения Flash Player

В табл. 22.1 перечислены типы внутренних событий приложения Flash Player. Для каждого типа события столбец «Тип события» содержит константу класса

MouseEvent, представляющую официальное строковое название типа события. В столбце «Описание» указывается конкретное действие пользователя, приводящее к возникновению этого события. Столбец «Получатель» определяет объект, который играет роль получателя события при его диспетчеризации. Столбец «Поведение по умолчанию» описывает стандартную реакцию приложения Flash Player на данное событие. Столбец «Всплывает» содержит информацию о том, имеет ли данное событие фазу всплытия. Столбец «Тип данных объекта, передаваемого в функцию-приемник» определяет тип данных объекта, передаваемого в функцию-приемник, обрабатывающую данное событие. Наконец, столбец «Примечание» содержит важную информацию, касающуюся использования данного события.

Потратьте немного времени, чтобы познакомиться с событиями мыши приложения Flash Player, внимательно изучив табл. 22.1. Однако сначала рассмотрим несколько основных моментов, которые необходимо иметь в виду при чтении информации, представленной в таблице.

Системный фокус — следующие события генерируются даже тогда, когда приложение Flash Player не имеет системного фокуса: MouseEvent. MOUSE MOVE, MouseEvent. MOUSEjOVER, MouseEvent. MOUSE_OUT, MouseEvent. ROLL_OVER и MouseEvent. ROLL_OUT. Все остальные события мыши генерируются только в том случае, когда приложение имеет системный фокус.

Местоположение имеет значение — диспетчеризация событий не выполняется, когда пользователь манипулирует мышью за пределами области отображения приложения Flash Player, с одним исключением: если пользователь нажимает основную кнопку мыши в области отображения приложения Flash Player и затем отпускает ее за пределами этой области, выполняется диспетчеризация события MouseEvent. MOUSE_UP.

Для того чтобы получить уведомление, когда указатель мыши покидает область отображения приложения Flash Player, зарегистрируйте приемник для события Event. MOUSE_MOVE, как рассматривается далее в разд. «События ввода уровня приложения Flash Player».

Векторные изображения игнорируются в экземпляре основного класса — взаимодействие мыши с векторным содержимым, нарисованным через переменную экземпляра graphics основного класса SWF-файла, не вызывает генерацию событий мыши. Тем не менее генерация событий мыши происходит в результате взаимодействия мыши с векторным содержимым, нарисованным через переменную экземпляра graphics любого другого экземпляра класса InteractiveObj ect или его подклассов.

Руководство по actionscript. часть 4, стр. 041

Поведение по умолчанию отменить нельзя — поведение по умолчанию приложения Flash Player нельзя отменить ни для какого типа событий мыши.

Мгновенное обновление экрана — чтобы обновить содержимое на экране после обработки любого события мыши, используйте метод экземпляра updateAf terEvent ( ) класса MouseEvent. Полную информацию можно найти в разд. «Постсобытийные обновления экрана» гл. 23.

а

Ъ z

X

2

is 5?

II

S

V о о-

2S

X

Z

> о

3

D3 О

а

На* О. О? о

П. Й1

™ S fe о; 1 ш (л -9-

— т

е

t

11

Q js р о z

S 5 i

fD —

1

____ о к °

S|S 8 i i

^ij s s ° S

31 11s

s 2 ш 2 >s

s

г ГО О Л I-н I С

О? H О? _ Z О X Z

о

X

z *

0 S О. с;

1 *

О *

» 5′

s

с;

fD 0Q

fD

3

is

fD

OQ

И

и 3 О 3

s 2 w x P

fD

X

g

_ о

Ц

is

лю a, 5 ° c aJ

го го s JP.

Руководство по actionscript. часть 4, стр. 042

Го X X Q-

05

о О

z z

С CL ш Ш

Z Z

с

$

Ш

?3

т

июй и

е

о

2 Si

-г га ш

J [S

s vS Ф

HOE

If

u

s

ra

2

3

ro

ro

ra

7

§ z

i

о

5

t

i s g &

Si!

5 h с I ‘

с h ш 0 ‘

s 5 о §. !

5 VO О 3 I

ш о o. m i

i о z

5 к

3*8 5 я 53 5 <

ill

§

¦H о

b tj g |’| ш 2 о 05 * 2

с о

cd

I. til

с

a

О) к

II

о ш z z

ф s-

> Q.



Полезные ссылки
Случайные записи
  • 23.07.2011">Животные рисунки
  • 24.02.2011">Руководство по actionscript. часть 7, стр. 007
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.56
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.73
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.146
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 066
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.77
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.35
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.160
  • 02.08.2010">Стили веб-дизайна
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.109
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.40
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 137
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 148
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 105
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...