0

我已将 Arial 作为嵌入字体添加到我的字体格式中,我已将其添加到许多文本字段中,这些文本字段必须彼此准确对齐以创建空间外观。它们彼此对齐大约 1 - 2 个像素。问题是在正常的舞台尺寸下查看时它们的间距看起来不准确,但是当我放大文本时看起来很好。

我试过搞乱并添加高级抗锯齿,但没有任何效果。也许 Arial 不适用于小尺寸?我知道不设置字体会产生我想要的结果,但这不是我想要使用的字体;它必须使用时代?

有任何想法吗?

var myFont = new Font1();

            format1 = new TextFormat(); 
            format1.color = 0x000000; 
            format1.size = 16;
        format1.font = myFont.fontName;

编辑:本质上,我将每个字符拆分为自己的文本字段,因此我可以操纵每个字符并为其设置动画。但要做到这一点,我需要将字符隔开,就好像它是一个文本字段一样。

private var bmd:BitmapData; // bitmapdata to draw textField in;
        private function getExactMetrics(textField:TextField):Object
        {
            // copy textField to bitmap
            bmd = new BitmapData(textField.width,textField.height,true,0x000000);
            bmd.draw(textField);

            // loop through pixels of bitmap data and store the x location of pixels found.
            var foundx:Array = [];

             for (var nx:int = 0; nx < bmd.width;nx++)
               {
                for (var ny:int = 0; ny < bmd.height; ny++)
                {

                    var px:uint = bmd.getPixel32(nx, ny);
                    if (px != 0)
                    {
                        foundx.push(nx);
                        break;
                    }

                }
            }

            // get the values for the metrics
            var startX:int = foundx[0]; // first pixel found representing the x start of the text in pixels
            var endX:int = foundx[foundx.length-1]; t
            var realWidth:Number = endX - startX; 

            // clear the array with found x positions
            foundx = [];

            // wrap values in object
            var metrics:Object = { };
            metrics.width = realWidth;
            metrics.x = startX;

            // clear bitmapdata
            bmd = null;

            return metrics; // retrurn metric object;
        }

    }
4

2 回答 2

1

请记住,字体有kerning这意味着字母不仅彼此相邻,而且间距取决于字体的设置。例如,在单词“To”中,“o”略低于字母“T”的“顶梁”。

如果你只是把字母放在一起会看起来很糟糕,你必须考虑字距调整。

TextField类有一个getCharBoundaries方法可以用来获取准确的字符位置。不过,不确定它是否适用于 htmlText。

为了使其更简单,您可以使用第三方库。Greensock(但它不是免费的)或Textanim(开源)有一个很棒的SplitTextField 。

于 2012-06-01T15:47:25.430 回答
0

Verdana 等字体在较小的尺寸下可能具有更高的可读性;但是,听起来您遇到了文本指标问题。

在此示例中,TextLineMetrics 用于准确测量每个文本字段。

结果:

文本行度量

代码:

package
{
    import flash.display.Sprite;
    import flash.text.AntiAliasType;
    import flash.text.Font;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.text.TextLineMetrics;

    [SWF(percentWidth = 100, percentHeight = 100, backgroundColor = 0xefefef, frameRate = 30)]
    public class X extends Sprite
    {

        public function X()
        {
            super();

            // collection of words
            var words:Array = [ "These", "are", "the", "words", "to", "be", "placed" ];

            // define a text format
            var textFormat:TextFormat = new TextFormat();
            textFormat.font = "Arial";
            textFormat.bold = false;
            textFormat.size = 8;
            textFormat.color = 0x0;
            textFormat.align = TextFormatAlign.LEFT;

            // destination x coordinate for next word text field
            var dx:Number = 0;

            // for every word
            for each (var word:String in words)
            {
                // create a text field
                var textField:TextField = new TextField();
                textField.setTextFormat(textFormat);
                textField.defaultTextFormat = textFormat;
                textField.autoSize = TextFieldAutoSize.LEFT;
                textField.antiAliasType = AntiAliasType.ADVANCED;

                // set text and place the text field
                textField.text = word;
                textField.x = dx;
                textField.y = 20;
                addChild(textField);

                // measure the text field for accurate width
                var textLineMetrics:TextLineMetrics = textField.getLineMetrics(0);
                dx += textLineMetrics.width + 2;
            }
        }

    }
}
于 2012-05-27T20:37:34.437 回答