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

Набор компонентов пользовательского интерфейса платформы разработки Flex является частью платформы разработки Flex — внешней библиотеки классов, поставляемой вместе с приложением Adobe Flex Builder. Эта библиотека также доступна для бесплатной загрузки по адресу http://www. adobe. com/go/flex2_sdk. Набор компонентов графического интерфейса платформы разработки Flex разработан для построения приложений с относительно стандартными элементами управления пользовательского интерфейса (полосами прокрутки, раскрывающимися меню, таблицами данных и т. д.). Элементы интерфейса платформы разработки Flex обычно используются в приложениях MXML, но могут включаться и в приложения, разработанные в основном с использованием языка ActionScript. Подробности использования платформы разработки Flex в приложениях на языке ActionScript можно найти в гл. 30.

Набор компонентов пользовательского интерфейса среды разработки Flash предназначен для использования в SWF-файлах, созданных в среде разработки Flash, а также, когда размер файла и низкое потребление памяти оказываются гораздо важнее расширенных возможностей компонента, например связывания данных и улучшенных возможностей стилизации. Набор компонентов пользовательского интерфейса среды разработки Flash и набор компонентов пользовательского интерфейса платформы разработки Flex используют очень похожий интерфейс API, что позволяет разработчикам применять полученные знания при переходе от одного набора компонентов к другому.

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

? Клип — контейнер для графического содержимого, реализующий интерактивные возможности, простейшее рисование, иерархическое размещение элементов и анимационные возможности.

? Текстовое поле — прямоугольная область, содержащая отформатированный текст.

? Кнопка — элемент ввода, представляющий собой очень простую интерактивную кнопку.

? Растровое изображение (появилось в приложении Flash Player 8) — графическое изображение в растровом формате.

Перечисленные элементы остаются доступными в интерфейсе API отображения, однако представляющие их классы в языке ActionScript 3.0 (MovieClip, TextField, SimpleButton и Bitmap) были улучшены, переработаны и приобрели больше возможностей.

Обзор API отображения

В языке ActionScript все графическое содержимое создается и управляется с помощью классов интерфейса API отображения. Даже элементы интерфейса платформы разработки Flex и среды разработки Flash используют интерфейс API отображения в качестве графической основы. Многие классы API отображения непосредственно представляют конкретный тип графического содержимого, выводимого на экран. Например, класс Bitmap представляет растровые изображения, класс Sprite — интерактивную графику, а класс TextField — отформатированный текст.

При обсуждении мы будем называть классы, которые непосредственно представляют отображаемое на экране содержимое (и суперклассы этих классов), базовыми классами отображения. Остальные классы API отображения определяют вспомогательную графическую информацию и функциональность, но сами не представляют содержимое на экране. Например, классы CapStyle и JointStyle определяют константы, представляющие настройки для рисования линий, в то время как классы Graphics и BitmapData задают множество примитивных операций рисования. Мы будем называть такие классы, не отображающие информацию на

экране, вспомогательными классами отображения. Большинство базовых и вспомогательных классов API отображения находятся в пакете flash. display.

Базовые классы отображения, представленные на рис. 20.1, образуют иерархию, которая отражает три базовых уровня функциональности: отображение, пользовательскую интерактивность и содержание. Соответственно тремя важнейшими классами API отображения являются: DisplayObject, InteractiveObject и DisplayObjectContainer. Непосредственно создать экземпляры этих классов невозможно, однако они определяют абстрактную функциональность, которая реализуется различными конкретными подклассами.

Как уже говорилось в гл. 6, ActionScript 3.0 не поддерживает настоящие абстрактные классы. Поэтому на рис. 20.1 классы DisplayObject, InteractiveObj ect и DisplayOb j ectContainer показаны не как абстрактные классы, а как классы абстрактного типа. Тем не менее, несмотря на эту техническую деталь, для краткости в оставшейся части этой главы мы будет использовать термин «абстрактный» при описании архитектурной роли, которую играют классы DisplayObject, InteractiveObject и DisplayObjectContainer.

I 1 Конкретный класс

отображения | | Содержимое, доступное

Рис. 20.1. Иерархия базовых классов отображения

Класс DisplayOb j ect — корневой элемент в иерархии базовых классов отображения, он определяет первый уровень графической функциональности API отображения — вывод на экран. Все классы, унаследованные от DisplayOb j ect, получают общий набор основных графических характеристик и возможностей. Например, для любого потомка класса DisplayOb j ect можно изменить его позицию, размеры и угол поворота с помощью переменных х, у, width, height и rotation. Класс

DisplayOb j ect — это не просто базовый класс; это источник многих расширенных возможностей в API отображения, включая следующие, но не ограничиваясь ими:

? преобразование координат (ознакомьтесь с описанием методов экземпляра localToGlobal ( ) и globalToLocal ( ) класса DisplayOb j ect в справочнике по языку ActionScript корпорации Adobe);

? определение пересечений между объектами и точками (ознакомьтесь с описанием методов экземпляра hitTestObject ( ) и hitTestPoint ( ) класса DisplayOb j ect в справочнике по языку ActionScript);

? применение фильтров, трансформаций и масок (ознакомьтесь с описанием переменных экземпляра filters, transform и mask класса DisplayObject в справочнике по языку ActionScript);

? непропорциональное изменение масштаба для «растягиваемых» графических элементов (ознакомьтесь с описанием переменной экземпляра scale 9gr id класса DisplayOb j ect в справочнике по языку ActionScript корпорации Adobe).

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

Обратите внимание, что иногда в этой книге используется неофициальный термин «отображаемый объект», который обозначает любой экземпляр класса, унаследованного от класса DisplayOb j ect.

Конкретные непосредственные подклассы класса DisplayOb j ect — Video, Bitmap, Shape, MorphShape и StaticText — представляют простейший тип отображаемого содержимого: базовую графику, выводимую на экран, которая не может получать вводимые данные или содержать другое вложенное графическое содержимое. Класс Video представляет потоковое видео. Класс Bitmap визуализирует растровые изображения, созданные и управляемые вспомогательным классом BitmapData. Класс Shape предоставляет простой, облегченный холст для векторного рисования. Специальные классы MorphShape и StaticText представляют соответственно фигуры с преобразуемой формой и статический текст, созданные в среде разработки Flash. Ни класс MorphShape, ни класс StaticText не могут быть созданы на языке ActionScript.

Единственный абстрактный подкласс InteractiveObj ect класса DisplayOb j ect образует второй уровень функциональности в API отображения — интерактивность. Все унаследованные от него классы получают возможность отвечать на события ввода от мыши и клавиатуры пользователя.

Конкретные непосредственные подклассы TextField и SimpleButton класса InteractiveObj ect представляют два различных типа интерактивного графического содержимого. Класс TextField представляет прямоугольную область для отображения отформатированного текста и получения вводимых пользователем данных. Класс SimpleButton представляет символы Button (Кнопка), создаваемые в среде разработки Flash, а также позволяет быстро создавать интерактивные кнопки из кода на языке ActionScript. Обрабатывая события ввода, передаваемые классами TextField или SimpleButton, программист может добавлять интерактивность в приложение. Например, экземпляр класса TextField может быть запрограммирован так, чтобы в ответ на событие FocusEvent. FOCUS IN изменялся цвет фона этого экземпляра, а экземпляр класса S impleBut t on может быть запрограммирован так, чтобы в ответ на событие MouseEvent. CLICK форма отправлялась на сервер.

Абстрактный подкласс DisplayOb j ectContainer класса InteractiveObj ect представляет основу третьего и последнего функционального уровня в API отображения — содержание. Все унаследованные от него классы получают возможность содержать любой другой экземпляр класса DisplayOb j ect.

Контейнеры используются для объединения нескольких графических объектов, что позволяет обрабатывать их вместе. Всякий раз, когда контейнер перемещается, поворачивается или трансформируется, все содержащиеся в нем объекты наследуют это перемещение, вращение или трансформацию. Подобным образом всякий раз, когда контейнер удаляется с экрана, содержащиеся в нем объекты удаляются вместе с ним. Более того, контейнеры могут быть вложены внутрь других контейнеров для создания иерархических групп отображаемых объектов.

При описании объектов в иерархии отображения в этой книге применяется стандартная терминология для описания древовидных структур. Например, объект, который содержит другой объект в иерархии отображения, называется родителем этого объекта, а содержащийся объект называется ребенком этого родителя. В многоуровневой иерархии отображения объекты, расположенные выше данного объекта в иерархии, называются предками этого объекта. С другой стороны, объекты, расположенные ниже данного объекта в иерархии, называются потомками этого объекта. Наконец, объект самого верхнего уровня в иерархии (объект, потомками которого являются все остальные объекты) называется корневым объектом.

Не путайте объекты-предки и объекты-потомки в иерархии отображения с классами-предками и классами-потомками в иерархии наследования. Для ясности в этой книге иногда используются термины «предки отображения» и «потомки отображения» для описания объектов-предков и объектов-потомков в иерархии отображения.

Каждый из подклассов класса DisplayOb j ectContainer — Sprite, MovieClip, Stage и Loader — обеспечивает уникальный тип пустой содержащей структуры, ожидающей заполнения содержимым. Класс Sprite — это важнейший элемент среди классов-контейнеров. Являясь потомком классов InteractiveObj ect и DisplayOb j ectContainer, класс Sprite предоставляет отличную основу для построения собственных элементов пользовательского интерфейса с нуля. Класс MovieClip — это расширенный тип класса Sprite, представляющий анимиро-ванное содержимое, которое было создано в среде разработки Flash. Класс Stage представляет основную область отображения (видимую область внутри границ окна приложения) среды выполнения Flash. Наконец, класс Loader используется для загрузки внешнего графического содержимого из локального источника или через Интернет.

_

До появления языка ActionScript 3.0 класс MovieClip использовался как универсальный графический контейнер (подобно использованию класса Sprite в языке ActionScript 3.0). — С появлением версии 3.0 ActionScript класс MovieClip применяется только для управления

экземплярами символов клипов, созданных в среде разработки Flash. Поскольку язык ActionScript 3.0 не предоставляет способ для создания элементов временной шкалы, например кадров и фигур с изменяемой формой, нет необходимости создавать пустые клипы на этапе выполнения приложения, написанного на языке ActionScript 3.0. Вме-

сто этого любое графическое содержимое, создаваемое программным путем, должно являться экземпляром одного из подходящих базовых классов отображения (Bitmap, Shape, Sprite, TextField и т. д.).

Интерфейс API отображения предоставляет широкие возможности, которые доступны через сотни методов и переменных. Многие из них рассматриваются в этой книге. В следующих же разделах мы сосредоточимся не на систематическом рассмотрении каждого метода и переменной, а на фундаментальных концепциях. Описание всех методов и переменных API отображения можно найти в справочнике по языку ActionScript корпорации Adobe.

Расширение иерархии базовых классов отображения. Хотя в большинстве случаев базовые классы отображения могут эффективно использоваться без внесения каких-либо изменений, большинство нетривиальных программ расширяют функциональность базовых классов отображения, создавая подклассы для собственных целей. Например, программа, рисующая геометрические фигуры, может определить классы Ellipse, Rectangle и Triangle, расширяющие класс Shape. Подобным образом, в приложении для просмотра новостей может быть определен класс Heading, который расширяет класс TextField, а в гоночной игре может быть определен класс Саг, который расширяет класс Sprite. На самом деле элементы пользовательского интерфейса в платформе разработки Flex являются потомками класса Sprite. В последующих главах мы увидим множество примеров пользовательских классов отображения. По мере изучения базовых классов отображения задумайтесь о том, как можно расширить их функциональность. Зачастую программисты на языке ActionScript расширяют и улучшают базовые классы отображения с помощью собственного кода. Дополнительную информацию можно найти далее, в разд. «Пользовательские графические классы».

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

Список отображения

Как уже говорилось, базовые классы отображения представляют типы графического содержимого, доступного в языке ActionScript. Чтобы создать реальную графику из этих теоретических типов, мы создаем экземпляры базовых классов отображения, а затем добавляем эти экземпляры в список отображения. Список отображения — это иерархия всех графических объектов, отображаемых средой выполнения Flash в настоящий момент. Когда отображаемый объект добавляется в список отображения и помещается в видимую область, среда Flash визуализирует содержимое этого объекта на экране.

Корневым элементом списка отображения является экземпляр класса Stage, который создается автоматически при запуске среды выполнения Flash. Этот особый, автоматически создаваемый экземпляр класса Stage выполняет две задачи. Во-первых, он выступает в качестве внешнего контейнера для всего графического содержимого, отображаемого средой выполнения Flash (то есть является корнем списка отображения). Во-вторых, он предоставляет информацию о глобальных характеристиках области отображения и позволяет управлять ими. Например, переменная экземпляра quality класса Stage определяет качество визуализации всей

отображаемой графики; переменная scaleMode задает способ масштабирования графики при изменении размеров области отображения; переменная f rameRate определяет текущую предпочтительную скорость (кадров в секунду) для всех анимационных роликов. Как будет рассказано в этой главе, обращение к экземпляру класса Stage всегда осуществляется через некоторый объект в списке отображения с помощью переменной экземпляра stage класса DisplayObject. Например, если output txt — экземпляр класса TextField, который в настоящий момент находится в списке отображения, обратиться к экземпляру класса Stage можно выражением output_txt. stage.

До появления языка ActionScript 3.0 класс Stage не содержал объекты из списка отображения. Более того, ко всем его методам и переменным можно было обращаться непосредственно через сам класс, как показано в следующем коде:

trace(Stage. align);

В языке ActionScript 3.0 к методам и переменным класса Stage нельзя обратиться через класс Stage, кроме того, не существует глобальной точки, ссылающейся на экземпляр класса Stage. В языке ActionScript 3.0 приведенная строка кода вызовет следующую ошибку:

Access of possibly undefined property ‘align’ through a reference with static type ‘Class’

На русском языке она будет звучать так: Обращение к возможно неопределенному свойству ‘align’ через ссылку на статический класс ‘Class’.

Чтобы избежать появления этой ошибки, обращайтесь к экземпляру класса Stage с помощью следующего подхода:

t race(некийОтображаемыйОбъект. stage. align):

Здесь некийОтображаемыйОбъект — это объект, который в настоящий момент находится в списке отображения. Архитектура класса Stage в языке ActionScript 3.0 позволяет в будущем иметь несколько экземпляров класса Stage, а также вносит вклад в систему безопасности приложения Flash Player (поскольку неавторизованные объекты, загруженные из внешних источников, не имеют глобальной точки для обращения к экземпляру класса Stage).

На рис. 20.2 представлено состояние списка отображения для пустой среды выполнения Flash до момента открытия SWF-файла. Левая часть рисунка демонстрирует символическое представление среды выполнения Flash, а правая часть — соответствующую иерархию списка отображения. Когда среда Flash пуста, иерархия списка отображения содержит всего один элемент (единственный экземпляр класса Stage). Но скоро появятся другие элементы!

Когда пустая среда Flash открывает новый SWF-файл, она находит основной класс этого SWF-файла, создает экземпляр данного класса и добавляет созданный экземпляр в список отображения в качестве первого ребенка экземпляра класса Stage.

^ I Напомним, что основной класс SWF-файла должен быть унаследован либо от класса Sprite, м$ а « тбо от класса MovieClip, каждый из которых является потомком класса DisplayObject. 4 _3л4 Методики определения основного класса SWF-файла рассматриваются в гл. 7.

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

Проигрыватель Flash

Список отображения

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

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

1

Рис. 20.2. Список отображения для пустой среды выполнения Flash

Экземпляр основного класса SWF-файла является точкой входа программы и первым графическим объектом, отображаемым на экране. Даже если экземпляр основного класса не создает никакую графику, он все равно добавляется в список отображения, готовый содержать любую графику, создаваемую приложением в будущем. Экземпляр основного класса первого SWF-файла, открываемого средой выполнения Flash, играет особую роль в языке ActionScript; он определяет конкретные глобальные настройки среды, например разрешение относительных URL-адресов и тип ограничений безопасности, применяемых к операциям с внешними источниками.

$4

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

Рассмотрим пример, который демонстрирует, как создается владелец сцены. Предположим, мы запустили автономную версию приложения Flash Player и открыли файл с именем GreetingApp. swf, основным классом которого является GreetingApp. Если файл GreetingApp. swf содержит только этот класс и класс GreetingApp не создает никакой графики, то список отображения приложения Flash Player будет включать всего два элемента: экземпляр класса Stage и экземпляр класса GreetingApp (содержащийся в экземпляре класса Stage). Это показано на рис. 20.3.

Проигрыватель Flash

Список отображения

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

Экземпляр класса GreetingApp файла GreetingApp. swf

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

Экземпляр класса GreetingApp файла GreetingApp. swf

Рис. 20.3. Список отображения для файла GreetingApp. swf

Как только экземпляр основного класса SWF-файла будет добавлен в экземпляр класса Stage, программа сможет добавлять новое содержимое на экран в такой последовательности.

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

1. Создать отображаемый объект (то есть экземпляр любого базового класса отображения или любого класса, который расширяет базовый класс отображения).

2. Вызвать метод экземпляра addChild ( ) класса DisplayOb j ectContainer либо над экземпляром класса Stage, либо над экземпляром основного класса и передать в метод addChild ( ) отображаемый объект, созданный на шаге 1.

Попробуем выполнить вышеописанные общие шаги, создав класс GreetingApp, а затем добавив прямоугольник, круг и текстовое поле в список отображения с помощью метода addChild ( ). Сначала приведем основу класса GreetingApp:

package { import flash. display.*: import flash. text. TextField:

public class GreetingApp extends Sprite { public function GreetingApp ( ) { }

}

}

В нашем классе GreetingApp будут использованы классы Shape и Sprite, поэтому мы импортируем целиком весь пакет flash. display, который содержит эти классы. Подобным образом в классе GreetingApp будет использован класс TextField, поэтому мы импортируем пакет flash. text. TextField.

Обратите внимание на то, что класс GreetingApp по необходимости расширяет класс Sprite. GreetingApp должен расширять либо класс Sprite, либо класс MovieClip, поскольку он является основным классом программы.

| В языке ActionScript 3.0 основной класс SWF-файла должен расширять либо класс Sprite, нг л «, ли6° класс MovieClip, либо их любой подкласс.

1 -

Когда основной класс представляет корневую временную шкалу FLA-файла, он должен расширять класс MovieClip. Во всех остальных случаях основной класс должен расширять класс Sprite. В нашем примере класс GreetingApp расширяет класс Sprite, поскольку он не ассоциирован с FLA-файлом. В результате компиляции этого класса должно получиться автономное приложение ActionScript.

Теперь создадим прямоугольник и круг в методе-конструкторе класса Gr ее t ingApp. И прямоугольник, и круг мы нарисуем внутри одного объекта Shape. Объекты Shape (и все графические объекты) создаются с помощью оператора new, как и объекты любого другого типа. Вот код, который используется для создания нового объекта Shape:

new ShapeC )

Безусловно, в дальнейшем нам придется обращаться к этому объекту, чтобы нарисовать в нем элементы, поэтому присвоим его переменной rectAndCircle: var rectAndCircle-.Shape = new ShapeC );

Для рисования векторов в языке ActionScript применяется вспомогательный класс отображения Graphics. Каждый объект Shape хранит свой собственный экземп-

ляр класса Graphics в переменной экземпляра graphics. Таким образом, чтобы нарисовать прямоугольник и круг внутри нашего объекта Shape, мы вызываем соответствующие методы над объектом rectAndCircle. graphics. Вот этот код:

// Задаем толщину линии, равную одному пикселу rectAndCi rclе. graphi cs.1i neStyle(1):

// Рисуем синий прямоугольник

rectAndCi rcle. graphics. beginFi11(OxOOOOFF, 1):

rectAndCircle. graphics. drawRect(125. 0. 150. 75):

// Рисуем красный круг

rectAndCi rcle. graphics. begi nFi11(OxFFOOOO, 1); rectAndCircle. graphics. drawCircle(50. 100. 50):

*\ -’-

I Дополнительную информацию о вектррном рисовании в языке ActionScript 3.0 можно м& найти в гл. 25.

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

Операции векторного рисования не ограничиваются классом Shape. Класс Sprite также предоставляет ссылку на объект Graphics через свою переменную экземпляра graphics, поэтому, чтобы нарисовать прямоугольник и круг, вместо объекта Shape мы могли бы создать объект Sprite. Тем не менее, поскольку для хранения объекта Sprite требуется больше памяти, чем для объекта Shape, лучше использовать объект Shape при создании векторной графики, не содержащей дочерних объектов и для которой не требуется интерактивности.

Строго говоря, если бы мы хотели добиться минимального расходования памяти в примере приложения GreetingApp, мы бы рисовали наши фигуры непосредственно внутри экземпляра класса GreetingApp (помните, что класс GreetingApp расширяет класс Sprite, поэтому он поддерживает векторное рисование). Наш код выглядел бы следующим образом:

package { import flash. display.*: public class GreetingApp extends Sprite { public function GreetingApp ( ) { graphics. lineStyle(l):

// Прямоугольник

graphics. beginFill(OxOOOOFF. 1): graphics. drawRect(125. 0. 150. 75):

// Круг

graphi cs. begi nFi11(OxFFOOOO. 1); graphics. drawCircle(50. 100. 50):

}

}

}

Этот код успешно рисует прямоугольник и круг на экране, но данный подход менее гибок, чем подход с помещением фигур в отдельный объект Shape. Помещение

рисунков в объект Shape позволяет переносить их, размещать по слоям, модифицировать и удалять независимо от остального графического содержимого в приложении. Например, возвращаясь к нашему предыдущему подходу с рисованием в экземпляре класса Shape (rectAndCircle), для перемещения фигур в новую позицию мы могли бы использовать следующий код:

// Перемещаем объект rectAndCircle вправо на 125 пикселов // и вниз на 100 пискелов rectAndCirclе. х = 125: rectAndCirclе. у = 100:

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

Обратите внимание, что предыдущее позиционирование объекта rectAndCircle осуществляется до того, как этот объект будет помещен в список отображения! Каждый отображаемый объект сохраняет свое собственное состояние, независимо от родителя, с которым он связан, — фактически независимо от того, добавлен объект в список отображения или нет. Когда объект rectAndCircle будет добавлен в контейнер отображения, он будет автоматически помещен в позицию (125; 100) координатного пространства этого контейнера. Если в дальнейшем объект rectAndCircle будет удален из этого контейнера и добавлен в другой контейнер, он будет помещен в позицию (125; 100) координатного пространства нового контейнера.

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

* л

^ I Любой отображаемый объект сохраняет свои характеристики при перемещении из одного л « контейнера в другой и даже при удалении из списка отображения.

—3tj_

Теперь наступает момент, которого мы с нетерпением ожидали. Чтобы отобразить фигуры на экране, мы вызываем метод addChild ( ) над экземпляром класса GreetingApp внутри конструктора GreetingApp и передаем в этот метод ссылку на экземпляр класса Shape, хранящуюся в переменной rectAndCircle.

// Отображаем объект rectAndCircle на экране, добавляя его // в список отображения addChi1d(rectAndCircle):

В результате приложение Flash Player добавляет объект rectAndCircle в список отображения в качестве ребенка экземпляра класса GreetingApp.

#^

I Как подкласс класса Sprite, класс GreetingApp является потомком класса DisplayObjectContainer

м? л* и, следовательно, наследует метод addChild() и возможность содержать детей. Чтобы

Щ вспомнить иерархию классов API отображения, вернитесь к рис. 20.1.

Отображение объектов на экране — это забавно! Проделаем это еще раз. Добавление следующего кода в конструктор класса GreetingApp приведет к отображению на экране текста «НеПо world»:

// Создаем объект TextField, который будет содержать некий текст var greeting_txt:TextField = new TextField( );

// Указываем отображаемый текст greeting_txt. text = «Hello world»;

// Задаем позицию объекта TextField greeting_txt. x = 200; greeting_txt. y = 300;

// Отображаем текст на экране, добавляя объект greeting_txt // в список отображения addCh i1d(greeti ng_txt);

Когда объект будет добавлен в контейнер отображения, обратиться к этому контейнеру можно будет через переменную экземпляра parent класса DisplayOb j ect. Например, в конструкторе класса GreetingApp следующее выражение является допустимой ссылкой на экземпляр класса GreetingApp:

greeti ng_txt. parent

Если отображаемый объект еще не был добавлен в список отображения, его переменная parent имеет значение null.

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

Листинг 20.1 демонстрирует код приложения GreetingApp целиком. Листинг 20.1. Графическое приложение «НеНо world*

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

public class GreetingApp extends Sprite { public function GreetingApp( ) { // Создаем объект Shape var rectAndCircle:Shape = new Shape( );

// Задаем толщину линии один пиксел rectAndCi rclе. graphi cs.1i neStyle(1);

// Рисуем синий прямоугольник

rectAndCircle. graphics. beginFill(OxOOOOFF. 1);

rectAndCircle. graphics. drawRect(125, 0. 150. 75);

// Рисуем красный круг

rectAndCi rcle. graphi cs. begi nFi11(OxFFOOOO. 1); rectAndCircle. graphics. drawCircle(50. 100. 50);

// Перемещаем фигуры вправо на 125 пикселов и вниз на 100 пискелов rectAndCirclе. х = 125; rectAndCirclе. у = 100;

// Выводим объект rectAndCircle на экране, добавляя его // в список отображения addChi1d(rectAndCircle);

// Создаем объект TextField, который будет содержать некий текст var greeting_txt:TextField = new TextField( );

// Указываем отображаемый текст greeting_txt. text = «Hello world»;

// Задаем позицию текста greeting_txt. x = 200; greeting_txt. y = 300;

// Выводим текст на экране, добавляя объект greeting_txt // в список отображения addChild(greeting_txt);

}

На рис. 20.4 в графическом виде показаны результаты выполнения кода из листинга 20.1. Как и на двух предыдущих рисунках, графика, отображаемая на экране, показана слева, а соответствующая иерархия списка отображения приложения Flash Player — справа.

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

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

Экземпляр класса GreetingApp файла GreetingApp. swf

Экземпляр класса Shape rectAndCircle

Экземпляр класса TextField greeti ng_txt

Проигрыватель Flash

Список отображения

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

Экземпляр класса GreetingApp файла GreetingApp. swf I

Экземпляр класса Shape

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

Рис. 20.4. Список отображения для приложения GreetingApp

Контейнеры и глубины

В предыдущем разделе мы добавили в приложение GreetingApp два отображаемых ребенка (rectAndCircle и greeting txt). На экране они были размещены так, чтобы не перекрывать друг друга. Если бы они перекрывались, один объект закрывал бы другой в соответствии с глубинами этих двух объектов.

Глубина отображаемого объекта — это целочисленное значение, которое определяет, как данный объект перекрывает другие объекты в одном и том же контейнере

отображаемых объектов. Когда два объекта перекрываются, тот объект, у которого позиция глубины больше («высший» из двух), закрывает другой объект («низший» из двух). Следовательно, можно считать, что все отображаемые объекты в контейнере размещаются по порядку в визуальном стеке наподобие колоды уложенных в стопку игральных карт, счет которых начинается с нуля. Самый нижний объект в стеке имеет позицию глубины, равную 0, а самый верхний — позицию глубины, равную количеству объектов-детей в контейнере отображаемых объектов минус один (по аналогии самая нижняя карта в колоде имеет позицию глубины, равную 0, а самая верхняя — позицию глубины, равную количеству карт в колоде минус один).

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

_А_

щ в API управления глубиной отображаемых объектов языка ActionScript 2.0 допускалось Ур^Д существование «незаполненных» глубин. Например, в контейнере, содержащем всего ^лт^ два объекта, первый объект мог иметь глубину, равную 0, а другой объект — глубину, равную 40, оставляя незаполненными глубины от 1 до 39. В API управления глубиной отображаемых объектов языка ActionScript 3.0 появление незаполненных глубин не допускается и вообще невозможно.

Отображаемым объектам, добавляемым в контейнер с помощью метода addChi Id ( ), позиции глубины присваиваются автоматически. Если взять пустой контейнер, то первый ребенок, добавленный через метод addChi Id ( ), помещается на глубину 0, второй — на глубину 1, третий — на глубину 2 и т. д. Таким образом, объект, добавленный последним через метод addChild ( ), всегда отображается поверх остальных детей.

В качестве примера продолжим работу с программой GreetingApp из предыдущего раздела. На этот раз мы нарисуем круг и прямоугольник в отдельных экземплярах класса Shape, чтобы их можно было размещать в стеке независимо друг от друга. Кроме того, изменим позиции круга, прямоугольника и текста таким образом, чтобы они перекрывались. Рассмотрим измененный код (этот код и другие примеры данного раздела взяты из метода-конструктора класса GreetingApp):

// Прямоугольник

var rect:Shape = new Shape( );

rect. graphi cs. 1 i neSty1e(1):

rect. graphi cs. begi nFi11(OxOOOOFF. 1):

rect. graphics. drawRect(0. 0. 75. 50);

// Круг

var circle:Shape = new Shape( );

ci rcle. graphi cs.1i neSty1e(1):

circle. graphics. beginFi 11(OxFFOOOO. 1):

circle. graphics. drawCircle(0. 0. 25);

circle. x = 75:

circle. у = 35;

// Текстовое сообщение

var greeting_txt:TextField = new TextField( ): greeting_txt. text = «Hello world»: greeting_txt. x = 60; greeting_txt. y = 25;

Теперь попытаемся добавить прямоугольник, круг и текст в качестве детей экземпляра класса GreetingApp, используя различные последовательности. Следующий код сначала добавляет прямоугольник, затем круг и после него — текст:

. addChiId(rect); // Глубина О

addChild(circle): // Глубина 1

addChi1dCgreeting_txt); // Глубина 2

Как показано на рис. 20.5, прямоугольник был добавлен первым, поэтому он отображается под кругом и текстом. Затем был добавлен круг, поэтому он отображается поверх прямоугольника, но под текстом. Текст был добавлен последним, поэтому он отображается поверх прямоугольника и круга.



Полезные ссылки
Случайные записи
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 135
  • 10.04.2012">Twitter подала иск против разработчиков спам-приложений
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 078
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.70
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 090
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 072
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 007
  • 10.08.2011">Сделай из смартфона игровую приставку
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 066
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 054
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 060
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.126
  • 07.09.2012">В Facebook запущена компания по переименованию города Хатчинсон в Смолвиль, родину Супермена
  • 15.03.2011">Руководство по actionscript. часть 3, стр. 043
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.148
Опрос

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

View Results

Loading ... Loading ...