Я использую TextBlock и TextLine Flash Text Engine для отображения текста. Однако я обнаружил, что какой-то шрифт заставляет TextLine неправильно вычислять высоту. Вот мой пример кода:
package users
{
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.engine.ElementFormat;
import flash.text.engine.FontDescription;
import flash.text.engine.FontLookup;
import flash.text.engine.FontPosture;
import flash.text.engine.FontWeight;
import flash.text.engine.RenderingMode;
import flash.text.engine.TextBaseline;
import flash.text.engine.TextBlock;
import flash.text.engine.TextElement;
import flash.text.engine.TextLine;
public class TestTextSize extends Sprite
{
private var textBlock:TextBlock = null;
private var textElement:TextElement = null;
private var _textField:TextField;
private var _textFormat:TextFormat;
private var elementFormat:ElementFormat;
private var _textLine:TextLine;
[Embed(source="assets/fonts/SWANSE__.TTF", fontFamily="Swansea", mimeType="application/x-font", embedAsCFF="true")]
private const Swansea:Class;
public function TestTextSize()
{
super();
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
stage.scaleMode = StageScaleMode.NO_SCALE;
var fontDescription:FontDescription = new FontDescription("Swansea"
, FontWeight.NORMAL, FontPosture.NORMAL, FontLookup.EMBEDDED_CFF, RenderingMode.CFF);
elementFormat = new ElementFormat();
elementFormat.fontDescription = fontDescription;
elementFormat.fontSize = 114.5;
elementFormat.color = 0x990000;
textElement = new TextElement("This is some text", elementFormat);
textBlock = new TextBlock(textElement);
textBlock.baselineZero = TextBaseline.ASCENT;
_textLine = textBlock.createTextLine(null, 1000,0,true);
_textLine.y = 0;
addChild(_textLine);
trace(_textLine.height);
trace(_textLine.textHeight);
trace(_textLine.totalHeight);
trace(_textLine.totalAscent);
trace(_textLine.totalDescent);
var rect:Rectangle = _textLine.getBounds(this);
trace(rect.y, rect.height);
var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0x004400);
sprite.graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
sprite.graphics.endFill();
sprite.alpha = 0.3;
sprite.y = 0;
addChild(sprite);
}
}
}
Я использую Swansea (http://www.fontspace.com/roger-white/swansea) стандартный нормальный шрифт).
Из кода я извлекаю высоту TextLine с помощью getBounds и использую эту высоту для рисования прямоугольника. Кажется, что прямоугольник имеет высоту, меньшую, чем фактический текст, это означает, что getBounds не может получить правильную фактическую высоту текста.
Результат выполнения кода выглядит следующим образом:
Консоль выдает следующий результат:
57,6
+57,59326171875
+57,59326171875
0
+57,59326171875
0 57,6
, что означает TextLine.textHeight, height, totalHeight и результат getBounds дают одинаковое значение, примерно 57,6 пикселя.
Итак, мой вопрос: как я могу получить фактическую высоту текста?
Пожалуйста, не говорите мне не использовать Суонси. До сих пор я пробовал 5-6 разных шрифтов, и только Суонси дает мне эту проблему. Но откуда мне знать, что эта проблема больше не повторится? По крайней мере, если есть способ отличить шрифт, который дает эту проблему, и шрифт, который не будет, это было бы очень полезно.