0

スペースの外観を作成するために互いに正確に並べる必要がある多数のテキスト フィールドに追加したフォント形式に、Arial を埋め込みフォントとして追加しました。それらは、互いに約 1 ~ 2 ピクセルの間隔で配置されます。問題は、通常のステージ サイズで表示するとテキストの間隔が不正確に見えることですが、ズームインするとテキストがきれいに表示されます。

いじり回して高度なアンチエイリアスを追加しようとしましたが、何も機能していません。おそらく、Arial は小さなサイズでは機能しないのでしょうか? フォントを設定しないと、必要な結果が得られることはわかっていますが、使用したいフォントではありません。Timesを使用している必要がありますか?

何か案は?

var myFont = new Font1();

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

編集: 基本的に、各文字を独自のテキストフィールドに分割しているので、各文字を操作してアニメーション化できます。ただし、そのためには、1 つのテキストフィールドであるかのように文字の間隔を空ける必要があります。

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' の 'top beam' のわずかに下にあります。

文字を並べただけだと見栄えが悪いので、カーニングを考える必要があります。

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 に答える