Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   TextField Bounding Box (http://www.flasher.ru/forum/showthread.php?t=169314)

RonEXI 02.10.2011 20:16

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

Wolsh 02.10.2011 21:14

Каждый символ шрифта имеет виртуальную кегельную площадку, он не висит в пустоте, имея только визуальные размеры, а имеет как бы прямоугольник "фона". У всех шрифтов положение каждого символа в этом контейнере (апроши, т.е. отступы от границ контейнера до контура глифа) – индивидуально, как и ширина контейнера. Поэтому в зависимости от размера шрифта Вам кажется, что отступы в ТекстФилде изменяются, но это не так – они ровно по 2 пикселя с каждой стороны (вопрос эстетики, у поля может быть собственная обводка и символы не должны её касаться, нужен хотя бы минимальный отступ). Но вот внутренний "визуальный" отступ самого текста меняется при изменении размера шрифта, так как меняется пиксельная величина апрошей, и хотя площадка первого символа остается в координатах (2, 2), контур этого символа внутри площадки будет тем дальше от верхнего левого угла, чем больше размер (скейл) шрифта.
Точный размер видимого текста можно узнать только с помощью битмапдаты (сделать снимок методом draw() и получить Rectangle текста методом getColorBoundsRect() ).
Размер с апрошами, т.е. размер площадок (он будет чуть больше видимого) – через свойства TextField'a – textWidth и textHeight.
То есть, чтобы, например, сделать поле такого минимального размера, чтобы оно четко вмещало текст и не обрезало символы, можно написать такой код
Код AS3:

_txt.width = _txt.textWidth + 4;
_txt.height = _txt.textHeight + 4;

Но это никогда не будет выглядеть идеально – отступы в текстфилде будут обязательно.

goodguy 02.10.2011 21:47

Они задаются в TextFormat

RonEXI 02.10.2011 22:21

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

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

kimagg 16.03.2012 10:51

Столкнулся с той же проблемой, что и ТС. Решил ее примерно так:
Код 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);
}

Может быть есть предложение как это оптимизировать? Или знаете более простое решение?

Wolsh 16.03.2012 12:01

Цитата:

//т.к. крайние пиксели иногда не соответсвуют цвету
Так Вы не цвет текста ищите, а отсутствие цвета фона. Или отсутствие нулевой альфы.
Рамочки в 1 пиксель это костыль, грубый и беспощадный))

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

kimagg 16.03.2012 21:33

Цитата:

Сообщение от Wolsh (Сообщение 1069415)
Так Вы не цвет текста ищите, а отсутствие цвета фона. Или отсутствие нулевой альфы.
Рамочки в 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);
}


Wolsh 16.03.2012 22:20

Да, вроде так. Работает?))

kimagg 16.03.2012 22:22

Цитата:

Сообщение от Wolsh (Сообщение 1069529)
Да, вроде так. Работает?))

Внешне работает правильно.


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

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