Search code examples
actionscript-3apache-flexflex-spark

Style a Spark Component with an Image


I'm trying to use an image (embedded) for the thumb on my Spark slider component. This should be straightforward -- I know what to do in mx -- but I haven't been able to find what the Spark syntax is.

I don't even need states (up, down, over, etc) since this is going on a mobile app.

Does anyone know?

Thanks.


Solution

  • Your Spark Slider requires a custom skin class, and that skin requires a SliderThumbSkin for the thumb.

    Spark Slider:

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                   xmlns:s="library://ns.adobe.com/flex/spark"
                   xmlns:mx="library://ns.adobe.com/flex/mx">
    
        <s:VSlider skinClass="SliderSkin" />
    
    </s:Application>
    

    SliderSkin - Spark Slider's skin class requires a thumb skin:

    <!--- The default skin class is VSliderThumbSkin. 
            @copy spark.components.supportClasses.TrackBase#thumb
            @see spark.skins.spark.VSliderThumbSkin -->
    <s:Button id="thumb" left="0" right="0" width="11" height="11"
              tabEnabled="false"
              skinClass="SliderThumbSkin" />
    

    This is the only change to the VSliderSkin. If you need the entire skin code, it is below in the Additional Information section of this answer.

    SliderThumbSkin - Thumb skin's button thumb requires skin for images:

    <?xml version="1.0" encoding="utf-8"?>
    <s:SparkButtonSkin xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
                       minWidth="21"
                       minHeight="21"
                       alpha.disabled="0.5">
    
        <fx:Metadata>
            <![CDATA[ 
            /** 
             * @copy spark.skins.spark.ApplicationSkin#hostComponent
             */
            [HostComponent("spark.components.Button")]
            ]]>
        </fx:Metadata>
    
        <!-- states -->
        <s:states>
            <s:State name="up" />
            <s:State name="over" />
            <s:State name="down" />
            <s:State name="disabled" />
        </s:states>
    
        <s:Image source.up="https://www.google.com/intl/en_com/images/srpr/logo3w.png"
                 source.over="https://www.google.com/intl/en_com/images/srpr/logo3w.png"
                 source.down="https://www.google.com/intl/en_com/images/srpr/logo3w.png"
                 source.disabled="https://www.google.com/intl/en_com/images/srpr/logo3w.png"
                 width="20"
                 height="20" />
    
    </s:SparkButtonSkin>
    

    Here, I've replaced the thumb with the Google logo:

    Spark slider skinned with Google logo image

    Additional Information

    These skins can be auto-generated using Flash Builder's content assist by [CTRL/COMMAND+SPACE] inside the quotes of skinClass="" appearing as such:

    Create skin context menu

    This will bring up a dialog to create a new MXML skin:

    New skin

    Default skins are in the SDK by theme. For Spark it'd be something like:

    C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.5\sdks\4.5.1\frameworks\projects\spark\src\spark\skins\spark
    

    Here is the entire SliderSkin class

    <?xml version="1.0" encoding="utf-8"?>
    
    <!--
    
        ADOBE SYSTEMS INCORPORATED
        Copyright 2008 Adobe Systems Incorporated
        All Rights Reserved.
    
        NOTICE: Adobe permits you to use, modify, and distribute this file
        in accordance with the terms of the license agreement accompanying it.
    -->
    
    <!--- The default skin class for the Spark VSlider component. The thumb and track skins are defined by the
    VSliderThumbSkin and VSliderTrackSkin classes, respectively.  
    
           @see spark.components.VSlider
           @see spark.skins.spark.VSliderThumbSkin
           @see spark.skins.spark.VSliderTrackSkin
    
          @langversion 3.0
          @playerversion Flash 10
          @playerversion AIR 1.5
          @productversion Flex 4
    -->
    <s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:fb="http://ns.adobe.com/flashbuilder/2009" minWidth="11" alpha.disabled="0.5">
    
        <fx:Metadata>
        <![CDATA[ 
            /** 
             * @copy spark.skins.spark.ApplicationSkin#hostComponent
             */
            [HostComponent("spark.components.VSlider")]
        ]]>
        </fx:Metadata> 
    
        <fx:Script fb:purpose="styling">
            /* Define the skin elements that should not be colorized. 
               For slider, the skin itself is colorized but the individual parts are not. */
            static private const exclusions:Array = ["track", "thumb"];
    
            /**
             * @private
             */   
            override public function get colorizeExclusions():Array {return exclusions;}
    
            /**
             * @private
             */
            override protected function initializationComplete():void
            {
                useChromeColor = true;
                super.initializationComplete();
            }
        </fx:Script>
    
        <fx:Script>
            /**
             *  @private
             */  
            override protected function measure() : void
            {
                // Temporarily move the thumb to the top of the Slider so measurement
                // doesn't factor in its y position. This allows resizing the
                // VSlider to less than 100px in height. 
                var thumbPos:Number = thumb.getLayoutBoundsY();
                thumb.setLayoutBoundsPosition(thumb.getLayoutBoundsX(), 0);
                super.measure();
                thumb.setLayoutBoundsPosition(thumb.getLayoutBoundsX(), thumbPos);
            }
        </fx:Script>
    
        <s:states>
            <s:State name="normal" />
            <s:State name="disabled" />
        </s:states>
    
        <fx:Declarations>
            <!--- The tooltip used in the mx.controls.Slider control.
                  To customize the DataTip's appearance, create a custom VSliderSkin class. -->
            <fx:Component id="dataTip">
                <s:DataRenderer minHeight="24" minWidth="40" x="20"> 
                    <s:Rect top="0" left="0" right="0" bottom="0">
                        <s:fill>
                            <s:SolidColor color="0x000000" alpha=".9"/>
                        </s:fill>
                        <s:filters>
                            <s:DropShadowFilter angle="90" color="0x999999" distance="3"/>
                        </s:filters>
                    </s:Rect>
                    <s:Label id="labelDisplay" text="{data}"
                             horizontalCenter="0" verticalCenter="1"
                             left="5" right="5" top="5" bottom="5"
                             textAlign="center" verticalAlign="middle"
                             fontWeight="normal" color="white" fontSize="11">
                    </s:Label>
                </s:DataRenderer>
            </fx:Component>
        </fx:Declarations>
    
        <!--- The default skin class is VSliderTrackSkin.
               @copy spark.components.supportClasses.TrackBase#track 
               @see spark.skins.spark.VSliderTrackSkin -->
        <s:Button id="track" left="0" right="0" top="0" bottom="0" minHeight="33" height="100"
                  tabEnabled="false"
                  skinClass="spark.skins.spark.VSliderTrackSkin" />
    
        <!--- The default skin class is VSliderThumbSkin. 
               @copy spark.components.supportClasses.TrackBase#thumb
               @see spark.skins.spark.VSliderThumbSkin -->
        <s:Button id="thumb" left="0" right="0" width="11" height="11"
                  tabEnabled="false"
                  skinClass="SliderThumbSkin" />
    
    </s:SparkSkin>