2009-11-06 58 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); 
}