2009-11-06 83 views
4

例如,我有一个电影剪辑的层次结构。 mc1是mc的孩子,mc2是mc1的孩子。 原来,当我设置DisplayObject的可见属性

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的存在,除了迭代父母?

+2

只是一个小不相关的注意事项:退房graphics.drawRect(X,Y,W,H )方法;) – Cay 2009-11-09 03:15:27

+0

是的,专注于一件事情让我忽略了明显=) – clorz 2010-08-27 22:31:12

回答

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

这是正确的。我误解了认为MovieClip仍在显示的问题,而不是该属性的实际值。 – Allan 2009-11-06 08:25:09

+0

如何测试物体在场景中是否可见? – clorz 2009-11-06 09:51:57

+0

您必须遍历父级的所有步骤,然后检查可见属性 - 如果其中至少有一个为false,则不可见。 – Amarghosh 2009-11-06 09:55:31

1

是设置为可见= false的父母的孩子也将被隐藏。它遵循简单的层次结构。

而且你随时可以测试一个可见的状态由

if(uiObject.visible) ... 

或者你总是可以设置alpha = 0,但在内存管理方面,它是最好的,如果你删除的对象离开舞台处理很多对象。

更多信息是不应该发生的in this article

+0

感谢您的文章,但它不是我真正需要的。我改变了这个问题。 – clorz 2009-11-06 00:59:27

1

都能跟得上。如果您隐藏父级影片剪辑,那么该孩子也会一直隐藏。我的猜测是,或者mc2不是mc1的孩子,或者是你在其他地方引用另一个剪辑,也就是mc1。

+0

这个答案是不正确的。 MC2将被隐藏,但其可见属性仍然是真实的。 – Dwayne 2010-12-30 22:46:24

1

是的,这是应该发生的。在这种情况下,它是扮演其角色的层级结构。您将mc1设置为false使mc1不可见,并且mc2是mc1的子项,因此它也会消失。 (换句话说,mc2在mc1内部是可见的或不可见的)。因此,如果可见重置为mc1,则mc2也会根据其可见属性显示。

1

这里是我做的,需要一个孩子,最多迭代通过层级,直到它用完一个递归函数的DisplayObject。如果它发现一个无形的父母一路走来,它返回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); 
}