例如,我有一个电影剪辑层次结构。 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的存在吗?
答案 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);
}