簡體   English   中英

如何編寫一個自定義組件來自動換行和調整文本大小(在Flex中)?

[英]How to write a custom component to wrap and resize text automatically (in Flex)?

我知道Text組件的textAlign屬性。 但這並沒有達到我想要達到的目的:

我有一個500x100的Text組件(大小不變)。 默認字體大小為80像素。 但是,文本一直在變化。 我想要的是調整文本大小以“適合”文本字段。

假設文本更改為:“一條快速的棕色狐狸跳過了那只懶狗”。 由於字體大小太大,因此無法容納在文本字段中。 那么如何縮小textsize以使所有內容都適合並且下一行沒有內容?

在這里(直接從Adobe):

給定以像素為單位的寬度和要顯示的最大行數,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)
    {
        // the point size is too small
        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)
    {
        // set it back to the last size
        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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM