【问题标题】:Get to know the layer order in the flash timeline via as3 code通过 as3 代码了解 flash 时间轴中的图层顺序
【发布时间】:2012-01-02 16:42:51
【问题描述】:

有什么方法可以让我知道我正在使用的两个影片剪辑中的哪一个位于 Flash 中时间线“层”排列的上方或下方。

我要问的是是否有两个影片剪辑“a”和“b”。 flash Professional 时间线的第 10 层中的一个和第 1 层上的“b”。将能够使用纯 as3 代码更改索引顺序,以在视觉上将第 10 层的电影剪辑保持在第 1 层的电影剪辑之上??

谢谢。 毗湿奴

【问题讨论】:

    标签: actionscript flash-cs5


    【解决方案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;
    

    索引最低的是最高的。

    编辑:

    只要影片剪辑具有相同的父级,您就可以使用swapChildren()swapChildrenAt()setChildIndex() 来操作对象的索引。因此,要将 MovieClip 放在最前面,您可以使用 MovieClip(parent).setChildIndex(this, 0);

    【讨论】:

    • 这不是我要找的东西,好吧,我现在有了它的想法。谷歌告诉我 ;)
    【解决方案2】:

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

    DisplayObjectContainer . getChildIndex()

    【讨论】:

    • 是的,我知道这个。但我要问的是是否有两个影片剪辑“a”和“b”。 flash Professional 时间线的第 10 层中的一个和第 1 层上的“b”。将能够使用纯 as3 代码更改索引顺序,以在视觉上将第 10 层的电影剪辑保持在第 1 层的电影剪辑之上??跨度>
    • @VishnuAjit 一个糟糕且不完整的问题无法打开我当时的有效答案。
    【解决方案3】:

    [[编辑]]

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


    时间线子级始终位于与时间线类相关联的任何动作脚本生成的子级之下。

    例如

    如果您有扩展 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% 进行测试,但初始案例已按预期完成。

    祝你好运!

    【讨论】:

    • 男人!这很有帮助! :)) 我的意思是,不仅仅是代码,还有概念。万分感谢 !我打算将此附加到我的实用程序库中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多