繁体   English   中英

DisplayObject的可见属性

[英]visible property of DisplayObject

例如,我有一个电影剪辑的层次结构。 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在舞台上的存在吗?

如果父级的visible属性设置为false ,则不会在舞台中显示其子级。 但这并不意味着儿童的可见属性会自动设置为假 - 他们将继续保持其原始值。

简而言之,在舞台上不需要显示具有可见属性trueDisplayObject - 它也取决于其父项的可见值。 但是,如果对象的可见性设置为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;
}

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

而且您可以随时测试可见状态

if(uiObject.visible) ...

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

本文中的更多信息

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

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

这是我做的一个递归函数,它接受一个子节点并在层次结构中迭代,直到它用完了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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM