topical media & game development
actionscript-book-NewsLayout-com-example-programmingas3-newslayout-HeadlineTextField.ax
actionscript-book-NewsLayout-com-example-programmingas3-newslayout-HeadlineTextField.ax
[swf]
flex
package
{
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.text.TextLineMetrics;
import flash.text.TextField;
Changes the size of the text to fit a given width and number of lines.
Useful for news headlines that should extend across a full column.
We need to know:
- which font family, weight, and style to use
- the max width of the headline
- the max height in pixels of the headline
- the max number of lines
Algorithm 1:
- figure out the N-width of a character that should work based on pixelWidth / numChars
- translate that N-width into a point size
- try the point size, if outside of tolerance,;
- if too wide, adjust down a point, try again
- if too small, adjust up a point, try again
- if too wide last time, too small this time or vice versa, stick with the too small size
Pixels per character (width-wise) is roughly 1/2 the point size, so that's a good starting
point. So to get a starting point size, divide the overall width by the number of characters
to get pixels-per-character, then double to get the point size.
public class @ax-actionscript-book-NewsLayout-com-example-programmingas3-newslayout-HeadlineTextField extends actionscript_book_NewsLayout_com_example_programmingas3_newslayout_FormattedTextField
{
public static var MIN_POINT_SIZE:uint = 6;
public static var MAX_POINT_SIZE:uint = 128;
public function @ax-actionscript-book-NewsLayout-com-example-programmingas3-newslayout-HeadlineTextField(tf:TextFormat = null)
{
super(tf);
this.autoSize = TextFieldAutoSize.LEFT;
}
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;
}
}
}
}
(C) Æliens
27/08/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.