- Flash Guide 2006
- Welcome to the New Flash Reference Guide
- Flash Design Guide
- Introduction To Flash
- Working with the Authoring Tool
- Working with Templates
- FreeHand for the Power User
- Creating Animation with Fireworks
- Creating Animation in Flash
- Animating Text
- Working With Layers and Keyframes
- Working With Tweens
- Quickly Add Keyframes to Tweens
- Using Animation Paths
- Using Flash's Onion Skinning Tools
- Publishing Your Animation
- Preloading for Non-Programmers
- Drawing in Flash
- Using the Library
- Organizing Animations With Storyboards
- Working With Masks
- Making 2D Look 3D
- Working With Text
- Working With Input Text Fields
- Working With Dynamic Text
- Working with Text: Advanced Text Treatment With CSS
- Working With Text: Embedding Fonts
- Flash Interactive Developer Guide
- What is an Interactive Developer?
- Creating Flash Projects
- Using Form Applications
- Working with Form Components
- Setting up a Movie for Design and Animation
- Setting up a Movie for Programming
- Working with Components
- ActionScript Fundamentals
- Intro to Working With Arrays
- Understanding The Three Types of Arrays
- Control Data Stored in Arrays
- The Eolas Solution
- Intro to Flash Player 9
- Working with Strings
- Creating ActionScript Transitions
- Working with Boolean Objects in ActionScript
- Optimizing Delivery
- Working with Numbers in ActionScript
- Working with the Number Class
- Flash Professional 9 Preview
- Adobe Takes ActionScript Open Source
- Flash Rich Media Guide
- Pros and Cons of Flash 8 Video
- Using SMIL in Flash Video 8
- Stream an MP3 Audio File to Your Flash Movie
- Flash 8
- Introduction to Flash 8
- Advanced Text Rendering
- Using BitmapData Class in Your ActionScript
- The CacheAsBitmap Property
- Bitmap Rendering Improvements and Blend Modes
- Using The ExternalInterface Class
- Using Filters
- Downloading and Uploading Files with ActionScript
- Runtime Support for GIF and PNG Files
- Garbage Collection in Flash 8
- Using Enhanced Gradients
- Using Scale 9
- Stroke Enhancements in Flash 8
- Video Support in Flash 8
- How to Create a Slideshow
- Creating Dynamic Text in Flash
- Flash 3-D–Taking Flash to the Third Dimension!
- Object Collision Detection with Flash
- Create a Quiz With The Flash Quiz Template
- Working with Flash
- Uses for Flash
- Beyond Flash
- Flash Reference Guide
- Informit Articles and Sample Chapters
- Books
- Online Resources
- Blogs and Discussion
- Tools and Downloads
- Summary
- Flash MX Interface
- Welcome to Flash: the Designers' and Developers' Tool
- Using the Stage
- Panels, Panels Everywhere
- Using the Tools Pane
- Using the Property Inspector
- Using the Timeline Panel
- Using the Library
- Adding Interaction through the Actions Panel
- Integrating with Studio MX
- Saving and Publishing Flash Movies
- Informit Articles and Sample Chapters
- Books
- Online Resources
- Summary
- Drawing in Flash
- Shape Tools
- Applying Color
- Informit Articles and Sample Chapters
- Tools and Downloads
- Summary
- Flash Bitmaps
- Importing Bitmaps
- Exporting Bitmap Images
- Converting Bitmap Images to Vector Illustrations
- Informit Articles and Sample Chapters
- Online Resources
- Tools and Downloads
- Summary
- Flash Text and Text Fields
- Text Types
- Input Text
- Online Resources
- Tools and Downloads
- Summary
- Using the Library
- Library Organization
- Creating Instances
- Informit Articles and Sample Chapters
- Books
- Online Resources
- Summary
- Flash Animation
- Controlling Time
- Keyframe Animation
- Tweening
- Text Animation with Flash
- Informit Articles and Sample Chapters
- Books
- Online Resources
- Summary
- Flash Audio
- Using Audio in Flash
- Importing
- Linking to MP3
- Publishing Audio
- Streaming MP3 from the Flash Communication Server
- Informit Articles and Sample Chapters
- Online Resources
- Summary
- Video in Flash
- Video
- Flash Video
- Spark Codec
- Exporting Video
- Informit Articles and Sample Chapters
- Blog and Discussion
- Summary
- Flash Components
- Attaching Components to Movies
- Creating a Component
- Informit Articles and Sample Chapters
- Tools and Downloads
- Summary
- Exporting and Optimization
- Connecting Flash to the Internet
- Loading SWF Movies
- Sharing Fonts Between Movies
- Reusing Your ActionScripts
- Using Third-Party Tools
- Informit Articles and Sample Chapters
- Online Resources
- Tools and Downloads
- Summary
- Introduction to Design in Flash
- Introduction to Design
- Fundamental Design Concepts
- Breaking Up the Screen
- Branding
- Adding Forms to Movies
- Developing with ActionScript
- Introduction to Programming within Flash MX 2004
- Using ActionScript to Extend the Functionality of Flash
- ActionScript Fundamentals
- Using the Actions Panel
- Using the Reference Panel
- Rapidly Adding ActionScript with the Behaviors Panel
- Event Handling within ActionScript
- Timeline Events
- Triggering Events through User Interaction
- Flash MX 2004 Pro
- Summary
- Creating Interactive Movies
- Giving Users a Choice
- What it All Comes Down to
- Summary
- Testing your Flash Movies
- Naming Conventions
- Syntax Checker
- Testing your movies
- Summary
- Debugging
- Using the "Debugger"
- Reviewing ActionScript Error Codes
- Summary
- Using ActionScript to Control Your Movies
- Setting Up Your Movies for Interaction
- Making Movie Clips Behave Like Buttons
- Controlling Multiple Movie Clips
- Applying Different Types of Events to a Movie Clip
- Summary
- Using ActionScript to Control Text
- How ActionScript Can Control Text
- Using Cascading Style Sheets within Flash MX 2004 Dynamic Text Boxes
- Applying CSS formatting with ActionScript
- Where Do You Go Now?
- The Differences Between ActionScript 1 and ActionScript 2
- Working with Classes
- Which Version of the Flash Player should you use?
- What’s Next?
- Using Pre-Built Classes In Flash MX 2004
- Using a Class in ActionScript
- The List of Core Classes
- Flash Player-Specific Classes
- Summary
- Creating Your Own Classes
- Creating a Custom Class
- Working with External Data in Flash
- Why Use XML in Flash?
- Integrating Flash and XML
- Visual Elements
- Adding the ActionScript
- Future Shock
- Using Components
- Begin Using Components
- Building an Application with Components
- Gluing Components Together with ActionScript
- Summary
- Informit Articles and Sample Chapters
- Books and e-Books
- Online Resources
- Rich Internet Applications
- Introduction to Rich Internet Applications
- Why Use Flash for Building Application Solutions?
- Building Applications with Flash
- Getting Started
- Using Flash Variables
- Working with Parameters in the Object and Embed HTML Tags
- Linking data with Flashvars
- Getting Data Into Flash: Loading External SWF and JPG Files
- Why You Should Separate Your Files
- Loading Movies into Levels and Target Movie Clips
- Summary
- Loading SWF and JPG Images
- Working With XML: What is XML, and How Does it Relate to Flash?
- A Brief History of XML
- Why Structuring Your Data is Always a Good Thing
- How XML Came to Flash
- Summary
- Working with XML: Good XML vs. Bad XML
- Good Places to Start
- Writing Good XML
- XML Tools
- The Next Step - Using XML in your Flash Applications
- Working with XML: Loading XML into Flash
- Integrating Flash and XML
- Visual Elements
- ActionScript
- Future Shock
- Working with XML — Dynamically Building XML with .NET, ColdFusion, Java, and PHP
- ColdFusion
- .NET
- Java
- PHP
- Summary
- Working with XML — Web Services
- SOAP Support in Flash MX 2004
- Using Components to Bind Web Services into your Applications
- Summary
- Working with Data — Working with XML
- XML In Flash
- Writing XML In Flash
- Building Trees of Data with XML
- Working with Data: Pushing Data back to the Server with Load Vars
- Setting up the Database
- Writing the VB.NET Code
- Creating the Flash Movie
- Working with Data: Leveraging Persistent Connections
- Using XMLSocket Connections
- XMLSocket Server
- XMLSocket Security
- XMLSocket Class in Flash
- Creating a Pong Game with an XMLSocket Server
- Summary
- Flash Remoting
- What is Flash Remoting?
- Using Flash Remoting
- The Future of Flash Remoting
- Flash Remoting Links
- Working with Data: Macromedia Flex Presentation Server
- What Problem Does Flex Presentation Server Address?
- How does Flex work?
- Coding and Building Flex Applications
- Building Rich Internet Applications: Connecting Flash to a Database
- Using FlashVars
- Using LoadVars
- Loading XML
- Consuming a Web Service
- Live data connections with XMLSocket Connections
- Building Rich Internet Applications: Planning, Planning, Planning
- A Simple Plan
- Tools You Can Use
- Applying a Discipline
- Building Rich Internet Applications: Design Counts
- Do Not Be Afraid to Ask For Help
- What if You Do Not Have a Ben To Call
- Building Rich Internet Applications: Beyond the Movie Clip
- UI Components
- Data Components
- Media Components
- Manager Components
- Screen Components
- Building Rich Internet Applications: Using Macromedia Central
- What Central is All About
- Who is Using Central?
- Developing for Macromedia Central
- Next Steps You Need to Take
- Building Rich Internet Applications: Using Macromedia Flex
- Authoring with Flex
- Publishing with Flex
- Presenting the Solution: Delivering Flash Applications to the Web
- Flash's own Publishing Tools
- Using Dreamweaver
- Writing your Own HTML
- Presenting the Solution: Delivering Flash Over Non-PC Devices
- Using Macromedia's Flash Lite
- Programming for Flash Lite
- FlashCast
- Informit Articles and Sample Chapters
- Books and e-Books
- Flash for Designers: Rich Media Production
- Graphic Control in Flash
- Drawing in Flash
- Importing Vector Art
- Importing Raster
- Scripting Images
- Introduction to the Rich Media Production
- Using Video, Audio and Images in your Flash Movies
- Using SWF Flash Movies
- Using JPEG Images
- MP3 Sound Files
- Flash Video
- Using Components to Build Rich Media Solutions
- Using the Loader Component
- Using the Media Components
- Controlling Components with ActionScript
- Controlling the Loader Component
- Media Components
- Using Audio in Flash
- Linking to MP3
- ActionScript-Controlled Audio
- Volume Control
- Publishing Audio
- Summary
- Video in Flash
- Working with Video
- Controlling Video with Components
- Exporting Video
- Summary
- Choosing Which Version of Flash Communication Server to Use
- Server Requirements
- Installation
- Running Communication Server on Different OS Platforms
- Pitfalls to Watch for
- Summary
- Streaming Video
- Live Video
- Broadcast Video on Demand
- Flash Video Components
- The Communication Server MX Server Code for the VideoPlayBack Component
- Record Video with VideoRecord Communication Component
- Create A Video Conference
- Examining the VideoConferencing Component
- The Communication Server MX Server Code for the VideoConferencing Component
- Summary
- Using the Microphone and Camera Core Classes
- Microphone
- Camera
- Constructing Large Applications That Leverage Video and Audio
- Configuring the Server
- Creating the Movie
- Broadcasting
- Summary
- Informit Articles and Sample Chapters
- Books and e-Books
- Matthew's Predictions for 2006
- Matthew's Favorite Flash Books
- Matthew's Favorite Flash Web Resources
- Macromedia as Part of Adobe
- First Look: Flash Player 8
- First, the Facts
- What Macromedia Brings to the Table
- What Adobe Brings to the Table
- What the Two Companies Can Do for Each Other
- A Brief History of Flash
It's quite likely you've had to use text in your applications at some point or another. A challenge that has dogged Flash since its inception has been text quality when type is small or displayed on a flat screen monitor. At larger font sizes, some of the problems that plagued Flash could be somewhat dismissed, but small font sizes got you every time.
For example, the following image shows a font displayed at 8 points that is almost illegible.
Macromedia has taken charge of this issue by introducing a new extension to the Text Object Class called Advanced Text Rendering. Advanced Text Rendering is licensed from Mitsubishi Electric Research Labs (MERL). MERL developed a technology called Saffron that brings type presentation to the best in class. Text rendering simply does not get any better.
This is an example of the same text, but with Advanced Text Rendering turned on.
Clearly, you can now read the text.
Saffron uses adaptively sample distance fields, or ADFs, to represent the outline of a glyph, or font. This is similar to Microsoft's ClearType initiative. Essentially, Saffron makes text easier to read through improved anti-aliasing. The end result is clear text at small sizes, whether you're looking at it on a Windows PC, Mac, or flat screen monitor.
Working With "Text" Class
Advanced Text Rendering is part of the text class you'll be using in ActionScript. By exposing the functionality of the text class, you can extend how your documents are presented. The text class, which was introduced with Flash MX 2004, has evolved extensively. You can learn more about it later in this Guide under the Text Layout section.
Before I jump into working with the new Advanced Text Rendering features, I want to run quickly through some text class fundamentals. First, the text class is an object and is treated exactly the same way as any other object in ActionScript. This means that before you can do anything with your text you need to declare a new text class object. Here's an example:
var my_format:TextFormat = new TextFormat(); Now you can create a dynamic text field. this.createTextField("my_text1", this.getNextHighestDepth(), 10, 10, 650, 100);
The "createTextField" object places a text field, with name, size, and position on the stage. Following this, you can programmatically modify the newly created field. For example, the following code will add a string of text to your new text field:
my_text1.text = "This is some text."
The Advanced Text Rendering objects allow you to visually modify the presentation of the text. To do this with a new text field you must apply a TextFormat object. First, create a new TextFormat Ojbect with some default settings, like this:
var my_format:TextFormat = new TextFormat(); my_format.font = "Arial"; my_format.size = 12;
When you embed a font you must remember to add the font to the Library with a corresponding font name. Now, bind the new TextFormat to the TextField like this:
my_text1.setTextFormat(my_format);
By following these steps, you've created the following:
This may not look very exciting at the moment, but it gets better.
Working With Advanced Text Rendering
Advanced Text Rendering is, at its core, controlled with the antiAliasType property. The property has two values, which are Normal and Advanced. The Normal mode is the mode used for legacy type formatting in Flash. The Advanced mode is the new format.
Only when Advanced mode is turned on can you access the new advanced features.
You can test to see how the two different modes look next to each. The following ActionScript creates two text fields that are populated with a string of text. The first text field is traditional normal text and the second simply converts the text to advanced.
var my_format:TextFormat = new TextFormat(); my_format.font = "Arial"; my_format.size = 80; this.createTextField("my_text1", this.getNextHighestDepth(), 10, 10, 650, 100); my_text1.text = "Normal."; my_text1.embedFonts = true; my_text1.antiAliasType = "normal"; my_text1.setTextFormat(my_format); this.createTextField("my_text2", this.getNextHighestDepth(), 10, 70, 650, 100); my_text2.text = "Advanced."; my_text2.embedFonts = true; my_text2.antiAliasType = "advanced"; my_text2.setTextFormat(my_format);
I have blown up the font size so that you can see how this will appear visually on the screen. The difference is subtle at the moment. What you can see, however, is that the edges of the lower text field are softer than those of the upper field.
Controlling Text Presentation For Different Monitor Types
Advanced Text Rendering allows you to control text for specific monitor types. An LCD monitor, for example, benefits from enhanced font management. This is achieved through control over the horizontal and vertical lines of a glyph in a font.
The main property that controls how text appears for specific monitors is the gridFitType property. There are three settings: none, pixel, and subpixel.
As you might assume, assigning none turns off gridFitType property.
Setting the gridFitType property to "pixel" only works for left aligned text. You will now have strong horizontal and vertical lines. Generally, this makes text easier to read.
The "subpixel" level makes text easier to read on LCD monitors.
The following ActionScript can be used to demonstrate the different levels of functionality for gridFitType:
var my_format:TextFormat = new TextFormat(); my_format.font = "Arial"; my_format.size = 20; this.createTextField("my_text1", this.getNextHighestDepth(), 10, 10, 400, 100); my_text1.text = "This text has sharpness set to 400." my_text1.embedFonts = true; my_text1.antiAliasType = "advanced"; my_text1.gridFitType = "pixel"; my_text1.setTextFormat(my_format); this.createTextField("my_text2", this.getNextHighestDepth(), 10, 40, 400, 100); my_text2.text = "This text has sharpness set to 0." my_text2.embedFonts = true; my_text2.antiAliasType = "advanced"; my_text2.gridFitType = "subpixel"; my_text2.setTextFormat(my_format); this.createTextField("my_text3", this.getNextHighestDepth(), 10, 70, 400, 100); my_text3.text = "This text has sharpness set to -400." my_text3.embedFonts = true; my_text3.antiAliasType = "advanced"; my_text3.setTextFormat(my_format);
Using The Sharpness Property
Sharpness is a property that allows you to control how much anti-alias is applied to the text. In the past, when you were working with text in Flash, you could only turn anti-alias on or off. There were no levels of control. With sharpness, you now have 800 levels of control from negative anti-alias through to positive anti-alias. The following image demonstrates three levels of anti-alias:
Sharpness levels can be controlled through ActionScript as shown here:
var my_format:TextFormat = new TextFormat(); my_format.font = "Arial"; my_format.size = 40; this.createTextField("my_text1", this.getNextHighestDepth(), 10, 10, 650, 100); my_text1.text = "This text has sharpness set to 400." my_text1.embedFonts = true; my_text1.antiAliasType = "advanced"; my_text1.gridFitType = "pixel"; my_text1.sharpness = 400; my_text1.setTextFormat(my_format); this.createTextField("my_text2", this.getNextHighestDepth(), 10, 40, 650, 100); my_text2.text = "This text has sharpness set to 0." my_text2.embedFonts = true; my_text2.antiAliasType = "advanced"; my_text2.gridFitType = "subpixel"; my_text2.sharpness = 0; my_text2.setTextFormat(my_format); this.createTextField("my_text3", this.getNextHighestDepth(), 10, 70, 650, 100); my_text3.text = "This text has sharpness set to -400." my_text3.embedFonts = true; my_text3.antiAliasType = "advanced"; my_text3.sharpness = -400; my_text3.setTextFormat(my_format);
As you can see, the level of control for text sharpness has never been higher.
Using The Thickness Property
You may know Thickness, the new property in Advanced Text Rendering, as either boldness or leading. Essentially, all three terms mean the same thing—the thickness of the glyph in a font as it is presented on the screen.
The Thickness property has 400 levels of control. The following image demonstrates text thickness at levels 200, 0, and -200.
As with the Sharpness property, you can control the thickness of text with ActionScript. Here is the ActionScript used to create the above example:
var my_format:TextFormat = new TextFormat(); my_format.font = "Arial"; my_format.size = 40; this.createTextField("my_text1", this.getNextHighestDepth(), 10, 10, 650, 100); my_text1.text = "This text has thickness set to 200." my_text1.embedFonts = true; my_text1.antiAliasType = "advanced"; my_text1.gridFitType = "pixel"; my_text1.thickness = 200; my_text1.setTextFormat(my_format); this.createTextField("my_text2", this.getNextHighestDepth(), 10, 40, 650, 100); my_text2.text = "This text has thickness set to 0." my_text2.embedFonts = true; my_text2.antiAliasType = "advanced"; my_text2.gridFitType = "subpixel"; my_text2.thickness = 0; my_text2.setTextFormat(my_format); this.createTextField("my_text3", this.getNextHighestDepth(), 10, 70, 650, 100); my_text3.text = "This text has thickness set to -200." my_text3.embedFonts = true; my_text3.antiAliasType = "advanced"; my_text3.thickness = -200; my_text3.setTextFormat(my_format);
Building an Application: How It All Works Together
All of these samples are good, but it's easier to see how this works in practice. The following example demonstrates how you can change font formatting dynamically within a Flash application.
You will need to add the following Components to the stage.
Component Type |
ID Name |
Parameters |
CheckBox |
antiAliasCheckbox |
|
CheckBox |
subPixelGridFitCheckbox |
|
ComboBox |
sampleFont |
|
NumericStepper |
fontSizeNS |
Maximum = 100 |
NumericStepper |
thicknessNS |
Maximum = 200 |
NumericStepper |
sharpnessNS |
Maximum = 400 |
When you have the Components on the stage you can add the following ActionScript:
_root.createTextField("sampleTextBox",100 , 18, 78, 380, 380); _root.sampleTextBox.background=true; _root.sampleTextBox.border=false ; _root.sampleTextBox.backgroundColor=0xFFFFFF;//white _root.sampleTextBox.borderColor=0x000000;//black _root.sampleTextBox.multiline=true; _root.sampleTextBox.wordWrap= true; _root.sampleTextBox.embedFonts = true; _root.sampleTextBox.antiAliasType = "advanced"; _root.sampleTextBox.gridFitType = "subpixel"; myTextFormat1 = new TextFormat(); myTextFormat1.font = "Arial"; myTextFormat1.size = fontSizeFeedback.text = 32; myTextFormat1.color = 0x000000; //black _root.sampleTextBox.setNewTextFormat(myTextFormat1); sampleTextCopy = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio "; sampleTextCopy += sampleTextCopy; sampleTextCopy += sampleTextCopy; _root.sampleTextBox.text = sampleTextCopy; sampleTextBox.antiAliasType = 1; sampleTextBox.thickness = thicknessFeedback.text = 0; sampleTextBox.sharpness = sharpnessFeedback.text = 0; sampleFonts = ["Arial", "Arial Black", "Arial Italic", "Century Gothic", "Comic Sans MS", "Courier New", "Georgia", "Georgia Italic", "Helvetica", "Impact", "Times New Roman", "Times New Roman Italic", "Trebuchet MS", "Verdana", "Burweed ICG"]; /********************************************/ customTable = new Array(); entry = { fontSize: 16.0, insideCutoff: 1, // absolute filter value outsideCutoff: -1 // absolute filter value }; customTable.push(entry); entry = { fontSize: 32.0, insideCutoff: 0.8, // absolute filter value outsideCutoff: -0.8 // absolute filter value }; customTable.push(entry); flash.text.TextRenderer.setAdvancedAntialiasingTable("Comic Sans MS", "none", "dark", customTable); /*********************************************/ // initialize the font combobox for (i = 0; i < sampleFonts.length; i++) sampleFont.addItem(sampleFonts[i]); // sampleFont handler function sampleFontHandler(eventObj){ if (eventObj.type == "change") { myTextFormat1.font = sampleFont.text; _root.sampleTextBox.setNewTextFormat(myTextFormat1); _root.sampleTextBox.text = sampleTextCopy; } } sampleFont.addEventListener("change", sampleFontHandler); function fontNSHandler(eventObj){ if (eventObj.type == "change") { myTextFormat1.size = fontSizeNS.value; fontSizeFeedback.text = fontSizeNS.value; _root.sampleTextBox.setNewTextFormat(myTextFormat1); _root.sampleTextBox.text = sampleTextCopy; } } fontSizeNS.addEventListener("change", fontNSHandler); function antiAliasCheckboxHandler(eventObj){ if (eventObj.type == "click"){ if (antiAliasCheckbox.selected) { sampleTextBox.antiAliasType = "advanced"; // use Saffron } else { sampleTextBox.antiAliasType = "normal"; // use old Flash legacy text rendering } } } antiAliasCheckbox.addEventListener("click", antiAliasCheckboxHandler); function subPixelGridFitCheckboxHandler(eventObj){ if (eventObj.type == "click"){ if (subPixelGridFitCheckbox.selected) { sampleTextBox.gridFitType = "subpixel"; // 2 is subPixelGridFitType, 1 is reserved for future use... } else { sampleTextBox.gridFitType = "pixel"; // off } } } subPixelGridFitCheckbox.addEventListener("click", subPixelGridFitCheckboxHandler); function thicknessNSHandler(eventObj){ if (eventObj.type == "change") { sampleTextBox.thickness = thicknessNS.value; } } thicknessNS.addEventListener("change", thicknessNSHandler); function sharpnessNSHandler(eventObj){ if (eventObj.type == "change") { sampleTextBox.sharpness = sharpnessNS.value; } } sharpnessNS.addEventListener("change", sharpnessNSHandler);
When you run this movie, you'll find that you can dynamically control the formatting of your font.
Summary
Controlling text has always been a challenge for Flash. With Advanced Text Formatting—new in Flash 8—you gain significant control over the presentation of your text.