Flash DisplayObject的可见属性

Flash DisplayObject的可见属性,flash,actionscript-3,Flash,Actionscript 3,例如,我有一个电影剪辑的层次结构。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

例如,我有一个电影剪辑的层次结构。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,也将隐藏。它遵循简单的层次结构

您可以通过以下方式始终测试可见状态:

if(uiObject.visible) ...
或者,您可以始终将alpha设置为0,但在内存管理方面,如果要处理大量对象,最好将对象从后台移除


更多信息

不,这是不应该发生的。如果隐藏父MovieClip,则子MovieClip也将始终隐藏。我的猜测是,要么mc2不是mc1的孩子,要么你提到了其他地方的另一个剪辑,也被称为mc1。

是的,这是应该发生的。在这种情况下,是层次结构在发挥作用。您将mc1的visible设置为false,这会使mc1不可见,并且由于mc2是mc1的子级,因此它也将消失。(换句话说,mc2在mc1内可见或不可见)。因此,如果mc1的visible被重置为true,则mc2也将根据其visible属性显示。

如果父级的visible属性设置为false,则其子级在阶段中将不可见。但这并不意味着子对象的可见属性将自动设置为false——它们将继续保持其原始值

简言之,具有visible属性的
DisplayObject
不需要在舞台上可见-它也取决于其父级的可见值。但是,如果将对象的可见设置为
false
,则无论发生什么情况,它都将不可见

编译以下代码并单击文本字段以更好地理解它。textfield将变为不可见(因为其父字段的visible设置为
false
),但其自身的visible属性仍然是
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;
}

这是我制作的一个递归函数,它接受一个子对象,并在层次结构中向上迭代,直到耗尽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);
}
函数allParentsVisible(obj:DisplayObject):布尔值{
//跟踪(“\r---可见性测试---”;
变量计数器:数值=0;
var安全极限:数值=10;
变量父项:DisplayObject=obj;
var allVisible:Boolean=true;
doTest();
函数doTest(){
parent=parent.parent;
if(父级和计数器<安全极限){
如果(!parent.visible)allVisible=false;
doTest();
}否则{
返回;
}
计数器++;
}
返回(所有可见);
}

谢谢你的文章,但这不是我真正需要的。我改变了问题,这是正确的。我误读了这个问题,认为MovieClip仍然在显示,而不是属性的实际值。那么我如何测试对象在场景中是否可见?你必须迭代它的父对象直到舞台,并检查可见属性-如果其中至少有一个为假,它就不可见。好的,您知道hitTestPoint是否考虑了父级可见性吗?所以,如果将parent visible设置为false,那么子级的hitTestPoint是否仍将计算为true?我相信
hitTestPoint
会考虑可见性;毕竟,一个物体如何能击中一个看不见的物体——或者它能击中吗?文档说设置visible to false会使其处于非活动状态(没有鼠标事件等),但没有说明命中测试。如果可以的话,请做一个测试并公布结果。只是一个不相关的小提示:查看graphics.drawRect(x,y,w,h)方法;)是的,专注于一件事让我忽略了显而易见的事实(答案是错误的)。mc2将被隐藏,但其可见属性仍为true。