2010-02-19 2 views
1

Мне известно свойство textAlign компонента Text. Но он не делает то, что я пытаюсь достичь:Как написать настраиваемый компонент для автоматического и автоматического изменения размера текста (в Flex)?

У меня есть компонент Text, который равен 500x100 (размер не изменяется). Размер шрифта по умолчанию - 80 пикселей. Текст, однако, продолжает меняться. Я хочу изменить размер текста, чтобы «поместиться» внутри текстового поля.

Предположим, текст изменен на: «Быстрая коричневая лиса перепрыгнула через ленивую собаку». Это не помещается в текстовое поле, потому что размер шрифта слишком велик. Итак, как можно сжимать текст так, чтобы все подходило, и ничего не выходит на следующую строку?

ответ

1

Здесь вы идете (непосредственно от 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; 
    } 
} 
+0

Nice скрытое сокровище. Благодаря! :) – Yeti

Смежные вопросы