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?
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;
}
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With