2009-11-06 4 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 (х, у, ш, ч) метод;) – Cay

+0

Да, сосредоточиться на одной вещи заставляет меня игнорировать очевидное =) – clorz

ответ

8

Если у родителя видны, то для него установлено значение false, ни один из его детей не будет виден на сцене. Но это не означает, что у детей свойства будут автоматически установлены в false - они будут продолжать сохранять свои исходные значения.

Короче говоря, DisplayObject с видимым свойство true не обязательно должен быть виден на сцене - это зависит от видимого значения своих родителей тоже. Но если объект отображается, устанавливается в false, он не будет виден ни на что.

Скомпилируйте следующий код и нажмите текстовое поле, чтобы понять его лучше.TextField станет невидимым (как это родитель виден установлен в 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. 
} 

Update, чтобы ответить 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

+0

Как я могу проверить, будет ли объект видимым на сцене тогда? – clorz

+0

Вам нужно будет проходить через родителя до самого этапа и проверить видимое свойство - если хотя бы один из них является ложным, это не видно. – Amarghosh

1

Да, дочерний элемент родителя, который установлен видимым = false, также будет скрыт. Это следует за простой иерархией.

И вы всегда можете проверить видимый статус,

if(uiObject.visible) ... 

Кроме того, вы всегда можете установить альфа = 0, но с точки зрения управления памятью, лучше удалить объект со сцены, если вы занимающихся множеством объектов.

Подробнее in this article

+0

Спасибо за статью, но это не совсем то, что мне нужно. Я изменил вопрос. – clorz

1

Неа, не должно произойти. Если вы скроете родительский MovieClip, тогда ребенок всегда будет скрыт. Я предполагаю, что либо mc2 не является дочерним элементом mc1, либо ссылается на другой клип в другом месте, который также называется mc1.

+0

Этот ответ неверен. mc2 будет скрыт, но его видимое свойство будет по-прежнему истинным. – Dwayne

1

Да, это должно произойти. В этом случае эта иерархия играет свою роль. Вы устанавливаете видимым значение false для mc1, что делает mc1 невидимым, а mc2 является дочерним элементом mc1, поэтому он также исчезнет. (другими словами, mc2 является видимым или невидимым внутри mc1). Поэтому, если видимый сбрасывается на true для mc1, то mc2 также будет отображаться в зависимости от его видимого свойства.

1

Вот рекурсивная функция, которую я сделал, что берет ребенка и перебирает вверх по иерархии, пока она не закончится из DisplayObjects. Если он находит невидимый родитель по пути, он возвращает ложь, но если все родители могут видеть это возвращает истину:

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); 
} 
Смежные вопросы