표시 객체 컨테이너 작업

Flash Player 9 이상, Adobe AIR 1.0 이상

DisplayObjectContainer 객체가 표시 목록에서 삭제되거나 다른 방식으로 이동 또는 변형될 경우 DisplayObjectContainer의 각 표시 객체도 함께 삭제, 이동 또는 변형됩니다.

표시 객체 컨테이너는 그 자체가 표시 객체의 한 유형이므로 다른 표시 객체 컨테이너에 추가될 수 있습니다. 예를 들어, 다음 이미지는 하나의 외곽선 모양과 다른 네 개의 표시 객체 컨테이너(PictureFrame 유형)를 포함하는 표시 객체 컨테이너 pictureScreen을 보여 줍니다.

전체 화면으로 그래픽 보기
A.
pictureScreen 표시 객체 컨테이너의 테두리를 정의하는 모양

B.
pictureScreen 객체의 자식인 네 개의 표시 객체 컨테이너

표시 객체가 표시 목록에 나타나게 하려면 표시 객체를 표시 목록에 있는 표시 객체 컨테이너에 추가해야 합니다. 이때 컨테이너 객체의 addChild() 메서드 또는 addChildAt() 메서드를 사용합니다. 예를 들어, 다음 코드의 마지막 행이 없으면 myTextField 객체가 표시되지 않습니다.

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

이 코드 목록에서 this.root는 코드를 포함하는 MovieClip 표시 객체 컨테이너를 가리킵니다. 실제 코드에서는 다른 컨테이너를 지정할 수 있습니다.

addChildAt() 메서드를 사용하여 표시 객체 컨테이너 자식 목록의 특정 위치에 자식을 추가합니다. 자식 목록에서 0부터 시작하는 인덱스 위치는 표시 객체의 레이어 위치(전후 순서)와 관련이 있습니다. 예를 들어, 다음 세 표시 객체를 생각해 볼 수 있습니다. 각 객체는 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);

이 코드는 container 표시 목록의 해당 위치에서 ball_A를 효과적으로 제거한 후 목록의 맨 위에 다시 추가합니다. 그러면 해당 객체가 스택의 맨 위로 이동합니다.

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

부모 컨테이너의 자식 목록에서 표시 객체를 제거하면 목록에서 더 높은 위치에 있는 요소가 자식 인덱스에서 한 위치씩 아래로 이동합니다. 예를 들어, 이전 코드에서 다음 코드는 자식 목록에서 하위에 있는 표시 객체를 제거함에 따라 container DisplayObjectContainer의 위치 2에 있는 표시 객체가 위치 1로 어떻게 이동하는지 보여 줍니다.

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

removeChild()removeChildAt() 메서드는 표시 객체 인스턴스를 완전히 삭제하지 않고, 컨테이너의 자식 목록에서만 제거합니다. 따라서 다른 변수가 인스턴스를 계속 참조할 수 있습니다. 객체를 완전히 제거하려면 delete 연산자를 사용합니다.

표시 객체는 부모 컨테이너가 하나뿐이므로, 표시 객체 인스턴스를 하나의 표시 객체 컨테이너에만 추가할 수 있습니다. 예를 들어, 다음 코드는 표시 객체 tf1이 하나의 컨테이너(이 경우 DisplayObjectContainer 클래스를 확장하는 Sprite)에만 존재할 수 있음을 보여 줍니다.

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(): 인덱스 값으로 지정된 두 표시 객체의 순서(전후 순서)를 교체합니다.

자세한 내용은 Adobe Flash 플랫폼용 Adobe ActionScript 3.0 참조 설명서의 관련 항목을 참조하십시오.

표시 목록에 없는 표시 객체(Stage 객체의 자식인 표시 객체 컨테이너에 포함되지 않은 표시 객체)를 목록 외 표시 객체라고 합니다.