Hier ein kurzes Beispiel, wie man Buttons mit Degrafa gestalten kann. Das Ergebnis ist ein Button im iPhone-Stil mit Glaseffekt. Das Beispiel wurde in Flex erstellt und zeigt, wie man ein Skin für eine Schaltfläche anlegt.

Applikation und Stylesheet

Die Hauptanwendung platziert lediglich einen Button, der auf der Bühne dargestellt wird.

XML:
  1. ... 
  2.     :Style source="style.css"/>
  3.        
  4.     :Button id="loaderButton" label="Demo"
  5.         verticalCenter="0" horizontalCenter="0"
  6.         height="100" width="200" />
  7.                
  8. :Application>

Außerdem wird in der Anwendung ein CSS-Stylesheet integriert. Dieses sorgt dafür, dass für alle Komponenten des Typs Button die Eigenschaft skin auf die Klasse skins.MySkin referenziert. Dadurch wird das Aussehen festgelegt.

XML:
  1. Button {
  2.     skin:               ClassReference('skins.MySkin');
  3.     ...
  4. }

Degrafa: Gestaltung des Buttons

Im Unterverzeichnis "skins" liegt die Klasse MySkin (deshalb auch skins.MySkin im Stylesheet). Hier kommt nun Degrafa zum Einsatz.

Zu Beginn werden vier Füllungen festgelegt. Die ersten drei Farbverläufe sind für die Buttonzustände "normal" (Up), "Mouseover" (Over) und "gedrückt" (Down). Diese unterscheiden sich durch ihre Grundfarbe. Der vierte Farbverlauf ist ein weißes Rechtecks, das in jedem Buttonzustand als Fülleffekt für den Glanzreflex genutzt wird.

Danach werden die verschiedenen Buttonzustände definiert und gezeichnet. Dabei wird jeweils der eigentliche Button und der Glanzeffekt in Form eines RoundedRectangleComplex verwendet.

Zuletzt wird noch ein Glow-Filter als Effekt eingesetzt.

Demo

Zuerst das Degrafa-Beispiel zum Anschauen:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2.     xmlns:mx="http://www.adobe.com/2006/mxml" 
  3.     xmlns="http://www.degrafa.com/2007"
  4.     xmlns:filters="flash.filters.*"
  5.     >
  6.     :Script>
  7.        
  8.             [Bindable]
  9.             private var awidth:Number=0;
  10.            
  11.             [Bindable]
  12.             private var aheight:Number=0;
  13.                    
  14.             override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{               
  15.                 super.updateDisplayList(unscaledWidth, unscaledHeight);
  16.                 awidth = unscaledWidth;
  17.                 aheight = unscaledHeight;         
  18.             }
  19.         ]]>
  20.     :Script>
  21.  
  22.      
  23.     >
  24.        
  25.          id="schwarzerGradient" angle="90">
  26.             color="#000000" alpha="1"/>
  27.             color="#222222" alpha="1"/>
  28.         >
  29.        
  30.        
  31.          id="roterGradient" angle="90">
  32.             color="#720205" alpha="1"/>
  33.             color="#4C0002" alpha="1"/>
  34.         >   
  35.        
  36.        
  37.          id="blauerGradient" angle="90">
  38.             color="#004460" alpha="1"/>
  39.             color="#002F44" alpha="1"/>
  40.         >         
  41.            
  42.          
  43.          id="shine" angle="90">
  44.             color="#FFFFFF" alpha=".6"/>
  45.             color="#FFFFFF" alpha=".3"/>
  46.         >      
  47.     >
  48.    
  49.    
  50.     >
  51.        
  52.         state="upSkin">
  53.            
  54.            
  55.                 id="mainRect"
  56.                 topLeftRadius="11" topRightRadius="11"  bottomLeftRadius="11" bottomRightRadius="11"
  57.                 fill="{schwarzerGradient}"
  58.                 height="{aheight}" width="{awidth}"/>
  59.                
  60.              
  61.            
  62.                 topLeftRadius="11" topRightRadius="11" bottomLeftRadius="6" bottomRightRadius="6"
  63.                 fill="{ shine }"
  64.                 x="1"   y="1" height="{ mainRect.height/2 }"  width="{awidth - 2}"/>
  65.         >
  66.  
  67.            
  68.         state="overSkin">
  69.            
  70.                 topLeftRadius="11" topRightRadius="11"  bottomLeftRadius="11" bottomRightRadius="11"
  71.                 fill="{roterGradient}"
  72.                 height="{aheight}" width="{awidth}"/>
  73.                
  74.              
  75.            
  76.                 topLeftRadius="11" topRightRadius="11" bottomLeftRadius="6" bottomRightRadius="6"
  77.                 fill="{ shine }"
  78.                 x="1"   y="1" height="{ mainRect.height/2 }"  width="{awidth - 2}"/>
  79.         >
  80.        
  81.                
  82.         state="downSkin">
  83.            
  84.                 topLeftRadius="11" topRightRadius="11" bottomLeftRadius="11" bottomRightRadius="11"
  85.                 fill="{blauerGradient}"
  86.                 height="{aheight}"
  87.                 width="{awidth}"/>
  88.              
  89.            
  90.                 topLeftRadius="11" topRightRadius="11" bottomLeftRadius="6" bottomRightRadius="6"
  91.                 fill="{ shine }"
  92.                 x="1"   y="1" height="{ mainRect.height/2 }"  width="{awidth - 2}"/>
  93.         > 
  94.     >
  95.    
  96.    
  97.     >
  98.         :GlowFilter
  99.             color="#FFFFFF"
  100.             alpha=".5"
  101.             blurX="10"
  102.             blurY="10"/>
  103.     > 
  104. >

Das Beispiel basiert auf einer Demonstration von Juan Sanchez, das auf dieser Degrafa-Webseite zu finden ist.

Download: Quelldateien (.zip)