Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.10.2009, 18:23
Peregrin вне форума Посмотреть профиль Отправить личное сообщение для Peregrin Найти все сообщения от Peregrin
  № 1  
Ответить с цитированием
Peregrin
 
Аватар для Peregrin

Регистрация: Nov 2006
Адрес: Hamburg
Сообщений: 195
Отправить сообщение для Peregrin с помощью ICQ
По умолчанию scale9Grid и Bitmap. Почему не скейлится

почему масштабируется весь объект?
Код AS3:
var mc:Sprite = new ElementFromLibrary();
var bitmapData:BitmapData = new BitmapData(mc.width, mc.height);
bitmapData.draw(mc);
var bitmap:Bitmap = new Bitmap(bitmapData);
bitmap.scale9Grid = new Rectangle(10, 10, 20, 20);
addChild(bitmap);
bitmap.width = 200;
Добавлено через 10 минут
при этом trace(bitmap.scale9Grid) показывает, что все нормально:
(x=10, y=10, w=20, h=20)


Последний раз редактировалось Peregrin; 26.10.2009 в 18:33.
Старый 26.10.2009, 19:06
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Хоть Bitmap и наследует свойство scale9Grid, оно не работает. Я написал себе такой класс.
Код AS3:
package ru.inils.display {
	/**
	* @author	iNils
	* @version	1.0
	*
	* Расширяет класс Bitmap, позволяя задавать сетку масштабирования (scale9Grid) для объекта, с решением проблемы <a href="http://groups.google.com/group/ruFlash/browse_thread/thread/1ea6d9b09d979336/4d23244c565af814" target="_blank">"0x2K"</a>.
	*
	* Изменения:
	*	[+]	...
	* 	1.1 (27.01.09) - Изменена логика свойств работающих с BitmapData. Роль геттера bitmapDataOriginal перенесена в геттер bitmapData. А роль геттера bitmapData выполняет геттер bitmapDataScale.
	* 	1.0 (19.09.08 10:55)
	*/
	/*    IMPORT             *///{ /
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.PixelSnapping;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	//}
	public class BitmapScale extends Bitmap {
		/*  - VAR PRIVATE        *///{ /
		/// Оригинальное изображение из которого строится изображение с учетом сетки масштабирования.
		private var _bmp:BitmapData = null;
		/// Активная сетка масштабирования.
		private var _scale9Grid:Rectangle = null;
		//}
		/*  * CONSTRUCTOR *      *///{ /
		/**
		 * Инициализирует объект BitmapScale для ссылки на заданный объект BitmapData.
		 * @param	bmp - Объект BitmapData, указанный в ссылке.
		 * @param	pixelSnapping - Определяет, должен ли объект BitmapScale быть привязанным к ближайшему пикселу. 
		 * @param	smoothing - Определяет, следует ли смягчать растровое изображение при масштабировании.
		 */
		public function BitmapScale (bmp:BitmapData = null, scale9:Rectangle = null, pixelSnapping:String = 'auto', smoothing:Boolean = false) {
			super (bmp, pixelSnapping, smoothing);
			_bmp = bmp.clone ();
			scale9Grid = scale9;
		}
		//}
		/*  + METHOD PUBLIC      *///{ /
		/**
		 * Создает экземпляр BitmapScale из внедренных с помощью метатега Embed внешних ресурсов.
		 * @param	embed - Класс связанный с внедренным графическим ресурсом.
		 * @return	Экземпляр BitmapScale с объектом BitmapData из внедренного графического ресурса.
		 */
		public static function createFromEmbed (embed:Class, scale9:Rectangle = null):BitmapScale {
			var bitmap:Bitmap = new embed ();
			var bitmapScale:BitmapScale = new BitmapScale (bitmap.bitmapData, scale9);
			return bitmapScale;
		}
		/**
		 * Меняет размеры изображения.
		 * @param	w - Широта изображения.
		 * @param	h - Высота изображения.
		 */
		public function setSize (w:Number, h:Number):void {
			if (_scale9Grid == null) {
				super.width = w;
				super.height = h;
			} else {
				w = Math.max (w, _bmp.width - _bmp.width);
				h = Math.max (h, _bmp.height - _bmp.height);
				resize (w, h);
			}
		}
		//}
		/*  - METHOD PRIVATE     *///{ /
		/**
		 * Задает в качестве bitmapData новый объект.
		 * @param	bmp - Новый объект BitmapData.
		 */
		private function assignBitmapData (bmp:BitmapData):void {
			super.bitmapData.dispose ();
			super.bitmapData = bmp;
		}
		/**
		 * Метод перерисовывает объект BitmapData под новые размеры.
		 * @param	w - Ширина в пикселах.
		 * @param	h - Высота в пикселях.
		 */
		private function resize (w:Number, h:Number):void {
			var bmp:BitmapData = new BitmapData (w, h, true, 0x0);
 
			var rows:Array = [0, _scale9Grid.top, _scale9Grid.bottom, _bmp.height];
			var cols:Array = [0, _scale9Grid.left, _scale9Grid.right, _bmp.width];
 
			var dRows:Array = [0, _scale9Grid.top, h - (_bmp.height - _scale9Grid.bottom), h];
			var dCols:Array = [0, _scale9Grid.left, w - (_bmp.width - _scale9Grid.right), w];
 
			var rectIn:Rectangle;
			var rectOut:Rectangle;
			var matrix:Matrix = new Matrix();
			for (var i:int = 0; i < 3; i++) {
				for (var j:int = 0; j < 3; j++) {
					rectIn = new Rectangle (cols[i], rows[j], cols[i + 1] - cols[i], rows[j + 1] - rows[j]);
					rectOut = new Rectangle (dCols[i], dRows[j], dCols[i + 1] - dCols[i], dRows[j + 1] - dRows[j]);
					matrix.identity ();
					matrix.a = rectOut.width / rectIn.width;
					matrix.d = rectOut.height / rectIn.height;
					matrix.tx = rectOut.x - rectIn.x * matrix.a;
					matrix.ty = rectOut.y - rectIn.y * matrix.d;
 
					/// Решаем проблему "0x2K". Ее описание: http://groups.google.com/group/ruFla...23244c565af814
					if (_bmp.width * matrix.a > 8192 || _bmp.height * matrix.d > 8192) {
						var bmpTemp:BitmapData = new BitmapData (rectIn.width, rectIn.height, true, 0x0)
						bmpTemp.copyPixels (_bmp, rectIn, new Point (0, 0));
 
						/// сдвиги частей
						if (i == 1) {
							matrix.tx = rectOut.x;
						} else if (i == 2) {
							matrix.tx = rectOut.left;
						}
						if (j == 1) {
							matrix.ty = rectOut.y;
						} else if (j == 2) {
							matrix.ty = rectOut.top;
						}
 
						bmp.draw (bmpTemp, matrix, null, null, null, smoothing);
						bmpTemp.dispose ();
					} else {
						bmp.draw (_bmp, matrix, null, null, rectOut, smoothing);
					}
				}
			}
			assignBitmapData (bmp);
		}
		/**
		 * Проверка на вхождения области Rectangle, задаваемой параметром rect, в область объекта BitmapData.
		 * @param	rect - Проверенный объект Rectangle.
		 * @return	Возвращается значение true, если заданный объект Rectangle не выходит за пределы объекта BitmapData; в противном случае возвращается false.
		 */
		private function validGrid (rect:Rectangle):Boolean {
			return rect.right <= _bmp.width && rect.bottom <= _bmp.height;
		}
		//}
		/*    GETTER / SETTER    *///{ /
		/**
		 * Объект BitmapData, указанный в ссылке. Функция записи будет масштабировать задаваемое изображение учитываю текущую сетку масштабирования, а функция чтения возвращает исходное изображение без учета сетки масштабирования.
		 */
		public override function get bitmapData ():BitmapData {
			return _bmp;
		}
		public override function set bitmapData	(value:BitmapData):void {
			_bmp = value.clone ();
			if (_scale9Grid == null) {
				assignBitmapData (_bmp.clone ());
			} else {
				if (!validGrid(_scale9Grid)) {
					_scale9Grid = null;
				}
				setSize (_bmp.width, _bmp.height);
			}
		}
		/**
		 * Объект BitmapData с учетом сетки масштабирования.
		 */
		public function get bitmapDataScale ():BitmapData {
			return super.bitmapData;
		}
		/**
		 * Задает в качестве объекта BitmapData класс ассоциированный с метатегом Embed внешнего ресурса.
		 */
		public function set bitmapEmbed (value:Class):void {
			_bmp.dispose ();
			_bmp = BitmapEmbed.getBitmapData (value);
 
			super.bitmapData.dispose();
			super.bitmapData = _bmp.clone ();
			//setSize (_bmp.width, _bmp.height);
		}
		/**
		 * Указывает высоту экранного объекта в пикселах.
		 */
		public override function set height (value:Number):void {
			if (value != height) {
				setSize (width, value);
			}
		}
		/**
		 * Текущая активная сетка масштабирования.
		 */
		public override function get scale9Grid ():Rectangle {
			return _scale9Grid;
		}
		public override function set scale9Grid (value:Rectangle):void {
			if ((_scale9Grid == null && value != null) || (_scale9Grid != null && !_scale9Grid.equals (value))) {
				if (value == null) {
					var w:Number = width;
					var h:Number = height;
					_scale9Grid = null;
					assignBitmapData (_bmp.clone ());
					setSize (w, h);
				} else {
					if (!validGrid (value)) {
						throw (new Error ('#001 - The _scale9Grid does not match the original BitmapData'));
						return;
					}
 
					_scale9Grid = value.clone ();
					resize (width, height);
					scaleX = 1;
					scaleY = 1;
				}
			}
		}
		/**
		 * Указывает ширину экранного объекта в пикселах.
		 */
		public override function set width (value:Number):void {
			if (value != width) {
				setSize (value, height);
			}
		}
		//}
	}
}
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 26.10.2009, 19:16
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 3  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
Код AS3:
	public function BitmapScale (bmp:BitmapData = null, scale9:Rectangle = null, pixelSnapping:String = 'auto', smoothing:Boolean = false) {
			super (bmp, pixelSnapping, smoothing);
			_bmp = bmp.clone ();
			_scale9Grid = scale9; // scale9Grid = scale9;
		}
извиняюсь, но вроде бы описка..

Старый 26.10.2009, 19:18
Peregrin вне форума Посмотреть профиль Отправить личное сообщение для Peregrin Найти все сообщения от Peregrin
  № 4  
Ответить с цитированием
Peregrin
 
Аватар для Peregrin

Регистрация: Nov 2006
Адрес: Hamburg
Сообщений: 195
Отправить сообщение для Peregrin с помощью ICQ
Цитата:
Сообщение от nOobCrafter Посмотреть сообщение
Код AS3:
	public function BitmapScale (bmp:BitmapData = null, scale9:Rectangle = null, pixelSnapping:String = 'auto', smoothing:Boolean = false) {
			super (bmp, pixelSnapping, smoothing);
			_bmp = bmp.clone ();
			_scale9Grid = scale9; // scale9Grid = scale9;
		}
извиняюсь, но вроде бы описка..
scale9Grid не работает с Bitmap'ом, поэтому в нем нет смысла

Старый 26.10.2009, 19:20
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Таким образом только шейпы тянутся.

Старый 26.10.2009, 19:24
Peregrin вне форума Посмотреть профиль Отправить личное сообщение для Peregrin Найти все сообщения от Peregrin
  № 6  
Ответить с цитированием
Peregrin
 
Аватар для Peregrin

Регистрация: Nov 2006
Адрес: Hamburg
Сообщений: 195
Отправить сообщение для Peregrin с помощью ICQ
2 iNils:
ошибка в функции:
Код AS3:
public function set bitmapEmbed (value:Class):void {
	_bmp.dispose ();
	_bmp = BitmapEmbed.getBitmapData (value);
 
	super.bitmapData.dispose();
	super.bitmapData = _bmp.clone ();
	//setSize (_bmp.width, _bmp.height);
}
ругается на BitmapEmbed (access of undefined property).

Добавлено через 13 минут
и что за непонятные строки?
Код AS3:
w = Math.max (w, _bmp.width - _bmp.width);
h = Math.max (h, _bmp.height - _bmp.height);

Старый 08.07.2010, 18:48
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 7  
Ответить с цитированием
ccwds

Регистрация: Nov 2001
Адрес: Москва
Сообщений: 155
Вот сейчас фишечку нашел для 9grid и битмэпа
http://www.gskinner.com/blog/archive...slice9_sc.html

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 10:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.