Designing (RED)Wire, Part 3: Advanced Styling Methods for Enhanced User Experience with Adobe Flex and AIR
Introduction
In the last segment, you learned how to leverage CSS to style components for large-scale Flex and AIR applications. In part three of this series, you will discover how to style application components programmatically.

The 3D interactive menu required some programmatic styling in order to position the 3D planes properly
Using the getStyle() and setStyle() Methods
All components derived from the UIComponent base class inherit two methods, called getStyle() and setStyle(). These two methods provide an incredible amount of flexibility to the developer, especially for programmatic skinning. Although covering all the possible uses of this functionality is beyond the scope of this article, I will show you a couple of different uses of it to demonstrate the power behind this functionality, as follows:
private function toMinimized():void {
TaskBarManager.addToTaskBar(this);
pushStateProperties(stateMin, x, y, 200, titleBar.height, NaN, NaN);
minimizeButton.setStyle("upSkin", getStyle("restoreButtonUpSkin"));
minimizeButton.setStyle("disabledSkin", getStyle("restoreButtonDisabledSkin"));
minimizeButton.setStyle("downSkin", getStyle("restoreButtonDownSkin"));
minimizeButton.setStyle("OverSkin", getStyle("restoreButtonOverSkin"));
maximizeButton.setStyle("upSkin", getStyle("maximizeButtonUpSkin"));
maximizeButton.setStyle("disabledSkin", getStyle("maximizeButtonDisabledSkin"));
maximizeButton.setStyle("downSkin", getStyle("maximizeButtonDownSkin"));
maximizeButton.setStyle("OverSkin", getStyle("maximizeButtonOverSkin"));
dispatchEvent(new Event("minimize"));
}
The toMinimized method seen in the code listing above is taken from a custom component that extends the Flex Panel class, and gives the appearance of a new window within the application that can be minimized so that only the title bar is showing in case the user has to access something that is behind it. The cool thing about it, is that when the window is in the minimized state, the minimize button is re-skinned on the fly using the setStyle method, which turns the button into a “restore” button, and the new state for the maximize button skin is also set. Essentially, we are reusing the same instance of a class by using it as a toggle button programmatically. Here is another example, this time using MXML:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="init()">
<mx:states>
<mx:State name="MyLibraryState">
<mx:AddChild position="firstChild">
<comp:CollectionsLibrary height="100%" width="100%"
horizontalCenter="0" verticalCenter="0">
</comp:CollectionsLibrary>
</mx:AddChild>
<mx:SetStyle name="backgroundImage"
value="@Embed(source='com/assets/my_collections_background.png')" />
<mx:SetProperty target="{vbox1}" name="y" value="442.95"/>
</mx:State>
</mx:states>
(…)
The setStyle method is also conveniently available to the developer through MXML using the syntax: . The code listing above sets a new background image when the state of the application is changed.
Compiling Style Sheets to Load at Runtime
An interesting feature in Flex 3 is that a CSS file can be compiled as a SWF and loaded at runtime. Using this feature, you could allow the user to change the look and feel of your application based on their own personal preference. You may have seen this type of functionality used on social media web sites, where JavaScript is used to swap CSS files when the user selects a new design view.
Not surprisingly, accomplishing this is very easy in Flex. Simply create a new CSS file, place your CSS style selectors in it, and save the file. Then, in the Flex navigator panel (upper left panel when in “Flex Development” mode), right click the CSS file you just created and select the option “Compile CSS to SWF”.

The CSS for the 3D interactive menu was loaded at runtime to layout the 3D planes. In this instance, the CSS information was loaded from a local database and parsed using a CSS parser/helper class
The StyleManager class
After you have created and compiled all of the CSS style sheets that you want to use in your application to separate SWF files, the Flex StyleManager class can be used to easily switch between style sheets, as demonstrated in the following code listing:
private function loadFirstStyleSheet():void {
StyleManager.loadStyleDeclarations("CSS1.swf");
}
private function loadSecondStyleSheet():void {
StyleManager.loadStyleDeclarations("CSS2.swf");
}
Computational Expense
One very important thing to take into consideration when loading precompiled style sheets at runtime is the load that you are putting on the user’s system as a result. This method of design implementation should be used conservatively and with extreme caution, as doing a lot of it will quickly degrade the performance of your application due to a lack of available system resources.
Conclusion
In this article series, you have seen a number of methods and techniques for implementing CSS in large-scale Flex applications. Interestingly, the Flash Platform has evolved so much in the last six months, that this article series barely scratches the surface. User Experience Design is taken to the next level with the proliferation of Flash Catalyst and Flash Builder, both of which will be in public beta in a matter of days. Additionally, the Flex 4 SDK expands on the already powerful capabilities of CSS within Flex, making the Flash Platform even more lucrative for RIA development and the number one choice for providing the best possible User Experiences.
Possibly Related Posts:
- Flash Camp Phoenix a Huge Success
- Best Drunk on Software Episode Ever
- Enterprise Flex and the Swiz Framework Architecture, Part 3: Using Autowire and Mediate
- “Flex 4 in Action” (Early Access Edition) Now Available!
- Designing (RED)Wire, Part 2: Taking the User Experience from Concept to Production with Flex and CSS
Posted by Dan Orlando on June 1st, 2009 :: Filed under General, User Experience
Tags :: Flex with CSS, user experience design, user interface
You can leave a response, or trackback from your own site.