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

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() : изменяет позицию дочернего экранного объекта.

  • removeChildren() : удаляет несколько дочерних объектов отображения.

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

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

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

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