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

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

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

Регистрация: Sep 2005
Сообщений: 85
По умолчанию TextField Bounding Box

При создании экземпляра TextField, тект в нём отображается с небольшими отступами слева и справа от координаты TextField, и в 2 раза большими отступами сверху и снизу. И чем больше размер шрифта тем больше эти отступы. Можно ли какнибудь убрать эти отступы? Или узнать размер именно видимого текста без учета отступов?
__________________
www.MegaLuckyPlay.com

Старый 02.10.2011, 21:14
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Каждый символ шрифта имеет виртуальную кегельную площадку, он не висит в пустоте, имея только визуальные размеры, а имеет как бы прямоугольник "фона". У всех шрифтов положение каждого символа в этом контейнере (апроши, т.е. отступы от границ контейнера до контура глифа) – индивидуально, как и ширина контейнера. Поэтому в зависимости от размера шрифта Вам кажется, что отступы в ТекстФилде изменяются, но это не так – они ровно по 2 пикселя с каждой стороны (вопрос эстетики, у поля может быть собственная обводка и символы не должны её касаться, нужен хотя бы минимальный отступ). Но вот внутренний "визуальный" отступ самого текста меняется при изменении размера шрифта, так как меняется пиксельная величина апрошей, и хотя площадка первого символа остается в координатах (2, 2), контур этого символа внутри площадки будет тем дальше от верхнего левого угла, чем больше размер (скейл) шрифта.
Точный размер видимого текста можно узнать только с помощью битмапдаты (сделать снимок методом draw() и получить Rectangle текста методом getColorBoundsRect() ).
Размер с апрошами, т.е. размер площадок (он будет чуть больше видимого) – через свойства TextField'a – textWidth и textHeight.
То есть, чтобы, например, сделать поле такого минимального размера, чтобы оно четко вмещало текст и не обрезало символы, можно написать такой код
Код AS3:
_txt.width = _txt.textWidth + 4;
_txt.height = _txt.textHeight + 4;
Но это никогда не будет выглядеть идеально – отступы в текстфилде будут обязательно.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 02.10.2011 в 21:28.
Старый 02.10.2011, 21:47
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 3  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Они задаются в TextFormat

Старый 02.10.2011, 22:21
RonEXI вне форума Посмотреть профиль Отправить личное сообщение для RonEXI Найти все сообщения от RonEXI
  № 4  
Ответить с цитированием
RonEXI

Регистрация: Sep 2005
Сообщений: 85
goodguy: в TextFormat они по умолчанию нулевые, а если ставить в минус то просто с другой стороны больше отступ получается.

Wolsh: даже если указывать размеры, всеравно эти отступы мешаются. Сделал через bitmapData.
__________________
www.MegaLuckyPlay.com

Старый 16.03.2012, 10:51
kimagg вне форума Посмотреть профиль Отправить личное сообщение для kimagg Найти все сообщения от kimagg
  № 5  
Ответить с цитированием
kimagg

Регистрация: Feb 2012
Сообщений: 18
Столкнулся с той же проблемой, что и ТС. Решил ее примерно так:
Код AS3:
public static function drawStr(str:String = "test", textFormat:TextFormat = null, color:uint = 0xFF000000):Bitmap
{	
	var myText:TextField = new TextField();			
	myText.text = str;			
	if (textFormat != null) myText.setTextFormat(textFormat);			
	myText.width = myText.textWidth + 16;     // с запасом в 16 пикселей
	myText.height = myText.textHeight + 16;
 
	var outBack:BitmapData = new BitmapData(myText.textWidth+16, myText.textHeight+16, true, 0x00CCCCCC);			
	outBack.draw(myText);
	var resultRect:Rectangle = outBack.getColorBoundsRect(0xFFFFFFFF, color);
	resultRect.width +=2;     //тут делаю рамку в 1 пиксель 
	resultRect.height += 2;   //т.к. крайние пиксели иногда не соответсвуют цвету  
	resultRect.x -= 1;        // основного текста из-за сглаживания
	resultRect.y -= 1;
 
	var mySprite:Sprite = new Sprite();		
	mySprite.addChild(myText);
	mySprite.scrollRect = resultRect;
	var outBackFinal:BitmapData = new BitmapData(resultRect.width, resultRect.height, true, 0x00CCCCCC);
	outBackFinal.draw(mySprite);			
	return new Bitmap(outBackFinal);
}
Может быть есть предложение как это оптимизировать? Или знаете более простое решение?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
//т.к. крайние пиксели иногда не соответсвуют цвету
Так Вы не цвет текста ищите, а отсутствие цвета фона. Или отсутствие нулевой альфы.
Рамочки в 1 пиксель это костыль, грубый и беспощадный))

Добавлено через 5 минут
Танцы с дополнительным спрайтом со скроллРект убрать. Создавать битмапдату нужных размеров и отрисовывать в нее битмапдату(!) текста методом copyPixels() с указанием полученного Rectangle.
И не забываем делать dispose() промежуточным битмапдатам, чтобы не занимали память.
__________________
Reality.getBounds(this);

Старый 16.03.2012, 21:33
kimagg вне форума Посмотреть профиль Отправить личное сообщение для kimagg Найти все сообщения от kimagg
  № 7  
Ответить с цитированием
kimagg

Регистрация: Feb 2012
Сообщений: 18
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Так Вы не цвет текста ищите, а отсутствие цвета фона. Или отсутствие нулевой альфы.
Рамочки в 1 пиксель это костыль, грубый и беспощадный))

Добавлено через 5 минут
Танцы с дополнительным спрайтом со скроллРект убрать. Создавать битмапдату нужных размеров и отрисовывать в нее битмапдату(!) текста методом copyPixels() с указанием полученного Rectangle.
И не забываем делать dispose() промежуточным битмапдатам, чтобы не занимали память.
т.е. будет примерно так?
Код AS3:
public static function drawStr(str:String = "test", textFormat:TextFormat = null):Bitmap
{	
	var myText:TextField = new TextField();			
	myText.text = str;			
	if (textFormat != null) myText.setTextFormat(textFormat);			
	myText.width = myText.textWidth + 16;
	myText.height = myText.textHeight + 16;			
 
	var bufer:BitmapData = new BitmapData(myText.width, myText.height, true, 0x00CCCCCC);			
	bufer.draw(myText);
	var rect:Rectangle = bufer.getColorBoundsRect(0xFFFFFFFF, 0x00CCCCCC, false);
 
	var outBack:BitmapData = new BitmapData(rect.width, rect.height, true, 0x00CCCCCC);
	outBack.copyPixels(bufer, rect, new Point(0,0));
	bufer.dispose();			
	return new Bitmap(outBack);
}

Старый 16.03.2012, 22:20
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Да, вроде так. Работает?))
__________________
Reality.getBounds(this);

Старый 16.03.2012, 22:22
kimagg вне форума Посмотреть профиль Отправить личное сообщение для kimagg Найти все сообщения от kimagg
  № 9  
Ответить с цитированием
kimagg

Регистрация: Feb 2012
Сообщений: 18
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Да, вроде так. Работает?))
Внешне работает правильно.

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

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

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


 


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


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