visible property of DisplayObject

蓝咒 提交于 2019-12-13 13:28:55

问题


For example I have a hierarchy of movie clips. mc1 is a child of mc, and mc2 is a child of mc1. Turns out that when I set

    mc1.visible = false;

mc2.visible stays true.

Is that supposed to happen? Is there a shortcut for testing visibility of mc2?


Code to play with:

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);

Results: mc2.visible will still be true. hitTest will still fire for mc2.

Is there any other way of testing mc2 presence on stage except iterating over parents?


回答1:


If a parent's visible property is set to false, none of its children will be visible in the stage. But that doesn't mean that children's visible properties would be automatically set to false - they will continue to hold their original values.

In short, a DisplayObject with visible property true need not be visible on the stage - it depends on its parents' visible value too. But if an object's visible is set to false, it will not be visible no matter what.

Compile the following code and click on the text field to understand it better. The textfield will become invisible (as it's parent's visible is set to false), but its own visible property continues to be 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.
}

Update to answer clorz' question on how to check if an object is visible or not:

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;
}



回答2:


Yes a child of a parent that is set visible=false will be hidden as well. It follows the simple hierarchy.

And you can always test for a visible status by

if(uiObject.visible) ...

Alternatively you can always set the alpha = 0, but in terms of memory management it's best to remove the object off the stage if you're dealing with a lot of objects.

More info in this article




回答3:


Nope that is not supposed to happen. If you hide a parent MovieClip then the child will always be hidden as well. My guess is that either mc2 is not a child of mc1 or your refering to another clip somewhere else that is also called mc1.




回答4:


Yes, that is supposed to happen. It's the hierarchy that is playing its role in this case. You set visible to false for mc1 which makes mc1 invisible and as mc2 is child of mc1, so it will also disappear. (in other words mc2 is visible or invisible inside mc1). So if visible is reset to true for mc1 then mc2 will show up too depending on its visible property.




回答5:


Here's a recursive function I made that takes a child and iterates up through the hierarchy till it runs out of DisplayObjects. If it finds an invisible parent along the way, it returns false, but if all the parents are visible it returns 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);
}


来源:https://stackoverflow.com/questions/1684549/visible-property-of-displayobject

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!