高度变化AS3的自定义事件

时间:2009-07-10 16:13:14

标签: flash actionscript-3

如何添加事件侦听器以检测DisplayObject的高度何时发生变化。

我有一个带有边框的Sprite,当内部任何对象改变高度或被添加时,需要调整大小。

感谢。

约什

4 个答案:

答案 0 :(得分:2)

displayObject.addEventListener(ResizeEvent.RESIZE, onResize);

function onResize(event:ResizeEvent):void
{
    // handle it here
}

答案 1 :(得分:2)

我认为这是一个flash而不是Flex问题......这就是为什么mx.events.ResizeEvent(由UIComponent和子类调度)以及所有这种时髦的Flex内容都无法工作...如果你使用Flex和UIComponents,这是最好的方式......

问题是,这个事件没有生成......

  • 你可以继承任何内置类,覆盖宽度,高度,x,y,scaleX,scaleY,transform和visible的访问器,以获取大部分信息......
  • 你必须确保,任何对象都是你自定义类的一个实例......你将无法使用startDrag,因为它绕过了访问者......
  • 你真的几乎没有机会找到,如果有人在子对象上绘图...... Graphicsfinal ...除了,覆盖吸气剂并设置超时,当吸气剂是用于,1毫秒后检查更改(并确保最多1次超时)......
这不仅是狡猾,需要大量的开发和调试时间,将是一个痛苦的屁股,因为你必须绝对肯定,一切(也任何库符号,如果你使用CS3 / CS4作为我推测)...由于您的自定义访问者调度的所有事件,将会占用相当大的一部分性能......

最简单的事情就是观察enterframe的宽度/高度,如果它们从一帧变为另一帧,那么重绘边框......这更有意义,因为你不需要重绘如果你试图抓住任何可能意味着调整大小的动作,那么边框会超过一帧一帧,这种效果很可能发生......真的,比较两个浮点数非常便宜......:)

希望有所帮助......

格尔茨

back2dos

答案 2 :(得分:0)

创建自定义事件类:

package com
{
    class ChildResizeEvent extends Event
    {
        public static var RESIZE:String = "resize";
        public static var ADDED:String = "added";
    }
}

在主Sprite MXML中,您可以使用:

<mx:Metadata>
    [Event(name="onChildResize", type="com.ChildResizeEvent")]
</mx:Metadata>

然后当事件发生时(当一个对象改变高度或被添加时),你发送:

function onInteriorObjectHeightChange(event:Event):void
{
    dispatchEvent(new ChildResizeEvent(ChildResizeEvent.RESIZE));
}

答案 3 :(得分:0)

思想

起初,我很惊讶DisplayObject类的实现在调整其宽度和高度属性或重新计算内容的大小时不调度Event.RESIZE事件,但出于性能原因,这很有意义。 / p>

我考虑过使用Event.RENDER事件,但我正在TextField上监听它,我正在通过脚本疯狂地调整大小...尽管文本重新包装,框扩展并且光标闪烁......它永远不会发射一个RENDER事件。令人惊讶的是,它只会在文本发生变化时触发RENDER事件,这只会显示RENDER事件是多么无用。

答案...关注您期望DisplayObject改变大小的环境或频率。

我建议您:

  1. 从您创建的DisplayObject的任何自定义子类调度Event.RESIZE事件。 OR
  2. 使用Event.ENTER_FRAME事件监视您希望更改尺寸的任何DisplayObject的宽度和高度。
  3. 逻辑上,您选择的方法应取决于您对DisplayObject更改大小的可能性的了解:

    • 如果您希望它能够意外地改变尺寸(例如像动态粒子系统)......那么使用ENTER_FRAME监视其不可预测的尺寸是有意义的,特别是如果您确定它的尺寸可能会在每一帧都发生变化。 / LI>
    • 或者,如果您知道对象仅在特定条件下调整大小(例如在TextField的Event.CHANGE事件期间)或者您自己创建的类...那么您应该知道您正在做什么可能会导致大小改变,并简单地从你的班级发送一个Event.RESIZE事件。