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

Все компоненты ActionScript 3.0 являются наследниками класса DisplayObject и поэтому имеют доступ к его методам и свойствам для взаимодействия со списком отображения. Список отображения представляет собой иерархию отображаемых объектов и графических элементов в приложении. Эта иерархия включает следующие элементы:

  • рабочая область, которая является контейнером объектов верхнего уровня;

  • экранные объекты, включая фигуры, фрагменты роликов и текстовые поля и др.;

  • контейнеры экранных объектов (это особый тип экранных объектов, которые могут содержать дочерние экранные объекты).

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

Добавление компонента в список отображения

Объект можно добавить в объект DisplayObjectContainer, вызвав метод addChild() или addChildAt() для контейнера. Если контейнером является рабочая область, добавить объект в список отображения можно в ходе разработки: для этого его нужно создать или, если это компонент, перетащить в рабочую область с панели «Компоненты». Чтобы добавить объект в контейнер с помощью ActionScript, сначала создайте его экземпляр, вызвав конструктор с оператором new , а после этого вызовите метод addChild() или addChildAt() , чтобы поместить его в рабочую область и в список отображения. Метод addChild() помещает объект в следующую позицию списка отображения, а addChildAt() задает позицию, в которую требуется добавить объект. Если указать позицию, которая уже занята другим объектом, этот объект и все находящиеся над ним перемещаются на одну позицию вверх. Свойство numChildren объекта DisplayObjectContainer содержит число экранных объектов, содержащихся в контейнере. Чтобы извлечь объект из списка отображения, вызовите метод getChildAt() и укажите позицию, а если известно имя объекта, вызовите метод getChildByName() .

Примечание. Добавляя компонент с помощью ActionScript, необходимо задать ему имя с помощью свойства name, чтобы его можно было найти по имени в списке отображения.

В следующем примере отображаются имена и позиции трех компонентов в списке отображения. Сначала перетащите компоненты NumericStepper, Button и ComboBox в рабочую область так, чтобы они пересекались друг с другом и присвойте их экземплярам имена aNs , aButton и aCb . Затем добавьте следующий код на панель «Действия» в кадре 1 временной шкалы:

var i:int = 0; 
while(i < numChildren) { 
    trace(getChildAt(i).name + " is at position: " + i++); 
}

На панели вывода должны появится следующие строки.

aNs is at position: 0 
aButton is at position: 1 
aCb is at position: 2

Перемещение компонента в списке отображения

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

this.addChildAt(aNs, numChildren - 1); 
i = 0; 
while(i < numChildren) { 
    trace(getChildAt(i).name + " is at position: " + i++); 
}

На панели вывода должны появится следующие строки.

aNs is at position: 0 
aButton is at position: 1 
aCb is at position: 2 
aButton is at position: 0 
aCb is at position: 1 
aNs is at position: 2

Кроме того, экземпляр NumericStepper должен появится перед остальными компонентами на экране.

Обратите внимание, что свойство numChildren представляет количество объектов (от 1 до n ) в списке отображения, а порядковые номера объектов отсчитываются от 0. Поэтому если в списке отображения содержится три объекта, то третий объект будет занимать в индексе позицию 2. Это означает, что позиция последнего объекта в списке отображения, или верхнего объекта с точки зрения глубины, вычисляется как numChildren — 1 .

Удаление компонента из списка отображения

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

  1. Создайте новый файл Flash (ActionScript 3.0).

  2. Перетащите компонент Button с панели «Компоненты» на панель «Библиотека».

  3. Откройте панель «Действия», выберите «Кадр 1» на главной временной шкале и введите следующий код.

    import fl.controls.Button; 
     
    var i:int = 0; 
    while(i++ < 3) { 
        makeButton(i); 
    } 
    function removeButton(event:MouseEvent):void { 
        removeChildAt(numChildren -1); 
    } 
    function makeButton(num) { 
        var aButton:Button = new Button(); 
        aButton.name = "Button" + num; 
        aButton.label = aButton.name; 
        aButton.move(200, 200); 
        addChild(aButton); 
        aButton.addEventListener(MouseEvent.CLICK, removeButton); 
    }

    Полное описание списка отображения см. в разделе «Программирование отображаемого содержимого» руководства Программирование на ActionScript 3.0 .