Работа с контейнерами экранных объектов

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Если объект DisplayObjectContainer удаляется из списка отображения, а также перемещается или иным способом преобразуется, то каждый экранный объект в DisplayObjectContainer также удаляется, перемещается или преобразуется.

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

Просмотр полноразмерных изображений
А.
Фигура, задающая границу контейнера экранного объекта pictureScreen

Б.
Четыре контейнера экранных объектов, являющихся дочерними объектами объекта pictureScreen

Чтобы экранный объект появился в списке отображения, его нужно добавить в контейнер экранного объекта, находящийся в списке отображения. Это делается с помощью метода addChild() или метода addChildAt() объекта контейнера. Например, объект myTextField не удастся вывести на экран без последней строки следующего кода:

var myTextField:TextField = new TextField(); 
myTextField.text = "hello"; 
this.root.addChild(myTextField);

В этом примере кода this.root указывает на контейнер экранного объекта MovieClip, содержащий код. В вашей собственной версии кода можно указать другой контейнер.

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

Расположение этих экранных объектов по слоям в контейнере можно отрегулировать с помощью метода addChildAt(). Например, рассмотрим следующий код:

ball_A = new Ball(0xFFCC00, "a"); 
ball_A.name = "ball_A"; 
ball_A.x = 20; 
ball_A.y = 20; 
container.addChild(ball_A); 
 
ball_B = new Ball(0xFFCC00, "b"); 
ball_B.name = "ball_B"; 
ball_B.x = 70; 
ball_B.y = 20; 
container.addChild(ball_B); 
 
ball_C = new Ball(0xFFCC00, "c"); 
ball_C.name = "ball_C"; 
ball_C.x = 40; 
ball_C.y = 60; 
container.addChildAt(ball_C, 1);

После выполнения этого кода экранные объекты располагаются в объекте container DisplayObjectContainer следующим образом. Обратите внимание на слои расположения объектов.

Чтобы переместить объект в верхнюю часть списка отображения, просто снова добавьте его в список. Например, после предыдущего кода, чтобы переместить ball_A в верхнюю часть стопки, воспользуйтесь следующей строкой кода:

container.addChild(ball_A);

Этот код удаляет ball_A с позиции в списке отображения container и снова добавляет его в верхнюю часть списка. В конечном итоге он перемещается в верхнюю часть стопки.

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

trace(container.getChildAt(0).name); // ball_A 
trace(container.getChildAt(1).name); // ball_C 
trace(container.getChildAt(2).name); // ball_B

При удалении экранного объекта из списка дочерних объектов родительского контейнера позиции родительских элементов списка смещаются вниз в указателе дочерних объектов. Например, в продолжение разговора о предыдущем коде, в следующем коде показано, как экранный объект, который находился на позиции 2 в container DisplayObjectContainer, перемещается на позицию 1 при удалении экранного объекта, который находится ниже в списке дочерних объектов:

container.removeChild(ball_C); 
trace(container.getChildAt(0).name); // ball_A 
trace(container.getChildAt(1).name); // ball_B

Методы removeChild() и removeChildAt() не удаляют экземпляр объекта целиком. Они просто удаляют его из списка дочерних объектов контейнера. При этом данный экземпляр может быть представлен другой переменной. Чтобы полностью удалить объект, воспользуйтесь оператором delete.

Поскольку экранный объект имеет только один родительский контейнер, экземпляр экранного объекта можно добавить только в один контейнер экранного объекта. Например, следующий код демонстрирует, что экранный объект tf1 может существовать только в одном контейнере (в данном случае это Sprite, являющийся расширением класса DisplayObjectContainer):

tf1:TextField = new TextField(); 
tf2:TextField = new TextField(); 
tf1.name = "text 1"; 
tf2.name = "text 2"; 
 
container1:Sprite = new Sprite(); 
container2:Sprite = new Sprite(); 
 
container1.addChild(tf1); 
container1.addChild(tf2); 
container2.addChild(tf1); 
 
trace(container1.numChildren); // 1 
trace(container1.getChildAt(0).name); // text 2 
trace(container2.numChildren); // 1 
trace(container2.getChildAt(0).name); // text 1

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

Помимо описанных выше методов класс DisplayObjectContainer определяет ряд методов для работы с дочерними экранными объектами, включая указанные ниже.

  • contains(): определяет, является ли объект дочерним объектом DisplayObjectContainer.

  • getChildByName(): извлекает экранный объект по имени.

  • getChildIndex(): возвращает позицию индекса для экранного объекта.

  • setChildIndex(): изменяет позицию дочернего экранного объекта.

  • swapChildren(): меняет местами два экранных объекта, ставя один из них перед другим или позади него.

  • swapChildrenAt(): меняет местами два экранных объекта, ставя один из них перед другим или позади него в зависимости от их значений в указателе.

Дополнительные сведения см. в соответствующих разделах cправочника ActionScript® 3.0 для платформы Adobe® Flash® Platform.

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