Цитата:
|
Или может можно как-то временно запретить объекту герерировать ResizeEvent?
|
Наследуйтесь от этого класса

Код AS3:
package ru.inils.display.invalidate {
/**
* @author iNils
* @version 1.0
*
* Абстрактный класс для реализации в визуальных классах однократного вычисления необходимых перерисовок графического содержимого в течении кадра.
* Каждый вызов свойства или метода способного изменить графическое содержимое, занимает процессорное время. Использую функционал класса AInvalidate, вызов метода (redraw), ответственного за расчеты и перерисовку графического содержимого, происходит единожды.
*
* Изменения:
* 1.0 (25.11.2008 18:59)
* [+] ...
*/
/* IMPORT *///{ /
import flash.display.*;
import flash.events.*;
//}
public class AInvalidate extends Sprite {
/* - VAR PRIVATE *///{ /
/// Состояние объекта.
private var _changed:Boolean = false;
//}
/* - CONSTRUCTOR - *///{ /
public function AInvalidate () {
addEventListener (Event.ADDED_TO_STAGE, onAddedToStage);
addEventListener (Event.REMOVED_FROM_STAGE, onRemovedFromStage);
changed = true;
}
//}
/* # METHOD PROTECTED *///{ /
/**
* Заглушка для метода перерисовывающего графичское содержимое визуального класса, описываемого в расширяющихся классах.
*/
protected function redraw ():void {
}
//}
/* EVENT *///{ /
/// Событие добавления объекта на сцену
private function onAddedToStage (event:Event):void {
stage.addEventListener (Event.RENDER, onRenderListener);
if (changed) {
stage.invalidate ();
}
}
///
private function onRemovedFromStage (event:Event):void {
stage.removeEventListener (Event.RENDER, onRenderListener);
}
///
private function onRenderListener (event:Event):void {
if (_changed) {
_changed = false;
redraw ();
}
}
//}
/* GETTER / SETTER *///{ /
/**
* Функция чтения сообщает о том, что содержит ли объект изменения, которые еще не были визуализированы. Функция записи устанавливает статус измений: true - помечает, что в объекте произошли визуальные изменения. false - помечает, что самые последние изменения были отображены на экране.
*/
final protected function get changed ():Boolean {
return _changed;
}
final protected function set changed (value:Boolean):void {
if (value == _changed) {
return;
}
_changed = value;
if (stage != null) {
stage.invalidate ();
}
}
//}
}
}
Переопределяете x, y, width, height, где только сохраняете новые значание и устанавливаете changed = true
Также переопределяете метод redraw, где и проводите все манипуляции с размерами и координатами.
В результате, сколько бы раз вы не меняли x, y, width, height, вся отрисовка будет происходить только один раз.
Примерно так

Код AS3:
package ru.inils.display.invalidate {
/**
* @author iNils
* @version 1.0
*
* Класс...
*
* Изменения:
* 1.0 (06.12.2012 18:14)
* [+] ...
*/
/* IMPORT *///{ /
import flash.display.*;
import flash.events.*;
//}
public class Sample extends AInvalidate {
/* - VAR PRIVATE *///{ /
private var _height:Number = 0;
private var _width:Number = 0;
//}
/* * CONSTRUCTOR * *///{ /
public function Sample () {
}
//}
/* # METHOD PROTECTED *///{ /
override protected function redraw ():void {
trace ("Я изменился! " + _width + " " + _heigth);
}
//}
/* GETTER / SETTER *///{ /
public function get height ():Number {
return _height;
}
public function set height (value:Number):void {
if (value == _height) {
return;
}
_height = value;
changed = true;
}
public function get width ():Number {
return _width;
}
public function set width (value:Number):void {
if (value == _width) {
return;
}
_width = value;
changed = true;
}
//}
}
}
И если использовать

Код AS3:
var s:Sample = new Sample ();
s.width = 100;
s.height = 100;
s.width = 200;
s.height = 300;
То увидите надпись "Я изменился! 200 300" один раз, а не 4.