Googolflex!!
  • Home
  • About
  • Contracting

Recent Posts

  • Sprint’s new “Simply ‘Almost’ Everything®” Plans
  • CSS Changes in Flex 4
  • Dotted Underline LinkButton (Flex)

About The Author : jwd

This is John Dusbabek's tech blog. John is a software engineer and Flex developer in Provo, UT, where he lives with his lovely wife and four sons.

Recent Comments

  • Nikos on Flex: Binding to an Interface
  • Iain Hosking on Apache mod_proxy_balancer: No Protocol handler was valid

Archive for skins

Aug
17

Extending the SkinnableComponent (well, sort of)

Posted by: jwd | Comments (0)

I won’t exactly be extending a SkinnableComponent in this post, I’ll be extending the Button (which extends SkinnableComponent) and creating a few new skins for it. Extending the SkinnableComponent is almost identical to extending the SkinnableContainer (see my previous post). You won’t need the contentGroup, of course.

I wanted to illustrate the power of Flex’s new skinnable architecture when combined with states.

Specifically I will show:
1. How easy it is to create multiple skins for the same class.
2. How easy it is to change skins at runtime via states.

For my collapsible panel, I need a button. All in all the button has 8 possible states: for each of the two expanded or collapsed states of the container, there are the 4 possible button states (up, down, over, disabled). Rather than suffer the madness of creating a skin with 8 possible states and the button class to manage them, I’m going to create two skins (one for expanded, one for collapsed), each which use the 4 standard button states.

I’ll include the full code for the CollapseButtonSkin, (which extends Skin). The code for ExpandButtonSkin is almost identical, except for the image names. The most important thing to note, is how I change the source of the Image using the new state syntax. I’ll be using that same syntax later in my panel.

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
	xmlns:s="library://ns.adobe.com/flex/spark"
	xmlns:mx="library://ns.adobe.com/flex/halo"
	minWidth="12" minHeight="12" alpha.disabled="0.5">

	<!-- host component -->
	<fx:Metadata>
		[HostComponent("com.googolflex.gflib.controls.ExpandCollapseButton")]
	</fx:Metadata>

	<!-- states -->
	<s:states>
		<s:State name="up" />
		<s:State name="over" />
		<s:State name="down" />
		<s:State name="disabled" />
	</s:states>

	<mx:Image
		source.down="@Embed('../assets/collapse_panel/collapse_down.png')"
		source.over="@Embed('../assets/collapse_panel/collapse_over.png')"
		source.up="@Embed('../assets/collapse_panel/collapse.png')"
		source.disabled="@Embed('../assets/collapse_panel/collapse_over.png')" />
</s:Skin>

I didn’t do anything special in the ExpandCollapseButton class, I just extended Button (which contains the code to change between the up, down, over, and disabled states).

When I add my button to the QuickCollapsePanelSkin class, I specify a skinClass for each of my two panel states. When the state of the component changes, the button skins (which in turn have their own states) will be updated automatically. Here is the code:

<controls:ExpandCollapseButton
	width="12" height="12"
	top="{(SimpleQuickCollapsePanel(hostComponent).headerHeight - 12) / 2}"
	left="4"
	skinClass.collapsed="com.googolflex.gflib.skins.ExpandButtonSkin"
	skinClass.expanded="com.googolflex.gflib.skins.CollapseButtonSkin"
	click="SimpleQuickCollapsePanel(hostComponent).toggleExpanded()" />

You can download the full source for this example here: simple_collapsible_panel.zip

Categories : Actionscript, Flex 4, Flex Components
Comments (0)
Aug
17

Extending the SkinnableContainer (attempt 1)

Posted by: jwd | Comments (0)

I’ve just created my first Flex 4 component, and loved doing it. It’s not entirely finished, but I wanted to share what I learned for those who may follow after me.

In the component proper, some things to remember:

1. Extend SkinnableContainer.

2. Declare the skin states using metadata brackets. In my case:

[SkinState("collapsed")][SkinState("expanded")]

3. Override getCurrentSkinState() to return one of the strings declared in #2, based on component state.

override protected function getCurrentSkinState() : String { if (expanded)  return "expanded"; else  return "collapsed";}

4. Call invalidateSkinState(), if necessary. Possibly done in setters or in commitProperties()

In the skin class, some things to remember:

1. Extend the SkinnableContainerSkin.

2. Declare the host component, the component you are skinning. Done as follows, using metadata tags:

<fx:Metadata>
[HostComponent("com.googolflex.gflib.containers.SimpleQuickCollapsePanel")]
</fx:Metadata>

If you need to access any properties of the extended class, ie SkinnableContainer you can do so by using the hostComponent variable. When I wanted to access members specific to my HostComponent, I had to cast hostComponent to a SimpleQuickCollapsePanel.

3. Declare the states of your skin. This may be done as follows:

<default:states>
  <mx:State name="collapsed">
  <mx:State name="expanded">
</default:states>

4. Draw your layers or add your images to the skin as necessary. Reference your states, or hostComponent as necessary.

5. In the case of the SkinnableContainer you’ll want to make sure you add the container for its children. You can supply whatever layout you need, and can even change it based on state. It needs to be called contentGroup, however.

Here’s an example of how I did it:

<s:Group id="contentGroup"
  left="3" right="3"
  top="{SimpleQuickCollapsePanel(hostComponent).headerHeight+3}"
  bottom="3"
  visible="{SimpleQuickCollapsePanel(hostComponent).expanded}">
  <s:layout>
    <s:VerticalLayout />
  </s:layout>
</s:Group>

I’ll be including the full source for my QuickCollapsePanel in my next post, where I describe extending the SkinnableComponent.

Update: In the most recent SDK release, the spark.skins.default package has been changed to the spark.skins.spark package. This affects the SkinnableContainerSkin class.

Stay tuned for the next update, when Adobe changes it to the spark.skins.spark.skins package…

Categories : Actionscript, Flex 4, Flex Components
Comments (0)

Search

Feedburner

Subscribe to

Get the latest updates delivered via email

Calendar

September 2010
M T W T F S S
« Jul    
 12345
6789101112
13141516171819
20212223242526
27282930  

Archives

  • July 2010 (1)
  • June 2010 (2)
  • May 2010 (1)
  • February 2010 (11)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (1)
  • August 2009 (8)
  • July 2009 (8)
  • May 2009 (4)
  • April 2009 (1)
  • March 2009 (6)
  • January 2009 (1)
  • November 2008 (4)
  • October 2008 (5)
  • September 2008 (1)
  • August 2008 (5)
  • July 2008 (1)
  • June 2008 (2)
  • May 2008 (8)
  • April 2008 (5)
  • March 2008 (2)
  • February 2008 (3)
  • January 2008 (1)
  • December 2007 (6)
  • November 2007 (9)
  • October 2007 (1)
  • September 2007 (2)

Categories

Tag Cloud

adobe apache Architecture book review C++ centos client server architecture Custom Components database Design error message fedora flash catalyst flex Flex 3 Flex 4 fms iis 6 Interaction Design load balancing master-master master-slave mod_proxy_balancer Monkey Patching MySQL no protocol p2p peer to peer Perl PHP Red5 regex replication self registration selinux Shell Scripting shortcut manager skins socket policy file sockets states stored procedures stratus tools workflow

Coworkers

  • Casey Jackman
  • Sean Murphy

Family

  • Emily & CJ
  • Family Blog
  • Gary Dusbabek

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

RSS FlexExamples

  • Styling the text selection format on a Spark TextArea control in Flex 4
  • Setting the scale mode on a Spark Image control in Flex Hero
  • Setting the fill mode on a Spark Image control in Flex Hero
  • Setting a bitmap image fill on a Spark Form container in Flex Hero
  • Setting a bitmap image fill on a Spark FormHeading control in Flex Hero

Spam Blocked

847 spam comments
blocked by
Akismet

Sponsored Links

JUICE Chat

BYU Adobe Users Group


Copyright © 2010 All Rights Reserved
Flexx Theme by iThemes
Powered by WordPress