Как flash передает событие scaleX своим дочерним элементам

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

Может ли кто-нибудь рассказать мне или указать мне на чтение о том, как событие scaleX / scaleY распространяется на дочерние элементы display object? В какой-то момент я хочу вмешаться и «повторно масштабировать» один из дочерних элементов отображаемого объекта, который только что был масштабирован с помощью его родительского элемента. Я не могу найти ни одного запущенного события, а установщики scaleX и width, похоже, не вызываются для дочерних объектов. Я работаю над проектом ActionScript (не Flex) во FlashBuilder.

Комментарии:

1. Если вы хотите, чтобы ScaleEvent был запущен, вам придется расширить класс и сделать несколько пользовательских переопределений: override public function set scaleX( val:Number ):void { if ( this.dispatchEvent(...your event here...) ){ super.scaleX = val; } } .

Ответ №1:

scaleX, width, height и т.д. Являются синхронными операциями, и событие не запускается. Если вам абсолютно необходимо зафиксировать его в установочных элементах, попробуйте переопределить установочные элементы в дочерних компонентах.

Я пробовал это, и, похоже, это не работает, если изменяется свойство родительского DisplayObject, его дочерние компоненты не затрагиваются. Я думаю, это имеет смысл.

Если у вас есть доступ к родительским компонентам, тогда вы могли бы перехватить установщики там.

Комментарии:

1. Для расширения касания, когда вы что-то масштабируете, это событие не распространяется куда-либо. Все, что происходит, это то, что Flash изменяет содержимое матрицы преобразования этого родителя. Затем позже, при следующем рендеринге, когда Flash перерисовывает дочерний элемент, он объединяет преобразование родительского элемента с дочерним, и, таким образом, дочерний элемент наследует преобразование. Но ничего не наследуется с точки зрения событий или свойств.

2. Я попытался переопределить scaleX, transform, width и x, и, похоже, ни один из них не вызывается в дочернем объекте. Я также прослушиваю событие рендеринга для дочернего элемента и тоже не получаю его. Все родительские и дочерние объекты масштабируются (через scaleX, scaleY). Похоже, что это проблема, которая была бы решена давным-давно.

Ответ №2:

Как уже отмечалось, события изменения размера нет, и дочерние элементы масштабируются в соответствии со своим родителем (ожидаемое поведение).

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

  • Примените к нему обратную матрицу преобразования, которую вы использовали для масштабирования контейнера
  • Масштабируйте его на 1 / scale, где scale — это коэффициент, на который вы умножили родительский масштаб.

Изменения масштаба родительского элемента изменяют все его координатное пространство, поэтому, если вы хотите, чтобы ваши дочерние элементы оставались того же размера и в том же месте относительно родительской точки (0,0), вам также необходимо применить масштаб 1 / к их позициям x и y.

Комментарии:

1. Даю этот ответ, поскольку это то, что мне в конечном итоге пришлось сделать. Я ненавижу, что дочерний объект не может управлять тем, как управляются его собственные дочерние элементы, когда «внешняя сила» (родительский объект) влияет на его масштабирование.