Пользовательское событие для изменения высоты AS3 - PullRequest
0 голосов
/ 10 июля 2009

как добавить обработчик событий, чтобы определить, когда изменяется высота объекта DisplayObject.

У меня есть удерживающий спрайт с рамкой, размер которой нужно изменить, когда какой-либо объект внутри изменяет высоту или добавляется.

спасибо.

Josh

Ответы [ 4 ]

2 голосов
/ 10 июля 2009

Я предполагаю, что это флэш, а не вопрос Flex ... вот почему mx.events.ResizeEvent (который отправляется UIComponent и его подклассами), и все эти прикольные вещи Flex не будут работать ... если вы это сделаете используйте Flex и UIComponents, но это лучший способ ...

проблема в том, что это событие не генерируется ...

  • вы можете создать подкласс для любых встроенных классов, переопределить методы доступа для ширины, высоты, x, y, scaleX, scaleY, transform и visible, чтобы получить больше информации ...
  • вам нужно убедиться, что любой объект является экземпляром ваших пользовательских классов ... вы не сможете использовать startDrag, так как он обходит средства доступа ...
  • у вас практически нет шансов узнать, если кто-то рисует подобъект ... Graphics - это final ... за исключением того, что переопределяет получатель и устанавливает тайм-аут, когда используется получатель, чтобы проверить изменяется через 1 мсек (и убедитесь, что у вас максимум 1 тайм-аут) ...

это более чем хитроумно, требует много времени на разработку и отладку, будет проблемой в заднице, так как вам нужно будет быть абсолютно уверенным во всем (также в любом символе библиотеки, если вы используете CS3 / CS4 как предположим) ... и будет поглощать значительную часть производительности из-за всех событий, отправляемых вашими пользовательскими средствами доступа ...

самая простая вещь на самом деле, это наблюдать ширину / высоту на энтерфрейме и, если они меняются от одного кадра к другому, то перерисовывать границу ... это имеет гораздо больше смысла, так как вам не нужно перерисовывать граничьте более одного раза с кадром, что вполне может произойти, если вы попытались зафиксировать какие-либо действия, которые могли бы означать изменение размера ... и действительно, сравнение двух значений с плавающей запятой очень дешево ...:)

надеюсь, что помогло ...

Greetz

back2dos

2 голосов
/ 10 июля 2009
displayObject.addEventListener(ResizeEvent.RESIZE, onResize);

function onResize(event:ResizeEvent):void
{
    // handle it here
}
0 голосов
/ 15 октября 2009

Мысли

Сначала я был удивлен, что реализация класса DisplayObject не отправляет события Event.RESIZE, когда изменяются его свойства width и height или пересчитывается размер содержимого, но это имеет большой смысл с точки зрения производительности.

Я думал об использовании события Event.RENDER, но я слушал его на TextField, который менялся как сумасшедший с помощью скрипта ... и несмотря на переобтекание текста, расширение окна и мигание курсора ... он НИКОГДА не запустил ни одного события RENDER. Удивительно, но он вызывает событие RENDER только при изменении текста, который просто показывает, насколько бесполезно событие RENDER.

Ответ ... сосредоточьтесь на обстоятельствах или частоте, с которой вы ожидаете, что объект DisplayObject изменит размер.

Я предлагаю вам либо:

  1. Отправка событий Event.RESIZE из любого пользовательского подкласса DisplayObject, который вы создаете. OR
  2. Используйте событие Event.ENTER_FRAME, чтобы отслеживать ширину и высоту любого объекта DisplayObject, для которого вы хотите изменить размеры.

Логически, выбранный вами метод должен зависеть от того, что вы знаете о вероятности изменения размера DisplayObject:

  • Если вы ожидаете, что он неожиданно изменит размер (например, как динамическая система частиц) ... тогда имеет смысл отслеживать его непредсказуемые измерения с помощью ENTER_FRAME, особенно если вы уверены, что его размеры, вероятно, изменятся в каждом кадре.
  • В качестве альтернативы, если вы знаете, что размер объекта изменится только при определенных условиях (например, во время события TextField Event.CHANGE) или это класс, который вы создали сами ... тогда ВЫ должны знать, может ли то, что вы делаете, вызвать размер изменить, и просто отправить событие Event.RESIZE из вашего класса.
0 голосов
/ 10 июля 2009

Создать пользовательский класс событий:

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...