Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

visible property of DisplayObject

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?

like image 750
clorz Avatar asked Dec 18 '22 05:12

clorz


2 Answers

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;
}
like image 54
Amarghosh Avatar answered Dec 23 '22 18:12

Amarghosh


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

like image 32
keyle Avatar answered Dec 23 '22 20:12

keyle