DisplayObject的可见属性

时间:2009-11-06 00:08:27

标签: flash actionscript-3

例如,我有一个电影剪辑层次结构。 mc1是mc的子节点,mc2是mc1的子节点。 事实证明,当我设置

    mc1.visible = false;

mc2.visible保持正确。

这应该发生吗? 是否有测试mc2可见性的快捷方式?


使用的代码:

var mc = new Sprite();

mc.graphics.beginFill(0xFF0000);
mc.graphics.moveTo(50,50);
mc.graphics.lineTo(100,50);
mc.graphics.lineTo(100,100);
mc.graphics.lineTo(50,100);
mc.graphics.endFill();

var mc1 = new Sprite();
mc1.graphics.beginFill(0x00ff00);
mc1.graphics.moveTo(150,150);
mc1.graphics.lineTo(200,150);
mc1.graphics.lineTo(200,200);
mc1.graphics.lineTo(150,200);
mc1.graphics.endFill();
mc.addChild(mc1);

var mc2= new Sprite();
mc2.graphics.beginFill(0x0000ff);
mc2.graphics.moveTo(250,150);
mc2.graphics.lineTo(200,150);
mc2.graphics.lineTo(200,200);
mc2.graphics.lineTo(250,200);
mc2.graphics.endFill();
mc1.addChild(mc2);

stage.addChild(mc);

mc1.visible = false;

function myOnEnterFrame(e){
    trace(mc2.hitTestPoint(mouseX, mouseY));
}

stage.addEventListener(Event.ENTER_FRAME, myOnEnterFrame);

结果: mc2.visible仍然是真的。 hitTest仍将为mc2开火。

除了迭代父母之外,还有其他方法可以在舞台上测试mc2的存在吗?

5 个答案:

答案 0 :(得分:8)

如果父级的可见属性设置为false,则其中的所有子级都不会在该阶段中显示。但这并不意味着孩子的可见属性会自动设置为false - 他们将继续保持原始值。

简而言之,在舞台上无法显示DisplayObject 可见属性true - 它取决于其父级的可见值太。但是,如果对象的可见设置为false,则无论如何都不会显示。

编译以下代码并单击文本字段以更好地理解它。文本字段将变为不可见(因为它的父可见设置为false),但其自己的可见属性仍然是true

private var sprite:Sprite;
private var tf:TextField;
public function init():void
{
    sprite = new Sprite();
    addChild(sprite);
    tf = new TextField();
    tf.text = "sometext";
    sprite.addChild(tf);
    sprite.addEventListener(MouseEvent.CLICK, onClick)
}
private function onClick(e:MouseEvent):void
{
    sprite.visible = false;
    trace(tf.visible);//traces true - but tf is not displayed.
}

更新以回答关于如何检查对象是否可见的clorz'问题:

function isVisible(t:DisplayObject):Boolean
{
    if(t.stage == null)
        return false;
    var p:DisplayObjectContainer = t.parent;
    while(!(p is Stage))
    {
        if(!p.visible)
           return false;
        p = p.parent;
    }
    return true;
}

答案 1 :(得分:1)

是的,设置为visible = false的父项的子项也将被隐藏。它遵循简单的层次结构。

您可以随时通过

测试可见状态
if(uiObject.visible) ...

或者你可以随时设置alpha = 0,但就内存管理而言,如果你处理很多对象,最好将对象从舞台上删除。

更多信息in this article

答案 2 :(得分:1)

不应该发生这种情况。如果隐藏父MovieClip,则子项也将始终隐藏。我的猜测是,mc2不是mc1的子节点,或者你在其他地方引用另一个也称为mc1的剪辑。

答案 3 :(得分:1)

是的,这应该发生。在这种情况下,它是发挥其作用的层次结构。你为mc1设置了可见的false,这使得mc1不可见,而mc2是mc1的子,所以它也会消失。 (换句话说,mc2在mc1中是可见的或不可见的)。因此,如果mc1的visible重置为true,那么mc2也将显示,具体取决于其可见属性。

答案 4 :(得分:1)

这是我做的一个递归函数,它接受一个子节点并在层次结构中迭代,直到它耗尽DisplayObjects。如果它在途中发现了一个不可见的父项,则返回false,但如果所有父项都可见,则返回true:

function allParentsVisible(obj:DisplayObject):Boolean{
    //trace("\r--- Test for visibility ---");           
    var counter:Number = 0;
    var safetyLimit:Number = 10;
    var parent:DisplayObject = obj;
    var allVisible:Boolean = true;

    doTest();

    function doTest(){
        parent = parent.parent;
        if(parent && counter < safetyLimit){
            if(!parent.visible) allVisible = false;     
            doTest();
        }else{
            return;
        }
        counter ++;
    }
    return(allVisible);
}