Heute geht es um das Skinning von Buttons in Flex 4. Dabei wird anschaulich deutlich, wie einfach und leistungsfähig die Skinning-Architektur der Spark-Komponenten aufgebaut ist.

Die prinzipielle Vorgehensweise ist vergleichbar der beim Skinning einer Spark-Applikation: Man legt eine neue Klasse mithilfe einer MXML-Datei an, die das Aussehen des Buttons festlegt. Diese Skinklasse ordnet man dem Button zu.

Klasse für das Skinning zuweisen

Zuerst weist man dem Button über skinClass eine Klasse zu. Hier im Beispiel ist es skin.SkinButton, also die MXML-Datei SkinButton.mxml im Unterverzeichnis skin.

Ganz einfach geht dies in MXML:

Etwas mehr Schreibarbeit fällt an, wenn man es alternativ mithilfe eines Stylesheets machen würde. Hier der Style, damit alle Buttons das individuelle Skin erhalten:

XML:
  1. :Style>
  2.         @namespace s "library://ns.adobe.com/flex/spark";
  3.         @namespace mx "library://ns.adobe.com/flex/halo";      
  4.       
  5.          s|Button {  
  6.             skinClass: ClassReference("skin.SkinButton");
  7.          }      
  8.     :Style>

Skin für den Button erstellen

Jetzt muss man die Datei skins/SkinButton.mxml mit Inhalt füllen.

Wichtig ist, zuallererst die Definition der Zustände zu deklarieren, die der Button annehmen kann. Diese sind disabled (deaktiviert), up (normal), down (gedrückt) und over (Rollover).

XML:
  1. :states>
  2.     :State name="disabled" />
  3.     :State name="up" />
  4.     :State name="down" />
  5.     :State name="over" />                       
  6. :states>

In den Metadaten wird über HostComponent festgelegt wird, für welche Komponente dieses Skin gültig ist. In unserem Beispiel ist das Skin für Buttons gedacht.

XML:
  1. >
  2.     [HostComponent("spark.components.Button")]
  3. >

Jetzt folgt auch schon der sichtbare Teil, also das Button-Skin in Form eines Rechtecks (Rect) mit Kontur (Stroke) und dem Label.

XML:
  1. :Rect width="100%" height="100%" radiusX="20" radiusY="20">
  2.         :fill>
  3.             :SolidColor
  4.                 color.up="0xFF0008"
  5.                 color.over="0x90C608"
  6.                 color.down="0x18CDFE"
  7.                 />
  8.         :fill>
  9.  
  10.         :stroke>
  11.             :SolidColorStroke color="0xffffff" weight="5" />
  12.         :stroke>
  13.     :Rect>
  14. :Skin>

Legt man eine Eigenschaft im MXML-Code ohne weitere Besonderheiten fest (z.B. color="0xffffff"), gilt diese für alle Zustände. Ergänzt man allerdings den gewünschten Zustand über eine Punktschreibweise (z.B. color.up für den up-State), gilt die Eigenschaft nur für diesen Zustand. Im Beispiel werden dadurch, je nach Zustand, verschiedene Farben verwendet. Man könnte auch eine andere Eigenschaften wie Breite, den Radius der Ecken oder alle anderen Eigenschaften pro Zustand einstellen.

Jetzt fehlt nur noch das Label. Dieses wird über eine SimpleText-Komponente erstellt, der man die id labelElement geben muss.

Man könnte übrigens aus dem Skin auch auf Eigenschaften der Komponte (z.B. den Labeltext) mithilfe von hostComponent.eigenschaft (z.B. hostComponent.label) zugreifen.

XML:
  1. :SimpleText top="13" left="25"
  2.     id="labelElement"
  3.     color="0xffffff"
  4.     fontFamily="Arial"
  5.     fontWeight="bold"
  6.     fontSize="24" />

Quellcode des Skins

Zum Abschluss das komplette Skin am Stück.

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. :Skin name="CustomApplicationSkin"
  3.     xmlns="http://ns.adobe.com/mxml/2009"
  4.     xmlns:s="library://ns.adobe.com/flex/spark"
  5.     >
  6.    
  7.     :states>
  8.         :State name="disabled" />
  9.         :State name="up" />
  10.         :State name="down" />
  11.         :State name="over" />                       
  12.     :states>
  13.  
  14.     >
  15.         [HostComponent("spark.components.Button")]
  16.     >
  17.    
  18.     :Rect width="100%" height="100%" radiusX="20" radiusY="20">
  19.         :fill>
  20.             :SolidColor
  21.                 color.up="0xFF0008"
  22.                 color.over="0x90C608"
  23.                 color.down="0x18CDFE"
  24.                 />
  25.         :fill>
  26.        
  27.         :stroke>
  28.             :SolidColorStroke color="0xffffff" weight="5" />
  29.         :stroke>
  30.     :Rect>
  31.  
  32.     :SimpleText top="13" left="25"
  33.         id="labelElement"
  34.         color="0xffffff"
  35.         fontFamily="Arial"
  36.         fontWeight="bold"
  37.         fontSize="24" />
  38. :Skin>