[英]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
,则不会在舞台中显示其子级。 但这并不意味着儿童的可见属性会自动设置为假 - 他们将继续保持其原始值。
简而言之,在舞台上不需要显示具有可见属性true
的DisplayObject
- 它也取决于其父项的可见值。 但是,如果对象的可见性设置为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.