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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 29.07.2008, 02:42
Denis Davidov вне форума Посмотреть профиль Отправить личное сообщение для Denis Davidov Найти все сообщения от Denis Davidov
  № 1  
Ответить с цитированием
Denis Davidov

Регистрация: Sep 2006
Сообщений: 89
По умолчанию еще раз о реальном размере текста

Всем доброго времени суток.

Тема это обсуждалась не раз, для АС2 есть например этот тред:
http://flasher.ru/forum/showthread.php?t=97958&page=6
НО
работает только пример slin тогда как пример __etc определяет не правильно границы...
Не тестировал код на разных шрифтак, просто хотелось бы понять какое решение работает всегда чтобы его впредь использовать...

Код:
Код:
import com.davydden.MyUtils;
var tf = this.createTextField("tf", 1, 0, 0, 150, 10);
trace(tf._width);
tf.autoSize="left";
tf.multiline=true;
tf.wordWrap=true
tf.condenseWhite=true;
tf.html= true;
tf.htmlText="<p align='center'>Я умею делать задник.<br/>Я люблю ActionScritpt.<br/>Просто я извращенец :)</p>";
var rect=MyUtils.getTextBounds(tf);
with (this) {
	beginFill(0xFF0000, 50);
	moveTo(tf._x+rect.x,tf._y+rect.y);
	lineTo(tf._x+rect.x+rect.width,tf._y+rect.y);
	lineTo(tf._x+rect.x+rect.width,tf._y+rect.y+rect.height);
	lineTo(tf._x+rect.x,tf._y+rect.y+rect.height);
	endFill();
}
trace(rect);
var rect=MyUtils.getSize(tf);
with (this) {
	beginFill(0xFFF000, 50);
	moveTo(tf._x+rect.x,tf._y+rect.y);
	lineTo(tf._x+rect.x+rect.width,tf._y+rect.y);
	lineTo(tf._x+rect.x+rect.width,tf._y+rect.y+rect.height);
	lineTo(tf._x+rect.x,tf._y+rect.y+rect.height);
	endFill();
}
trace(rec2);
trace(tf._width);
trace(tf.textWidth);
tf.x=Math.floor((Stage.width-tf.width)/2);
tf.y=Math.floor((Stage.height-tf.height)/2);
MyUtils:
Код:
class com.davydden.MyUtils {
static function getTextBounds(txt):Object {
		var mc = txt._parent.createEmptyMovieClip('__textBounds_mc',-3288);
		var t = mc.createTextField('txt',0,0,0,100,100);
		t.setNewTextFormat(txt.getTextFormat());
		for (var prop in txt) {
			t[prop]=txt[prop];
		}		
		t._width = txt._width;
		t._height = txt._height;		
		txt = t;
		var xs = txt._xscale;
		var ys = txt._yscale;
		var scale = 20;
		var maxXScale = 2800/txt._width;
		var maxYScale = 2800/txt._height;
		if (maxXScale < scale) {
			scale = maxXScale;
		}
		if (maxYScale < scale) {
			scale = maxYScale;
		}
		txt._xscale = xs*scale;
		txt._yscale = ys*scale;
		var bmp = new BitmapData(mc._width,mc._height,true,0);
		bmp.draw(mc);
		bmp.colorTransform(bmp.rectangle,new ColorTransform(1,1,1,1,0,0,0,255));
		var rect = bmp.getColorBoundsRect(0xFF000000,0x00000000, false);
		bmp.fillRect(rect,0x80FFFF00);
		rect.x /= scale;
		rect.y /= scale;
		rect.width /= scale;
		rect.height /= scale;
		txt._xscale = xs;
		txt._yscale = ys;
		bmp.dispose();
		mc.swapDepths(6550);
		mc.removeMovieClip();
		return rect;
	}
	static function getSize(txt:TextField):Rectangle {
		var bmp:BitmapData = new BitmapData (Math.ceil (txt._width), Math.ceil (txt._height), true, 0);
		bmp.draw (txt);
		return bmp.getColorBoundsRect(0xFF000000, 0x00000000,false);
	}
}
Если я что-то недопонял из той темы, поправьте меня плиз.

Денис.

EDIT:
если поставить tf.embedFonts = true; то тогда даже вариант silin'а НЕ РАБОТАЕТ!
а на практике именно для такого варианта мне и надо посчитать...
в общем, танцы с бубманим, блин....

EDIT2:
подкорректировал код __etc (обозначено желтым) и все заработало.
Буду проверять на других шрифтак, если будут проблеммы с этим кодом - напишу...

EDIT3:
все это делал чтобы подогнать размер TextField под текст в случаях когда изначально TextField слишком большой для текста...
Оказывается если ставить ему ширину/высоту полученную указаным выше способом, то текст либо обрезается либо появляется новая линия если стоит мультилайн...
В общем, не понятно....


Последний раз редактировалось Denis Davidov; 29.07.2008 в 13:21.
Создать новую тему   Часовой пояс GMT +4, время: 10:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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