Ответ 1
Марк Фокс прав, что textHeight
не представляет фактическую высоту текста - и что классический TextField
во Flash не имеет никакой поддержки для получения фактической высоты пикселя визуализированного текста. То, что textHeight
представляет собой высоту линии - это ее восхождение (высота шрифта выше базовой линии), спуск (высота шрифта ниже базовой линии) и ведущий (пробел между линиями) в сочетании. Как подразумевается, высота постоянна, основываясь на восхождении и спуске шрифта, а не на фактическом тексте. (Принимая это во внимание, см. Adobe обзор условий здесь - и обратите внимание, что TextLineMetrics
вам тоже не поможет).
"Новый" Flash Text Engine (flash.text.engine) включает в себя свойства, позволяющие получить фактическую высоту текста, отображаемого с использованием этой технологии (например, TextLine.totalHeight
), но затем мы попадаем в низкоуровневый рендеринг текста. Если вам нужно использовать "классический" TextField
s, это не поможет вам в любом случае измерить текст, поскольку Flash Text Engine имеет свой собственный рендерер, который не обязательно отображает текст с одинаковой высотой и шириной, как "классический".
Вместо этого вы можете отредактировать TextField
до BitmapData
, затем измерить границы текста:
// Create a completely transparent BitmapData:
var bmd:BitmapData = new BitmapData(
textfield.width,
textfield.height,
true,
0x00ffffff);
// Note that some cases may require you to render a Sprite/MovieClip
// CONTAINING the TextField for anything to get drawn.
// For example, AntiAliasType.ADVANCED (antialias for readability) is known to
// not be renderable in some cases - other settings may cause nothing to be
// rendered too. In that case, simply wrap add the TextField as a child of an
// otherwise empty Sprite/MovieClip, and pass that to draw() instead:
bmd.draw(textfield);
// This gets the bounds of pixels that are not completely transparent.
// Param 1: mask = specifies which color components to check (0xAARRGGBB)
// Param 2: color = is the color to check for.
// Param 3: findColor = whether to bound pixels OF the specified color (true),
// or NOT OF the specified color (false)
//
// In this case, we're interested in:
// 1: the alpha channel (0xff000000)
// 2: being 00 (0x00......)
// 3: and want the bounding box of pixels that DON'T meet that criterium (false)
var rect:Rectangle = bmd.getColorBoundsRect(0xff000000, 0x00000000, false);
// Do remember to dispose BitmapData when done with it:
bmd.dispose();
trace("text height = " + rect.height);
trace("text width = " + rect.width);
Примечание по точности
Это может быть совершенно неактуально, в зависимости от того, что вы собираетесь использовать для этого, но стоит иметь в виду:
Этот метод, очевидно, всегда будет возвращать результат в целые пиксели - фактический рендеринг глифов, однако, использует субпиксели.
Другими словами, если вы добавите результаты измерения ширины "V" и "o", а затем сравните их с результатом "Vo", они могут не совпадать. Вы можете получить "40 + 35 = 74". Игнорирование этого кернинга и т.д. Может сблизить буквы друг с другом, рендеринг каждой буквы (размещение, сглаживание и т.д.) Также может быть различным, в зависимости от его контекста.