Класс для пропорционального вписывания и центрирования MovieClip'а (или любого другого DisplayObject) в прямоугольнике заданных размеров

03.07.2011 23:19 / Артём Волк / 446 просмотров / ...

Небольшой класс позволяет пропорционально изменить размеры DisplayObject'а так, чтобы он поместился в отведённую прямоугольную область. Специальным образом обрабатываются объекты классов Video и Loader, для них можно получить оригинальные размеры с помощью специальных свойств. Дополнительно есть простенькая функция для центрирования DisplayObject'ов.

package crisp.routine
{
	import flash.display.*;
	import flash.media.Video;

	public class Fitter
	{						
		public static function resize(displayObject:DisplayObject, maxWidth:Number, maxHeight:Number, originalWidth:Number = NaN, originalHeight:Number = NaN, stretch:Boolean = false):void
		{							
			if (isNaN(originalWidth) && isNaN(originalHeight))
			{				
				if (displayObject is Video)
				{
					originalWidth = Video(displayObject).videoWidth;
					originalHeight = Video(displayObject).videoHeight;
				}
				else if (displayObject is Loader && Loader(displayObject).content != null)
				{				
					originalWidth = Loader(displayObject).content.width;
					originalHeight = Loader(displayObject).content.height;
				}
				else
				{
					originalWidth = displayObject.width / displayObject.scaleX;
					originalHeight = displayObject.height / displayObject.scaleY;							
				}
			}

			if (!stretch)
			{
				if (maxWidth > originalWidth && maxHeight > originalHeight) 
				{
					displayObject.width = originalWidth;
					displayObject.height = originalHeight;
					return;
				}				
			}

			var originalProportions:Number = originalWidth / originalHeight;
			var currentProportions:Number = maxWidth / maxHeight;

			if (originalProportions >= currentProportions) 
			{					
					displayObject.width = maxWidth;
					displayObject.height = maxWidth / originalProportions;								
			}
			else
			{
					displayObject.height = maxHeight;
					displayObject.width = maxHeight * originalProportions;									
			}					
		}		

		public static function center(displayObject:DisplayObject, maxWidth:Number, maxHeight:Number, objectWidth:Number = NaN, objectHeight:Number = NaN, objectIsCentered:Boolean = false):void
		{			
			objectWidth = !isNaN(objectWidth) ? objectWidth : displayObject.width;
			objectHeight = !isNaN(objectHeight) ? objectHeight : displayObject.height;

			if (objectIsCentered)
			{
				displayObject.x = maxWidth / 2;
				displayObject.y = maxHeight / 2;			
			}
			else
			{
				displayObject.x = maxWidth / 2 - objectWidth / 2;
				displayObject.y = maxHeight / 2 - objectHeight / 2;
			}			
		}
	}
}