代码之家  ›  专栏  ›  技术社区  ›  Josh

高度更改的自定义事件as3

  •  0
  • Josh  · 技术社区  · 15 年前

    如何添加事件侦听器以检测何时显示对象的高度更改。

    我有一个有边框的保持精灵,当里面的任何对象改变高度或被添加时,它需要调整大小。

    谢谢。

    乔希

    4 回复  |  直到 15 年前
        1
  •  2
  •   back2dos    15 年前

    我想这是一个闪现的问题,而不是一个灵活的问题…这就是为什么 mx.events.ResizeEvent (由uicomponent和子类发送)所有这些时髦的flex东西都不能工作…如果你真的使用flex和uicomponents,这是最好的方法…

    问题是,此事件不是生成的…

    • 您可以子类任何内置类,覆盖宽度、高度、x、y、scalex、scaley、transform和visible的访问器,以获取大部分信息…
    • 您必须确保,任何对象都是自定义类的实例…您将无法使用startdrag,因为它绕过了访问器…
    • 你真的没有机会发现,如果有人利用一个子对象… Graphics final …但是,在使用getter时,重写getter并设置超时,以在1毫秒后检查更改(并确保最多有1个超时)。

    这不仅仅是一个骗局,需要花费大量的开发和调试时间,这将是一个痛苦的屁股,因为你将必须绝对确定,一切(也任何库符号,如果你使用CS3/CS4,如我所想的)……而且由于您的自定义访问器发送的所有事件,将占用相当大的性能…

    实际上,最简单的事情是观察enterframe上的宽度/高度,如果它们从一个帧更改为另一个帧,则重新绘制边框…这更有意义,因为你不需要在一帧中再重绘一次边框,如果你试图捕捉任何可能意味着调整大小的动作,这种效果很可能发生。实际上,比较两个浮点数是非常便宜的…:)

    希望有帮助…

    尔兹

    后台操作系统

        2
  •  2
  •   Vinay Sajip    15 年前
    displayObject.addEventListener(ResizeEvent.RESIZE, onResize);
    
    function onResize(event:ResizeEvent):void
    {
        // handle it here
    }
    
        3
  •  0
  •   CookieOfFortune    15 年前

    创建自定义事件类:

    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));
    }
    
        4
  •  0
  •   Triynko    15 年前

    思想

    起初,我很惊讶DisplayObject类的实现没有分派事件。当其宽度和高度属性发生更改或内容大小重新计算时,调整事件的大小,但由于性能原因,这很有意义。

    我考虑过使用event.render事件,但是我在一个textfield上听它,我正在通过一个脚本疯狂地调整大小…尽管文本被重新包装,盒子也在膨胀,光标也在闪烁…它从不触发单个渲染事件。令人惊讶的是,它只在文本更改时激发渲染事件,这只是显示渲染事件有多无用。

    回答…关注期望DisplayObject改变大小的环境或频率。

    我建议您:

    1. 调度事件。从您创建的DisplayObject的任何自定义子类中调整事件大小。或
    2. 使用event.enter_frame事件监视希望更改尺寸的任何显示对象的宽度和高度。

    从逻辑上讲,您选择的方法应该取决于您对DisplayObject更改大小的可能性的了解:

    • 如果您期望它意外地改变大小(例如,像一个动态粒子系统)。然后用输入框监视它不可预测的尺寸是有意义的,特别是如果你确定它的尺寸可能会改变每一帧。
    • 或者,如果您知道对象只在特定条件下(例如,在textfield的event.change事件期间)调整大小,或者它是您自己创建的类…然后,您应该知道您所做的操作是否会导致大小发生变化,并且只需从类中分派一个事件。调整事件的大小。