![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2005
Сообщений: 85
|
При создании экземпляра TextField, тект в нём отображается с небольшими отступами слева и справа от координаты TextField, и в 2 раза большими отступами сверху и снизу. И чем больше размер шрифта тем больше эти отступы. Можно ли какнибудь убрать эти отступы? Или узнать размер именно видимого текста без учета отступов?
__________________
www.MegaLuckyPlay.com |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Каждый символ шрифта имеет виртуальную кегельную площадку, он не висит в пустоте, имея только визуальные размеры, а имеет как бы прямоугольник "фона". У всех шрифтов положение каждого символа в этом контейнере (апроши, т.е. отступы от границ контейнера до контура глифа) – индивидуально, как и ширина контейнера. Поэтому в зависимости от размера шрифта Вам кажется, что отступы в ТекстФилде изменяются, но это не так – они ровно по 2 пикселя с каждой стороны (вопрос эстетики, у поля может быть собственная обводка и символы не должны её касаться, нужен хотя бы минимальный отступ). Но вот внутренний "визуальный" отступ самого текста меняется при изменении размера шрифта, так как меняется пиксельная величина апрошей, и хотя площадка первого символа остается в координатах (2, 2), контур этого символа внутри площадки будет тем дальше от верхнего левого угла, чем больше размер (скейл) шрифта.
Точный размер видимого текста можно узнать только с помощью битмапдаты (сделать снимок методом draw() и получить Rectangle текста методом getColorBoundsRect() ). Размер с апрошами, т.е. размер площадок (он будет чуть больше видимого) – через свойства TextField'a – textWidth и textHeight. То есть, чтобы, например, сделать поле такого минимального размера, чтобы оно четко вмещало текст и не обрезало символы, можно написать такой код Но это никогда не будет выглядеть идеально – отступы в текстфилде будут обязательно.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 02.10.2011 в 21:28. |
|
|||||
|
Banned
Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Они задаются в TextFormat
|
|
|||||
|
Регистрация: Sep 2005
Сообщений: 85
|
goodguy: в TextFormat они по умолчанию нулевые, а если ставить в минус то просто с другой стороны больше отступ получается.
Wolsh: даже если указывать размеры, всеравно эти отступы мешаются. Сделал через bitmapData. ![]()
__________________
www.MegaLuckyPlay.com |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 18
|
Столкнулся с той же проблемой, что и ТС. Решил ее примерно так:
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); } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Рамочки в 1 пиксель это костыль, грубый и беспощадный)) Добавлено через 5 минут Танцы с дополнительным спрайтом со скроллРект убрать. Создавать битмапдату нужных размеров и отрисовывать в нее битмапдату(!) текста методом copyPixels() с указанием полученного Rectangle. И не забываем делать dispose() промежуточным битмапдатам, чтобы не занимали память.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 18
|
Цитата:
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); } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Да, вроде так. Работает?))
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 18
|
|
![]() |
![]() |
Часовой пояс GMT +4, время: 20:43. |
|
|
« Предыдущая тема | Следующая тема » |
|
|