通过as3代码了解flash时间轴中的图层顺序

时间:2011-11-21 05:02:11

标签: actionscript flash-cs5

有没有什么方法可以让我知道我正在使用的两个动画片段中的哪一个位于闪光灯的时间线'层'排列中的上方或下方。

我要问的是,如果有两个动画片段'a'和'b'。闪存专业人员时间轴的第10层和第1层的“b”中的一个。将能够使用纯as3代码更改索引顺序,以便在第1层上的movieclip顶部的第10层上直观地保留movieclip吗?

谢谢。 毗

3 个答案:

答案 0 :(得分:1)

要验证哪个DisplayObject位于顶部,您必须使用getChildIndex()方法比较它们的索引:

var mc1 : MovieClip;
var mc2 : MovieClip;

// THIS CODE ASSUMES THAT mc1 and mc2 HAVE THE SAME PARENT
var parentMC : MovieClip = MovieClip(mc1.parent);

var topmost : MovieClip = parentMC.getChildIndex(mc1) < parentMC.getChildIndex(mc2) ? mc1 : mc2;

索引最低的人是最顶层的人。

编辑:

只要MovieClip具有相同的父级,您就可以使用swapChildren()swapChildrenAt()setChildIndex()来操纵对象的索引。因此,要将MovieClip置于最顶端,您可以执行MovieClip(parent).setChildIndex(this, 0);

答案 1 :(得分:1)

[[编辑]]

如果两个目标对象都是共享父节点中的叶节点,则附加方法将不起作用。


时间轴中的子项始终位于生成的子项与时间轴类关联的任何操作脚本之下。

e.g。

如果您有扩展ClassA的时间轴X,并且在A类中,则添加子项E,F,G,但时间轴X包含层B,C,D,每层在每个层中都有一个符号,带有层B在时间线的底部,将观察到以下情况:

child 5: G
child 4: F
child 3: E
child 2: D
child 1: C
child 0: B

为了扩展felipemaia的答案,我设计了以下方法来确定哪个影片剪辑绝对位于另一个之上。这尚未经过全面测试,但应作为开发的基准。

function selectAbove(obj1:DisplayObject, obj2:DisplayObject):DisplayObject
{

    var obj1_parentCount:int = parentCount(obj1);
    var obj2_parentCount:int = parentCount(obj2);

    var target:DisplayObject;
    var other:DisplayObject;

    if (obj1_parentCount > obj2_parentCount)
    {
        target = obj1;
        other = obj2;
    }
    else
    {
        target = obj2;
        other = obj1;
    }

    var container:DisplayObjectContainer =
        (target is DisplayObjectContainer) ? target as DisplayObjectContainer : target.parent ;

    var container_last:DisplayObjectContainer;

    var sharedParent:DisplayObjectContainer;

    while(container)
    {
        if(container.contains(other))
        {
            sharedParent = container;
            break;
        }

        container_last = container;
        container = container.parent;
    }

    if(!sharedParent)
    {
        throw new Error("An object does not maintain its parent in the display heirarchy!");
    }

    var ret:DisplayObject;

    if(container == other)
    {
        ret = target;
    }

    return container != other ?
        container.getChildIndex(container_last) < container.getChildIndex(other) ?
            other :
            target
        :
        target
    ;
}

function parentCount(obj:DisplayObject):int
{
    var ret:int = 0;

    while(obj)
    {
        ret++;
        obj = obj.parent;
    }

    return ret;
}

此方法适用于嵌套显示层次结构。我没有对此进行100%测试,但初始案例已按预期完成。

祝你好运!

答案 2 :(得分:0)

我认为ActionScript的上下文中没有图层,但您可以确定DisplayObject的哪些实例正在进一步使用:

DisplayObjectContainer getChildIndex()