如何检测孩子大小变化动作?

时间:2012-10-16 03:52:03

标签: actionscript-3

如果我有一个容器,那里有子显示对象。 容器的大小由孩子的大小决定。当尺寸变化时,我需要做一些适合新尺寸的东西。

因为我没有找到检测它的事件,我使用ENTER_FRAME事件,这很傻。 保留每个最后一帧的大小,并与当前帧进行比较。可以在处理输入帧事件后更改大小,因此在某些情况下,您可能会在下一帧中看到正确的结果。

我不认为这是一个很好的解决方案。请给我一些想法,谢谢。

2 个答案:

答案 0 :(得分:2)

没有标准的解决方案。您可以创建一个自定义类来覆盖宽度/高度/ x / y / scaleX / scaleY / scrollRect的设置器以及其他一些属性。孩子们应该扩展这样的课程。

我使用了一个布尔值来防止多次调度,在一帧之后,该标志将被重置。

override public function set width(value:Number):void
{
    if (value !== super.width && !isNaN(Number(value)) this.dispatchResize();
    super.width = value;
}

override public function set height(value:Number):void
{ 
    if (value !== super.height && !isNaN(Number(value)) this.dispatchResize();
    super.height = value;
}

override public function set scaleX(value:Number):void
{ 
    if (value !== super.scaleX && !isNaN(Number(value)) this.dispatchResize();
    super.scaleX = value;
}

override public function set scaleY(value:Number):void
{ 
    if (value !== super.scaleY && !isNaN(Number(value)) this.dispatchResize();
    super.scaleY = value;
}

private var _hasDispatchedResize:Boolean;
protected function dispatchResize():void
{
   // do something
   if (!this._hasDispatchedResize)
   {
      this.dispatchEvent(new Event(Event.RESIZE));
      this._hasDispatchedResize = true;
      this.addEventListener(Event.ENTER_FRAME, handleEnterFrameOnce);
   }
}

private function handleEnterFrameOnce(event:Event):void
{
    this.removeEventListener(Event.ENTER_FRAME, handleEnterFrameOnce);
    this._hasDispatchedResize = false;
}

现在,在容器类中,您可以收听Event.RESIZE个孩子。您不确定该值是否实际更改(如果在MovieClip上更改了帧),但在大多数情况下这将起作用。在调度调整大小之前,我在这个setter中添加了一个额外的检查。这取决于具体情况。

答案 1 :(得分:0)

我要做的是无论函数调整子项的大小,都要向其添加自己的调度事件,以便广播发生的大小更改。

//Never forget to import your classes.
import flash.events.EventDispatcher;
import flash.events.Event;

//Our custom listener listens for our custom event, then calls the function we
//want called when children are resized.
addEventListener("childResized", honeyIResizedTheChildren);

function resizingLikeFun(){
    datClip.width++;//they be resizin, yo.
    dispatchEvent(new Event("childResized"));//Our custom event
}

function honeyIResizedTheChildren(e:Event){
    trace("Giant Cheerios");
    //Whatever you want to do when the children are resized goes here.
}

我假设有一些代码,所以请告诉我这是否完全适用于您。