2013-08-25 4 views
10

Как получить фактическую высоту текста в AS3 TextField? Похоже, TextField.textHeight сообщает некоторое фиксированное значение, которое не зависит от содержимого TextField.Поиск фактической высоты текста AS3

В примере ниже код производит следующее:

text=o p g y d j 
textWidth=120.8 
textHeight=**96** 

text=o 
textWidth=15 
textHeight=**96** 

text=oW 
textWidth=43.3 
textHeight=**96** 

Очевидно, что высота должна быть различной для "о" и "р" и т.д.

AS3 или код:

import flash.text.TextField; 

     var format : TextFormat = new TextFormat(); 
     format.font = "Times New Roman"; 
     format.size = 30; 
     format.align = TextFormatAlign.CENTER; 


     var textField1 : TextField = new TextField();  
     textField1.defaultTextFormat = format;  

     textField1.selectable = false;    
     textField1.sharpness = 0; 
     textField1.embedFonts = true; 
     textField1.multiline = false; 

     textField1.height = 50; 
     textField1.width = 200; 
     textField1.x = 10; 
     textField1.y = 10; 

     addChild(textField1); 

     textField1.text = "o p g y d j";  
     trace("text=" + textField1.text); 
     trace("textWidth=" + textField1.textWidth); 
     trace("textHeight=" + textField1.textHeight);  

     textField1.text = "o";  
     trace("\ntext=" + textField1.text); 
     trace("textWidth=" + textField1.textWidth); 
     trace("textHeight=" + textField1.textHeight); 

     textField1.text = "oW";  
     trace("\ntext=" + textField1.text); 
     trace("textWidth=" + textField1.textWidth); 
     trace("textHeight=" + textField1.textHeight);  

     stop(); 

Я думаю, TextField.textHeight не является правильной переменной, но что я должен использовать вместо этого?

+0

Кстати, в настоящее время Flash Pro CC имеет большую текстовую связанную ошибку, между прочим возвращает совершенно неправильно TextField.textHeight. Ниже описано временное исправление [здесь] (http://forums.adobe.com/message/5476157#5476157) – user1566515

ответ

12

Марк Фокс право, что textHeight не отражает фактическую высоту текста - и что вспышка классического TextField не имеет никакой поддержки получение фактической высоты пикселя визуализированного текста. Что textHeightделает представляет высоту линии - которая является его восхождением (шрифта «s высоты над базовой линией), спуск (шрифта» s высоты ниже базовой линии) и ведущий (пространство между линиями), вместе взятое. Как подразумевается, высота является постоянной, основанной на шрифтом восхождения и спуска, а не текст. (Принимая это во внимание, см. Adobe's overview of the terms here - и обратите внимание, что TextLineMetrics вам тоже не поможет).

«Новый» Flash Text Engine (flash.text.engine) включает в себя свойства, позволяющие получить фактическую высоту текста, отображаемого с использованием этой технологии (например, TextLine.totalHeight), - но затем мы попадаем в текстовый рендеринг низкого уровня. Если вам нужно использовать «classic» 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); 

Примечание о точности

Это может быть совершенно не имеет значения, в зависимости от того, что» это нужно использовать, но стоит иметь в виду:

Этот метод, очевидно, всегда будет возвращать результат в целые пиксели - фактический рендеринг o Однако глифы используют субпиксели.

Другими словами, если вы добавите результаты измерения ширины «V» и «o», а затем сравните их с результатом «Vo», они могут быть не такими. Вы можете получить «40 + 35 = 74». Игнорирование этого кернинга и т. Д. Может сблизить буквы друг с другом, рендеринг каждой буквы (размещение, сглаживание и т. Д.) Также может быть различным, в зависимости от его контекста.

+2

При создании 'bmd' вы устанавливаете' fillColor' '0xffffffff', который заполняет его сплошным белым. Поскольку вы хотите, чтобы он был полностью прозрачным, может быть, вы имеете в виду '0x00ffffff' (хотя просто« 0 »в порядке). – puggsoy

+0

Да, 0x00ffffff - это то, что нам нужно здесь. Благодаря! – user1566515

+0

Джимми, я проверил ваше решение и дал правильные размеры. (Примечание: bmd fillColor должен быть установлен в 0x00ffffff). Спасибо огромное! – user1566515

3

В этом вопросе подчеркивается наследие слабой семантики в типовых API-интерфейсах Flash.

Свойство textHeight представляет собой относительный размер шрифта в пикселях, он не учитывает пиксельное представление конкретных глифов (отдельных буквенных форм) в TextField.

Насколько я знаю, нет прямого программного способа измерения глифа с помощью Flash. Тем не менее, вы можете растровые текстовое поле и использовать GetPixel угадать:

var tf:TextField = …your textfield… 
var wide:int = tf.width; 
var tall:int = tf.height; 
var bmpd:BitmapData = new BitmapData(wide, tall, true,0xFFFFFFFF); 
bmpd.draw(tf); 
var totalPixels:int = wide * tall; 
var index:int = totalPixels + 1; 
var useIndex:int; 
var xPixel:int; 
var yPixel:int; 
while (--index > 0) { 
    useIndex = index - 1; 
    xPixel = useIndex % wide; 
    yPixel = int(useIndex/wide); 
    var pixelColor:uint = bmpd.getPixel(xPixel, yPixel); 
    // write some logic to find the y extremes where the pixelColor values are not white (or whatever background color specified when you created the BitmapData) 
} 
+0

Несоответствия между размером шрифта и размером отображаемого текста - это слабость каждого API. Flash зависит от Java, Java зависит от OS API. – Bitterblue

-1

Вы можете сделать это с помощью «textHeight»;

// Create TextField 
var tf:TextField = new TextField(); 
tf.wordWrap = true; 
tf.multiline = true; 
tf.selectable = false; 
tf.antiAliasType = AntiAliasType.ADVANCED; 
tf.autoSize = TextFieldAutoSize.LEFT; // It's should not be "=TextFieldAutoSize.NONE;" 
tf.embedFonts = true; 
tf.text = "Your text here"; 
this.addChild(tf); 

trace(tf.textHeight); 

Надеется, что это поможет

+1

Как и любой другой ответ, textHeight does * not * work. В официальной документации даже говорится, что вы не можете полагаться на нее для точных размеров пикселей. – leetNightshade

Смежные вопросы