Creating a custom MX Accordion header skin in Flex 4
The following example shows how you can style the MX Accordion header (with default Spark skin) in Flex 4 by creating a new skin based on the default Spark skin and modifying the various skin parts.
The following example(s) require Flash Player 10 and the Adobe Flex 4 SDK. To download the Adobe Flash Builder 4 trial, see http://www.adobe.com/products/flex/. To download the latest nightly build of the Flex 4 SDK, see http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4.
For more information on getting started with Flex 4 and Flash Builder 4, see the official Adobe Flex Team blog.
<?xml version="1.0" encoding="utf-8"?> <!-- http://blog.flexexamples.com/2009/06/21/creating-a-custom-halo-accordion-header-skin-in-flex-4/ --> <s:Application name="Accordion_SparkSkin_headerStyleName_skin_test" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:s="library://ns.adobe.com/flex/spark"> <fx:Style> .customAccordionHeadStyles { skin: ClassReference("skins.CustomAccordionHeaderSkin"); } </fx:Style> <mx:Accordion id="accordion" headerStyleName="customAccordionHeadStyles" left="20" right="20" top="20" bottom="20"> <mx:VBox label="Red" width="100%" height="100%"> <mx:Text text="Panel 1" /> </mx:VBox> <mx:VBox label="Orange" width="100%" height="100%"> <mx:Text text="Panel 2" /> </mx:VBox> <mx:VBox label="Yellow" width="100%" height="100%"> <mx:Text text="Panel 3" /> </mx:VBox> <mx:VBox label="Green" width="100%" height="100%"> <mx:Text text="Panel 4" /> </mx:VBox> <mx:VBox label="Blue" width="100%" height="100%"> <mx:Text text="Panel 5" /> </mx:VBox> </mx:Accordion> </s:Application>
The default Spark skins for the MX/Halo controls/containers can be found in the Flex SDK at:
%Flex SDK%\frameworks\projects\sparkskins\src\mx\skins\spark\*.
And the custom Accordion header skin, skins/CustomAccordionHeaderSkin.mxml, is as follows:
<?xml version="1.0" encoding="utf-8"?> <!-- http://blog.flexexamples.com/2009/06/21/creating-a-custom-halo-accordion-header-skin-in-flex-4/ --> <s:SparkSkin name="CustomAccordionHeaderSkin" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" minWidth="21" minHeight="21" alpha.disabled="0.5"> <!-- states --> <s:states> <s:State name="up" /> <s:State name="over" /> <s:State name="down" /> <s:State name="disabled" /> <s:State name="selectedUp" /> <s:State name="selectedOver" /> <s:State name="selectedDown" /> <s:State name="selectedDisabled" /> </s:states> <fx:Script> <![CDATA[ override protected function initializationComplete():void { useChromeColor = true; super.initializationComplete(); } ]]> </fx:Script> <!-- layer 3: fill --> <s:Rect left="1" right="1" top="1" bottom="1"> <s:fill> <s:SolidColor color="white" color.up="red" color.over="haloOrange" color.down="yellow" color.selectedUp="haloGreen" color.selectedOver="haloBlue" color.selectedDown="purple" /> </s:fill> </s:Rect> <!-- layer 4: fill lowlight --> <s:Rect left="1" right="1" top="1" bottom="1"> <s:fill> <s:LinearGradient rotation="270"> <s:GradientEntry color="0x000000" ratio="0.0" alpha="0.0627" /> <s:GradientEntry color="0x000000" ratio="0.48" alpha="0.0099" /> <s:GradientEntry color="0x000000" ratio="0.48001" alpha="0" /> </s:LinearGradient> </s:fill> </s:Rect> <!-- layer 5: fill highlight --> <s:Rect left="1" right="1" top="1" bottom="1"> <s:fill> <s:LinearGradient rotation="90"> <s:GradientEntry color="0xFFFFFF" ratio="0.0" alpha="0.33" alpha.over="0.22" alpha.down="0.12"/> <s:GradientEntry color="0xFFFFFF" ratio="0.48" alpha="0.33" alpha.over="0.22" alpha.down="0.12" /> <s:GradientEntry color="0xFFFFFF" ratio="0.48001" alpha="0" /> </s:LinearGradient> </s:fill> </s:Rect> <!-- layer 6: highlight stroke (all states except down) --> <s:Rect left="1" right="1" top="1" bottom="1" excludeFrom="down"> <s:stroke> <s:LinearGradientStroke rotation="90"> <s:GradientEntry color="0xFFFFFF" alpha.over="0.22" /> <s:GradientEntry color="0xD8D8D8" alpha.over="0.22" /> </s:LinearGradientStroke> </s:stroke> </s:Rect> <!-- layer 6: highlight stroke (down state only) --> <s:Rect left="1" top="1" bottom="1" width="1" includeIn="down"> <s:fill> <s:SolidColor color="0x000000" alpha="0.07" /> </s:fill> </s:Rect> <s:Rect right="1" top="1" bottom="1" width="1" includeIn="down"> <s:fill> <s:SolidColor color="0x000000" alpha="0.07" /> </s:fill> </s:Rect> <s:Rect left="1" top="1" right="1" height="1" includeIn="down"> <s:fill> <s:SolidColor color="0x000000" alpha="0.25" /> </s:fill> </s:Rect> <s:Rect left="1" top="2" right="1" height="1" includeIn="down"> <s:fill> <s:SolidColor color="0x000000" alpha="0.09" /> </s:fill> </s:Rect> <!-- layer 2: border --> <s:Rect left="0" right="0" top="0" bottom="0" width="69" height="20"> <s:stroke> <s:SolidColorStroke color="0x696969" alpha="1" alpha.over="1" alpha.down="1" /> </s:stroke> </s:Rect> </s:SparkSkin>
This entry is based on a beta version of the Flex 4 SDK and therefore is very likely to change as development of the Flex SDK continues. The API can (and will) change causing examples to possibly not compile in newer versions of the Flex 4 SDK.
Peter deHaan
Peter deHaan currently works for Adobe on the Flex SDK QA team. While not working on Flex, Flash, and ColdFusion applications, Peter enjoys making up bios and writing in 3rd person. Peter's rarely updated blog can be found at blogs.adobe.com/pdehaan/, actionscriptexamples.com, airexamples.com, and coldfusionexamples.com.
-
Add Widgets (Content Sidebar)
This is your Content Sidebar. Edit this content that appears here in the widgets panel by adding or removing widgets in the Content Sidebar area.
14 Responses to Creating a custom MX Accordion header skin in Flex 4
-
Categories
- Accordion
- AccordionHeader
- ActionScript
- AddChild
- AdvancedDataGrid
- Alert
- alpha
- Animate
- AnimateProperties
- Application
- Application (Spark)
- ArrayCollection
- BarChart
- baseColor
- beta
- beta1
- beta2
- Bitmap
- Bitmap/BitmapData
- BitmapData
- BitmapFill
- BitmapFill (Spark)
- BitmapGraphic
- BitmapImage
- BitmapImage (Spark)
- BitmapImageResizeMode
- Border (Spark)
- BorderContainer (Spark)
- Box
- BuildInfo
- Button
- Button (Spark)
- ButtonBar
- ButtonBar (Spark)
- ByteArray
- Camera
- Charting
- CheckBox
- CheckBox (Spark)
- ClassFactory
- CollectionEvent
- Color
- ColorPicker
- ColorUtil
- ComboBox
- ComboBoxArrowSkin
- Compiler
- Component
- Component (Spark)
- Configuration
- Container
- ContextMenu
- ContextMenuEvent
- ContextMenuItem
- CSSCondition
- CSSSelector
- CSSStyleDeclaration
- CurrencyFormatter
- CursorManager
- Data Binding
- DataGrid
- DataGrid (Spark)
- DataGridColumn
- Date
- DateBase
- DateChooser
- DateField
- DateFormatter
- Debugging
- DefaultComplexItemRenderer
- DefaultTileListEffect
- DropDownList
- DropDownList (Spark)
- DropDownListButtonSkin
- DropDownListSkin
- DropShadowFilter
- E4X
- Effects
- Ellipse
- EmailValidator
- Embed
- Event
- Fade
- FileFilter
- FileReference
- fill
- Filters
- Flash
- Flash Integration
- FlashVars
- Flex 3 SDK
- Flex Builder
- Flex Builder 3
- Flex SDK
- Flex4
- FLVPlayback
- FocusManager
- FontLookup
- Fonts
- Form
- Form (Spark)
- FormHeading (Spark)
- FormItem
- FormItem (Spark)
- Forms
- FTETextField (Spark)
- FullScreen
- FullScreenEvent
- FxAnimateColor
- FxButtonBar
- FxCheckBox
- FXG
- FxHScrollBar
- FxHSlider
- FxList
- FxNumericStepper
- FxRadioButton
- FxRotate3D
- FxScroller
- FxTextArea
- FxTextInput
- FxToggleButton
- FxVScrollBar
- FxVSlider
- getStyleDeclaration()
- GradientEntry
- Graphic (Spark)
- HBox
- HDividedBox
- HGroup (Spark)
- HorizontalLayout
- HorizontalList
- HSBColor (Spark)
- HScrollBar (Spark)
- HSlider
- HSlider (Spark)
- HTML template
- ID3Info
- Image
- Image (Spark)
- ImageSnapshot
- itemRenderer
- JointStyle
- Label
- Label (Spark)
- Legend
- LegendItem
- LigatureLevel
- Line
- LinearGradientStroke
- LineScaleMode
- LinkBar
- LinkButton
- List
- List (Spark)
- Menu
- MenuBar
- Metadata
- MetadataEvent
- Model
- Mouse
- MouseCursor
- MouseEvent
- Move
- Namespace
- NavigatorContent (Spark)
- needsSWF
- NetConnection
- NetStream
- Nightly Builds
- NumberBaseRoundType
- NumberFormatter
- NumberValidator
- NumericCompare
- NumericStepper
- NumericStepper (Spark)
- ObjectProxy
- ObjectUtil
- paddingLeft
- paddingRight
- Panel
- Panel (Spark)
- Parallel
- Path
- PieChart
- PieSeries
- PieSeriesItem
- PopUpAnchor (Spark)
- PopUpButton
- PopUpManager
- ProgrammaticSkin
- ProgressBar
- PropertyChangeEvent
- QName
- RadialGradient
- RadioButton
- RadioButton (Spark)
- RadioButtonGroup
- RadioButtonGroup (Spark)
- Rect
- RegExp
- Regular Expressions
- Repeater
- RichEditableText
- RichText
- RichText (Spark)
- RichTextEditor
- Rotate
- Rotate3D (Spark)
- Scroller (Spark)
- Sequence
- setStyle()
- SimpleText
- SimpleText (Spark)
- skinClass
- Slider
- SliderEvent
- SolidColor
- SolidColorStroke
- Sort
- SortField
- Sound
- SoundEffect
- Spinner (Spark)
- SpriteVisualElement (Spark)
- StageDisplayState
- States
- StringUtil
- StringValidator
- StyleManager
- Styles
- SWFLoader
- SWFObject
- System
- SystemManager
- TabBar
- TabBar (Spark)
- TabNavigator
- TabStopFormat
- Text
- Text Layout Framework (TLF)
- TextArea
- TextArea (Spark)
- TextBox
- TextConverter
- TextEvent
- TextFlow
- TextFlowUtil
- TextFormat
- TextGraphic
- TextInput
- TextInput (Spark)
- TextLayoutFormat
- TextView
- Themes
- TileLayout
- TileList
- TileOrientation
- Timer
- TitleWindow
- TitleWindow (Spark)
- TLF
- ToggleButton (Spark)
- ToggleButtonBar
- ToolTip
- Transition
- Tree
- TruncationOptions
- UIComponent
- UIFTETextField
- Updater
- URLLoader
- URLRequest
- URLUtil
- URLVariables
- ValidationResultEvent
- Validator
- Validators
- VBox
- VDividedBox
- Vector
- VerticalLayout
- VerticalLayout (Spark)
- VGroup (Spark)
- Video
- VideoDisplay
- VideoElement
- VideoElement (Spark)
- VideoEvent
- VideoPlayer (Spark)
- VideoPlayerScrubBar
- ViewStack
- VScrollBar (Spark)
- VSlider
- VSlider (Spark)
- XML
- XMLList
- XMLListCollection
- ZipCodeValidator
- ZipCodeValidatorDomainType
- Zoom
-
Articles
- December 2010
- November 2010
- October 2010
- September 2010
- August 2010
- July 2010
- June 2010
- May 2010
- April 2010
- March 2010
- February 2010
- January 2010
- December 2009
- November 2009
- October 2009
- September 2009
- August 2009
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
- January 2009
- December 2008
- November 2008
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- September 2007
- August 2007
- July 2007
-
Meta


If there’s any other unfortunates like me browsing this page trying to get the Accordion skin to work well with the flex4, here comes a solution to set also a customized label skin:
First of all, set a creationComplete handler, in the skin class definition:
creationComplete=”onCreationComplete(event)”
After that, just add this script tag, with some magic code to get a reference of the original mx component:
After that you can access the properties of your original mx component like this:
This solution is just a complement to the article above, and is not a beautiful one. Hope that in the future someone come with a better and easier solution for this issue.
If there’s any other unfortunates like me browsing this page trying to get the Accordion skin to work well with the flex4, here comes a solution to set also a customized label skin:
First of all, set a creationComplete handler, in the skin class definition:
creationComplete=”onCreationComplete(event)”
After that, just add this script tag, with some magic code to get a reference of the original mx component:
After that you can access the properties of your original mx component like this:
This solution is just a complement to the article above, and is not a beautiful one. Hope that in the future someone come with a better and easier solution for this issue.
Shit, I can’t past the flex code here… the system keeps stripping my code….
This, should be placed inside a fx:Script tag….
import mx.events.FlexEvent; [Bindable] public var __parent:*; protected function onCreationComplete(event:FlexEvent):void{ //Get a reference to the "hostComponent", needed to be used like this //because I couldn't make the metadata hostComponent work for the mx:VBox component __parent = this["parent"]; //Hide the original label of flex component __parent.getChildAt(0).visible = false; }and after that you can use the __parent variable to access the information of the original mx component, just like the hostComponent should work…
In my example I set the first child to false, to hide the original label of mx component… then you should specify another label element and you can retrieve the string value like this:
text=”{__parent.label}”
If you want to make your header a flat gradient, and not use the highlights, my assumption would be that you could simple comment out the other fill layers and just use layer 3 (changing the gradient fill colors accordinly).
But when I do this, I get a strange shift in color where the colors look much darker than the values I’m putting in. This is probably my ignorance of the skinning framework (maybe the baseLayer attribute is somehow modifying the colors I enter).
Any thoughts on trying to do a flat gradient for the header.
As always, thanks for this immensely helpful site.
Daniel McQ
…and as usual the answer is pretty obvious on second glance: commenting out the
useBaseColor = true;
line allows level3 to show unmodified colors.
DMcQ
i have a question…
i want to switch between 2 or more stlyes , can i use a function to change directly the css file??
thanks.
@AlCapone,
Sure, I’d just create an ActionScript function which sets the
headerStyleNamestyle to whatever whichever custom style you want. Basically make 2-3+ custom selectors and specify the custom Accordion header skin you want to use:And then create some ActionScript functions to set the
headerStyleNameto whichever CSS selector you want:You could probably clean up that code significantly, but it may help get you started.
Peter
Could you please direct on how we change the accordian header text color in Flex4 skinng. I tried to add
this label component and it doesn’t seem to be working.Thanks in advance.
@Priya,
Not sure what you’re trying to do with skinning, but can’t you just set the
headerStyleNamestyle on the Accordion and set thecolorstyle there?Peter
i meant to say <s:Label id=”labelDisplay” color=”#FFFFFF” >
could you please let me know ,how can I apply a gradient colors to the “contentbackgroundColor” property?
@Priya,
You would need to create a custom skin. By default the
contentBackgroundColorstyle does not support gradients, only solid colors.Peter
Hi. How can I change the size or the position of the header text in your example???
Hi peter,
can we maintain the text color for all states of Accordion Header?
currently i set the
.headerStyle{
color : ’0xFFFFFF’;
text-roll-over-color : ’0xFFFFFF’;
text-selected-color: ’0xFFFFFF’;
}
Bur on down or over state text color is black.
Thanks