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.