有没有办法让对象始终位于显示列表的顶部?

时间:2010-10-07 23:44:15

标签: actionscript-3

有没有办法让显示对象始终位于显示列表的顶部?

例如,我知道你可以设置childIndex,即:

setChildIndex(myDisplayObject,numChildren-1);

但有没有一种方法可以让对象感觉到其他东西已被添加到显示列表中并相应地重新堆叠?

2 个答案:

答案 0 :(得分:5)

您可以收听容器上的Event.ADDED事件。此事件将冒出来,因此只要将显示对象添加到容器或其任何子容器中,您就会被调用。

这是一个如何做到这一点的例子。你会看到黑匣子始终保持在最顶层。

var container:DisplayObjectContainer = this; // this is a frame script but just change this line as necessary
container.addEventListener(Event.ADDED,handleAdded,true);

function handleAdded(e:Event):void {
    // this if tries to cover some edge cases, unlikely to happen in your code, from your description
    if(container == topElement.parent && container.numChildren > 0 && container.getChildIndex(topElement) != container.numChildren - 1) {
        container.setChildIndex(topElement,numChildren - 1);
    }
}

function getSprite(c:uint):Sprite {
    var sp:Sprite = new Sprite();
    sp.graphics.beginFill(c);
    sp.graphics.drawRect(0,0,100,100);
    sp.graphics.endFill();
    return sp;
}

var topElement:Sprite = getSprite(0);

container.addChild(topElement);
var sp:Sprite = getSprite(0xff0000);
container.addChild(sp);
sp.addChild(getSprite(0xff00));
var sp2:Sprite = getSprite(0xff);
container.addChild(sp2);

然而,我认为只有2个容器,比如topbottom更简单,更简洁,有点像层。在top中,您将添加始终必须位于顶部的元素(或者这可能是您的元素,因为您可能不需要拥有此额外容器)。在bottom中,您可以添加和删除任何内容。然后你可以忘记手动重新堆积东西(至少保持顶部元素在顶上)。

答案 1 :(得分:3)

您可以覆盖父对象中的addChild()方法。在该方法中,您可以使用

将您的孩子移到顶端
setChildIndex(myDisplayObject, numChildren-1);

这样,每次将对象添加到父对象时,父对象都会将对象移动到顶部。