AS3: Как я могу получить верхнюю левую и точную ширину и высоту некоторого текста в текстовом поле? - PullRequest
4 голосов
/ 07 марта 2012

Мы пытаемся получить Rectangle, который представляет точную * границу текста в TextField.

** Точно, насколько возможно. *

Возьмите это изображение:

enter image description here

Используя мои текущие знания, я могу получить синий прямоугольник выше, вот так:

var textRect:Rectangle = new Rectangle(
    field.x,
    field.y,
    field.textWidth,
    field.textHeight
);

Однако нам нужно максимально приблизиться к красному прямоугольнику (я понимаю, что будут небольшие отличия, потому что символы меняются с / height и нужно будет найти общий язык).

Как я могу получить красный прямоугольник (динамически)?


Я создал этот вспомогательный класс, основываясь на ответе ниже Джейкоба Эггерса, однако всегда получаю результат (x=0, y=0, w=0, h=0) ..

package
{
    import flash.display.BitmapData;
    import flash.text.TextField;
    import flash.geom.Rectangle;

    public class TextBounds
    {

        public static function getTextBounds(textField:TextField):Rectangle
        {
            var curtainColor:uint = 0x00FF00;
            var bmd:BitmapData = new BitmapData(textField.width, textField.height, false, curtainColor);
            bmd.draw(textField);

            return bmd.getColorBoundsRect(curtainColor, textField.textColor, true);
        }

    }
}

Даже если я заполню небольшую часть нужным цветом, я все равно получу прямоугольник нулевого размера:

bmd.fillRect(new Rectangle(0, 0, 30, 30), textField.textColor);

Ответы [ 2 ]

5 голосов
/ 07 марта 2012

Используйте BitmapData.draw, а затем используйте getColorBoundsRect, чтобы получить границы черного текста.Примерно так:

import flash.display.Bitmap;
import flash.display.BitmapData;

var bmd:BitmapData = new BitmapData(80, 40, false, 0xFFFFFF);
bmd.draw(tf)

var maskColor:uint = 0xFFFFFF; 
var color:uint = 0x000000;  //the color of the text
var tfBounds:Rectangle = bmd.getColorBoundsRect(maskColor, color, true);
trace(tfBounds);

edit хороший улов zachzurn о цвете текста.Я добавил комментарий, чтобы уточнить.

1 голос
/ 07 марта 2012

Попробуйте, хотя это не будет идеально:

var textRect:Rectangle = field.getBounds(field.parent);

Или попробуйте это (есть пример, который вы можете попробовать):

http://blog.stroep.nl/2009/11/getbitmapbounds/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...