フィールドサイズに合わせるためのフォントサイズ変更

HeadlineTextField では、幅 (ピクセル単位) と最大表示行数が指定されると、テキストがフィールドいっぱいに表示されるようにフォントサイズが変更されます。テキストが短い場合には、フォントサイズが非常に大きくなるため、タブロイドスタイルのヘッドラインが作成されます。テキストが長い場合には、当然ながらフォントサイズが小さくなります。

次に示す HeadlineTextField.fitText() メソッドで、フォントサイズの変更処理が実行されます。

public function fitText(msg:String, maxLines:uint = 1, toUpper:Boolean = false, targetWidth:Number = -1):uint
{
    this.text = toUpper ? msg.toUpperCase() : msg;
    
    if (targetWidth == -1)
    {
        targetWidth = this.width;
    }
    
    var pixelsPerChar:Number = targetWidth / msg.length;
    
    var pointSize:Number = Math.min(MAX_POINT_SIZE, Math.round(pixelsPerChar * 1.8 * maxLines));
    
    if (pointSize < 6)
    {
        // ポイントサイズが小さすぎます。
        return pointSize;
    }
    
    this.changeSize(pointSize);
    
    if (this.numLines > maxLines)
    {
        return shrinkText(--pointSize, maxLines);
    }
    else
    {
        return growText(pointSize, maxLines);
    }
}

public function growText(pointSize:Number, maxLines:uint = 1):Number
{
    if (pointSize >= MAX_POINT_SIZE)
    {
        return pointSize;
    }
    
    this.changeSize(pointSize + 1);
    
    if (this.numLines > maxLines)
    {
        // 直前のサイズに戻します。
        this.changeSize(pointSize);
        return pointSize;
    }
    else
    {
        return growText(pointSize + 1, maxLines);
    }
}

public function shrinkText(pointSize:Number, maxLines:uint=1):Number
{
    if (pointSize <= MIN_POINT_SIZE)
    {
        return pointSize;
    }
    
    this.changeSize(pointSize);
    
    if (this.numLines > maxLines)
    {
        return shrinkText(pointSize - 1, maxLines);
    }
    else
    {
        return pointSize;
    }
}

HeadlineTextField.fitText() メソッドでは、単純な再帰的手法によってフォントサイズが変更されます。最初にテキストの 1 文字あたりの平均ピクセル数が推定され、それに基づいて開始ポイントサイズが算出されます。次に、テキストフィールドのフォントサイズが変更されます。その後、テキストが折り返されたされたためにテキスト行の最大数を超えて行が生成されていないかどうかが確認されます。行数が多すぎる場合には、shrinkText() メソッドが呼び出されて、フォントサイズを小さくする操作が何回か試行されます。最大行数を超えていない場合には、growText() メソッドが呼び出されて、フォントサイズを大きくする操作が何回か試行されます。フォントサイズを現在の値よりも 1 ポイント大きくすると最大行数を超えるような状態に達したときに、処理が終了します。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000239.html