如何检测特定的displayObject已经添加到阶段使用它的类名?

时间:2014-01-23 01:47:32

标签: flash flex air

例如,我想为添加到舞台的每个BorderContainer添加一个Label子元素。 类似的东西:

// called on application preinitialize
private function preInit():void{
    systemManager.stage.addEventListener(Event.ADDED, onElementAdded);
}

protected function onElementAdded(event:Event){  
    trace(event.target);
    if(event.target && event.target is BorderContainer){
        var label:Label = new Label();
        label.text = "This is BorderContainer";
        label.x = 10;
        label.y = 10;
        (event.currentTarget as BorderContainer).addElement(label);
    }

}

但我得到的所有内容都是:

mouseCatcher
TestApp0

我认为它只显示已直接添加到舞台的元素 如何检测添加到应用程序阶段的所有元素?这种比较是否会影响应用程序的性能,这可能是其他一些方法吗?

2 个答案:

答案 0 :(得分:0)

你可以尝试一个。这里不使用阶段使用FlexGlobals.topLevelApplication实例的listen事件,而是使用ElementExistenceEvent.ELEMENT_ADD事件,它提供了与event.element类似的元素,因此我们可以轻松完成。

它也存在性能问题,但它基于您的项目。如果不再更好,则需要删除侦听器。在确切需要时添加侦听器事件,否则删除侦听器。

        private function preInit():void{                
            myBC.addEventListener(ElementExistenceEvent.ELEMENT_ADD,onElementAdded);
        }

        protected function onElementAdded(event:ElementExistenceEvent):void
        {   
            //For the as it will return null if it is not of the type you want:
            var bc:BorderContainer = event.element as BorderContainer;

            if(bc){             
                var label:Label = new Label();
                label.text = "This is BorderContainer";
                label.x = 10;
                label.y = 10;
                BorderContainer(event.element).addElement(label);
            }
            else{
             //other than BorderContainer no prototype chain check with is operator.
            }
        }

在MXML中创建自定义组件名称为BorderContainerWithLabel并将BorderContainer添加到BorderContainerWithLabel中,而不是直接添加到Applicationcontainer中。所以我们的myBC容器主动收听您的ADDED事件。这样你就可以提高性能。

<components:BorderContainerWithLabel id="myBC"/>

myBC.addElement(yourBC);

BorderContainerWithLabel.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
</s:BorderContainer>

答案 1 :(得分:0)

为什么在事后添加它们?创建一个扩展BorderContainer的新类。

public class BorderContainerWithLabel extends BorderContainer {
    public var label:Label;
    public function BorderContainerWithLabel() {
        super();
    }

    override protected function createChildren():void {
        super.createChildren();
        // create the label here. Might have to use addChild() instead of addElement()
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
        super.updateDisplatList(unscaledWidth, unscaledHeight);
        // set positioning and sizing of the label here
    }
}