Search Flex Samples

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
sad: blue background
sophisticated: various shades of grey
bland: white 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.

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:




    xmlns:s="library://ns.adobe.com/flex/spark"
    alpha.disabled="0.5" >

    
            [HostComponent("spark.components.Application")]
    ]]>
    
 
    
    
    
    
        
        
        
        
    

    
            left="0" right="0" 
        top="0" bottom="0">
        
                                      color.happy="0xffff00"
                          color.sophisticated="0x000000"
                          color.bland="0xffffff" />
        

    
    
            left="20" right="20"
        top="20" bottom="20">
        
                                      color.happy="0xffff00"
                          color.sophisticated="0x444444"
                          color.bland="0xffffff" />
        

    

            left="40" right="40"
        top="40" bottom="40">
        
                                      color.happy="0xffff00"
                          color.sophisticated="0x888888"
                          color.bland="0xffffff" />
        

    
        
        top="0" bottom="0"
    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:fx="http://ns.adobe.com/mxml/2009" 
    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();
    }

]]>



            itemClick="doMoodChange(event)" />



    
        
    


    
    
                       groupName="group1" 
                   label="happy" value="happy" /> 
                       groupName="group1" 
                   label="sad" value="sad" /> 
                       groupName="group1" 
                   label="sophisticated" 
                   value="sophisticated" /> 
                       groupName="group1" 
                   label="bland" 
                   value="bland" 
                   selected="true" /> 


0 comments:

Related Flex Samples

Learn Flex: Flex Samples | Flex Video Tutorials Flex Examples