Показать сообщение отдельно
Старый 06.12.2012, 19:20
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 3  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Цитата:
Или может можно как-то временно запретить объекту герерировать 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.
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 06.12.2012 в 19:42.