Creating states in a Flex skin
You may want to change the attributes of a component’s skin depending on the state the component is in. In this case, we’re going to make a skin for the Application class which changes its background depending on the state it’s in: happy: yellow background
1. Copy frameworks/projects/flex4/src/spark/skins/spark/ApplicationSkin.mxml to the directory you’re working in and rename it. I’m calling it SkinWithStates.mxml.
sad: blue background
sophisticated: various shades of grey
bland: white background
2a. Find the states section and add some states.
2b. Find the backgroundRect and make its fill stateful. Also, add a couple more Rects for the sophisticated state. Note that the subsequent Rects have left/right/top/bottom set to increasing numbers, so they will appear nested. Here is how the skin file should look when it’s done:
alpha.disabled="0.5" >
[HostComponent("spark.components.Application")]
]]>
top="0" bottom="0">
color.sophisticated="0x000000"
color.bland="0xffffff" />
top="20" bottom="20">
color.sophisticated="0x444444"
color.bland="0xffffff" />
top="40" bottom="40">
color.sophisticated="0x888888"
color.bland="0xffffff" />
minWidth="0" minHeight="0"/>
3. Override the getCurrentSkinState() method in a subclass of Application. This method should do whatever analysis is needed to figure out what state the skin should be in, and return a string containing that state’s name. Here is an example which just returns the mood, which is the name of a state. Save it as TestApplication.as:
package{
import spark.components.Application;
public class TestApplication extends Application{
public var mood:String;
// Constructor.
public function TestApplication():void{
mood = "bland";
}
// Return the state the skin should be in.
override protected function getCurrentSkinState():String{
return mood;
}
}
}
4. Make a main application file which uses the subclass and the skin just created:
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:custom="*"
skinClass="SkinWithStates" >
private function doMoodChange(e:Event):void{
this.mood = e.currentTarget.selectedValue;
// This causes the skin's state to
// be evaluated again.
invalidateSkinState();
}
]]>
label="happy" value="happy" />
label="sad" value="sad" />
label="sophisticated"
value="sophisticated" />
label="bland"
value="bland"
selected="true" />
12:26 AM
|
Labels:
Flex Skins and Themes
|
This entry was posted on 12:26 AM
and is filed under
Flex Skins and Themes
.
You can follow any responses to this entry through
the RSS 2.0 feed.
You can leave a response,
or trackback from your own site.
0 comments:
Post a Comment