Aufbauend auf dem Artikel Button-Skinning mit Flex 4 folgt ein Beispiel-Button mit animierten Übergängen.

Im Normalzustand ist der Button klein und man sieht nur ein Icon. Fährt man mit der Maus über die Schaltfläche, wird sie breiter und die Beschriftung erscheint.

Neben den Übergangsanimationen wird auch gezeigt, wie man einzelne Grafiken/Elemente gezielt nur in bestimmten States anzeigen oder ausschließen lassen kann.

Get Adobe Flash player

Unterschiedliche Breite

Damit der Button im Normalzustand klein und zusammengeschoben ist, wird die Breite des Rechtecks zweimal definiert. Zum einen mit 100% für alle Zustände, zum anderen speziell für den Normalzustand mit 50 Pixeln Breite.

XML:
  1. :Rect width="100%" width.up="50" height="100%" id="myButtonRect">

Icon

Das Icon ist eine Bitmap-Grafik, die auf die gewünschte Größe skaliert wird. Außerdem wird über smooth die Darstellungsqualität der skalierten Grafik verbessert.

XML:
  1. :BitmapImage source="@Embed('icon.png')"
  2.         resizeMode="scale" width="36" height="36" top="5" left="5"
  3.         smooth="true"
  4.         />

includeIn und excludeFrom

Die Beschriftung des Buttons soll nur im Mouseover- und Gedrückt-Zustand des Buttons zu sehen sein. Dies lässt sich ganz einfach mit excludeFrom erreichen. Dadurch können einzelne States ausgeschlossen werden, das Element ist dann darin nicht sichtbar.

XML:
  1. :SimpleText ... excludeFrom="up"

Das Pendant wäre übrigens includeIn, wodurch man Elemente nur in einzelnen States einblenden kann.

XML:
  1. :SimpleText ... includeIn="over"

Transitions

Im Skin kommt ein neuer Abschnitt s:transitions hinzu, der für alle Übergänge zwischen den Zuständen des Buttons sorgt. Darin werden über s:Transition Übergangsanimationen festgelegt.

Der folgende Beispielcode zeigt den Übergang vom Normalzustand (up) zum Mouseover-Zustand (over). Die Resize-Animation wird auf das Objekt myButtonRect angewendet, also das grüne Rechteck des Buttons. Das Rechteck wird dabei von 50 Pixel auf die normale Breite des Buttons vergrößert. Die normale Breite ist die, die in der Haupt-MXML-Datei definiert ist. Der Zugriff erfolgt mit hostComponent.width.

Hinweis: Auf diese Weise könnte man auch die Buttonbeschriftung sanft einblenden. Im Beispiel erscheint es direkt, weil ich die Eigenschaften includeIn/excludeFrom demonstrieren wollte ...

XML:
  1. :transitions>
  2.     :Transition fromState="up" toState="over">
  3.             :Resize target="{myButtonRect}" widthFrom="50" widthTo="{hostComponent.width}" duration="200"/>   
  4.     :Transition>
  5.     ... 
  6. :transitions>

Quellcode

Hier das komplette Skin am Stück:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. :Skin name="CustomButtonSkin"
  3.     xmlns="http://ns.adobe.com/mxml/2009"
  4.     xmlns:s="library://ns.adobe.com/flex/spark"
  5.     >
  6.     :states>
  7.         :State name="up" />
  8.         :State name="over" />
  9.         :State name="down" />
  10.         :State name="disabled" />
  11.     :states>
  12.     >
  13.         [HostComponent("spark.components.Button")]
  14.     >
  15.    
  16.     :transitions>
  17.         :Transition fromState="up" toState="over">
  18.                 :Resize target="{myButtonRect}" widthFrom="50" widthTo="{hostComponent.width}" duration="200"/>      
  19.         :Transition>
  20.  
  21.         :Transition fromState="over" toState="up">
  22.                 :Resize target="{myButtonRect}" widthTo="50" duration="200"/>  
  23.         :Transition>    
  24.     :transitions>    
  25.    
  26.    
  27.         :Rect width="100%" width.up="50" height="100%" id="myButtonRect">
  28.             :fill>
  29.                 :LinearGradient rotation="-90">
  30.                     :GradientEntry color="#57a915" />
  31.                     :GradientEntry color="#a5d13f" />
  32.                 :LinearGradient> 
  33.             :fill>
  34.             :stroke>
  35.                 :SolidColorStroke weight="1" color="#5F7205" alpha="0.63" />
  36.             :stroke>
  37.         :Rect>
  38.            
  39.                    
  40.         :SimpleText id="labelElement" excludeFrom="up"
  41.              color="0x000000" color.down="0xffffff"
  42.              verticalAlign="middle"  horizontalCenter="0" verticalCenter="1"
  43.              left="100" right="10" top="2" bottom="2"
  44.             fontFamily="Arial"
  45.             fontWeight="bold"
  46.             fontSize="24"         
  47.             >
  48.         :SimpleText>
  49.        
  50.     :BitmapImage source="@Embed('icon.png')"
  51.             resizeMode="scale" width="36" height="36" top="5" left="5"
  52.             smooth="true"
  53.             />     
  54.        
  55.         :filters>
  56.             :DropShadowFilter color="0x000000" blurX="5" blurY="5" distance="1" angle="90" alpha="0.3"  />
  57.             :DropShadowFilter color="0x000000" blurX="2" blurY="2" distance="0" angle="120" alpha="0.27" inner="true"  /> 
  58.         :filters>   
  59. :Skin>