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

Actionscript 通过as3代码了解flash时间线中的图层顺序,actionscript,flash-cs5,Actionscript,Flash Cs5,有没有什么方法可以让我知道我正在使用的两部电影中哪一部在flash中的时间线“层”排列中位于上方或下方 我想问的是,如果你有两部电影《a》和《b》。flash professional时间线的第10层中有一个,第1层上有“b”。将能够使用纯as3代码更改索引顺序,以直观地保持第10层的movieclip在第1层的movieclip之上 多谢各位。 毗瑟奴要验证哪个DisplayObject位于顶部,您必须将其索引与方法进行比较: var mc1:MovieClip; var-mc2:MovieC

有没有什么方法可以让我知道我正在使用的两部电影中哪一部在flash中的时间线“层”排列中位于上方或下方

我想问的是,如果你有两部电影《a》和《b》。flash professional时间线的第10层中有一个,第1层上有“b”。将能够使用纯as3代码更改索引顺序,以直观地保持第10层的movieclip在第1层的movieclip之上

多谢各位。
毗瑟奴

要验证哪个DisplayObject位于顶部,您必须将其索引与方法进行比较:

var mc1:MovieClip;
var-mc2:MovieClip;
//此代码假定mc1和mc2具有相同的父级
var parentMC:MovieClip=MovieClip(mc1.parent);
var topmost:MovieClip=parentMC.getChildIndex(mc1)
指数最低的人是指数最高的人

编辑:


只要MovieClips具有相同的父对象,就可以使用、和操纵对象的索引。因此,要将MovieClip放在最前面,您需要执行
MovieClip(parent.setChildIndex)(这个,0)

我认为ActionScript的上下文中没有层,但您可以使用以下方法确定哪些实例的
DisplayObject
更高:

DisplayObjectContainer
[[Edit]]

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


时间线子项始终位于与时间线类关联的actionscript生成的子项下

e、 g

如果您有扩展类A的时间线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;
}
功能选择上方(obj1:DisplayObject,obj2:DisplayObject):DisplayObject
{
变量obj1_parentCount:int=parentCount(obj1);
var obj2_parentCount:int=parentCount(obj2);
var目标:DisplayObject;
var-other:显示对象;
如果(obj1\U parentCount>obj2\U parentCount)
{
目标=obj1;
其他=obj2;
}
其他的
{
目标=obj2;
其他=obj1;
}
var容器:DisplayObjectContainer=
(目标为DisplayObjectContainer)?作为DisplayObjectContainer的目标:target.parent;
var container_last:DisplayObjectContainer;
var sharedParent:DisplayObjectContainer;
while(容器)
{
if(容器包含(其他))
{
sharedParent=容器;
打破
}
容器_last=容器;
container=container.parent;
}
如果(!sharedParent)
{
抛出新错误(“某个对象在显示继承人权限中不维护其父对象!”);
}
var-ret:DisplayObject;
如果(容器==其他)
{
ret=目标;
}
返回容器!=其他?
container.getChildIndex(container\u last)
此方法适用于嵌套的显示层次结构。我还没有100%测试过这个,但初始案例按预期完成


祝你好运

是的,我知道这个。但我想问的是,如果你有两部电影的嘴唇“a”和“b”。flash professional时间线的第10层中有一个,第1层上有“b”。将能够使用纯as3代码更改索引顺序,从而在视觉上保持第10层的movieclip在第1层的movieclip之上???@VishnuAjit一个糟糕且不完整的问题无法打开我当时的有效答案进行否决投票。如果你问的是如何切换movieclip的顺序,是的,这是可能的,不考虑层(只要他们都在同一个家长),查看我的编辑。这不是我想要的,好吧,我现在有了这个想法。谷歌告诉我;)伙计!这很有帮助!:)我的意思是,不仅仅是代码,还有概念。非常感谢!我计划将此附加到我的实用程序库中!
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;
}