1. März 2008

Adobe Flex :: Skins, Styles und Themes - eine erste Einführung

Adobe Flex :: Skins, Styles und Themes - eine erste Einführung

Inhalt

Dieser Beitrag soll zeigen wie mit einfachen, meist bereits schon aus der CSS/HTML-Welt bekannten (Bord-)Mitteln, eine Flexapplikation einfach und schnell bezüglich Aussehen an individuelle Bedürfnisse (wie z.B. CI Vorgaben) angepasst werden kann.

Zielsetzung

Dabei handelt es sich lediglich um eine Aufwärmrunde um zu zeigen dass Flex-Applikationen auch ohne grossen Aufwand nicht dazu verdammt sind auf den ersten Blick als Flex-Applikation erkennbar zu sein und sich wie ein Ei dem anderen zu gleichen.

TagCloud

Skin, Theme, Style, SWC, Skinning, Transparenz, Filter, visuelle Effekte, CSS, Flex Style Eplorer, Style Tags, mx:Style, mx:Style, 

Begriffe

Skin

Das Aussehen von Flex Komponenten wird im Endeffekt durch grafische Bilder für Ecken, Kanten, Füllungen, etc. und visuelle Effekte wie Transparenz, Filter, etc definiert. Die Summe dieser grafischen Elemente und Effekte nennt man Skin.

Style

Styles sind was ähnliches wie CSS. Flex Styles folgen der CSS 2.0 Syntax und unterstützen viele der bekannten CSS Style Eigenschaften.

Theme

Ein "Theme" ist im Wesentlichen eine Sammlung von Styles, grafischen Elementen (z.B. Bilder) und Skins.

Ein Theme wird hauptsächlich dazu verwendet, alle die oben erwähnten Dateien eines Themes (obwohl ein Theme auch in Form einzelner Dateien verwendet werden kann) in ein eiziges Packet zu packen, um die Versionierung, Installation und Distribution eines Themes zu erleichtern. Dieses Theme-Packet hat das Format *.swc (SWC wird ausgesprochen als "swick," und ist eine Art JAR/ZIP-ähnliches archiv format for Flash)

Bordmittel

"Halo" themeColor Eigenschaft anpassen

Flex verwendet standardmässig das Theme "Halo". Dieses Theme hat eine Eigenschaft "themeColor" die wie folgt auf die Werte

  • haloSilver
  • haloGreen
  • haloBlue (standard)
  • haloOrange

verändert werden kann:

Um das ThemeColor auf Applikationsstufe zu verändern muss die Eigenschaft themeColor im mx:Application Tag der Hauptapplikation wie folgt angegeben werden:

    

    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" themeColor="haloOrange">

 

Das lässt sich natürlich auch auf Komponentenstufe wie folgt wiederholen: 

 

    <mx:Button label="My Button" themeColor="haloGreen">

Theme auswechseln

Viel dramatischer wird die Geschichte wenn wir nicht nur die Farbe des Standard "Halo" Themes auswechseln sondern das ganze Theme als solches - und das geht so:

Flex bietet im Verzeichnis "flex builder root>\Flex SDK 2\frameworks\themes" die folgenden Themes zur Auswahl:

  • Halo (the default, embedded in the framework.swc)
  • HaloClassic (haloclassic.swc)
  • Ice (Ice.css)
  • Institutional (Institutional.css)
  • Wooden (Wooden.css)
  • Smoke (Smoke.css)

Um Flex zu veranlassen eines dieser Themes an Stelle des Standard "Halo" Theme zu laden gehen sie wie folgt vor:

Oeffnen sie das betreffende Projekt im FlexBuilder

  1. Klicken sie im Flex Navigator mit der RECHTEN Maustaste auf ihr aktuelles Projekt-verzeichnis und wählen sie dort den Eintrag "Properties".
  2. Im Fenster "Properties for ..." wählen sie nun die Option "Flex Compiler".
  3. Im Feld "additional compiler arguments:" geben sie nun ZUSAETZLICH zu den bereits dort vorhandenen Argumenten folgendes ein:

     -theme "C:\Program Files\Adobe\Flex Builder 2\Flex SDK 2\frameworks\themes\Smoke.css"
  4. Wenn sie nun die Applikation neu compilieren wird sie mit dem Theme "Smoke" dargestellt

Styling

Styles können in Flex auf 3 Arten verändert werden: Inline, Style-Tag oder StyleSheet

1. Möglichkeit :: Inline Styles

InlineStyles sind als Attribute der jeweiligen Komponententags anzugeben wie z.B.

 

    <mx:Text fontFamily="Tahoma" fontSize="18"/>

 

Die zweite Möglichkeit ist die Verwendung von <mx:Style> Tags in der jeweiligen mxml Datei wie folgt:

2. Möglichkeit :: <mx:Style Tags>

<mx:Style>
  
TextInput
     {
       font-family:Tahoma;
       font-size: 14px;
       color:#FF9900;
     }


  
.myStyle
     {
       font-family:Verdana;
       font-size:18px;
       color:#CC0000;
     }
</mx:Style>


<mx:
TextInput text="use type definition"/>
<mx:
TextInput text="use class definition" styleName="myStyle"/>

 

Tip Flex Style Explorer:

Obwohl man natürlich auch direkt mit der aktuellen Applikation experimentieren kann (Alle CSS Style Eigenschaften sind ausführlich in der Flex Dokumentation aufgeführt) geht es mit dem Flex Style Explorer viel komfortabler. Diesen findet man auf der FlexBuilder StartSeite (klicken sie im FlexBuilder auf Hilfe-->Flex Start Page). Er erlaubt es ihnen interaktiv Style Definitionen zu erstelln, welche sie dann mit cut and paste in ihre Applikation übertragen können.

3. Möglichkeit ::Stylesheets

Analog zur CSS-Welt definieren sie alle ihre Styles in einer externen *.css Datei welche sie dann in ihrer Applikation wie folgt referenzieren:

 

    <mx:Style source="/path/to/your/stylesheet.css"/>

 

Skinning

Im Wesentlichen gibt es zwei Arten um Skins zu erstellen: Grafik und/oder Programmierung. Ausserdem ist zu Berücksichtigen dass die Skins je nach Zustand (Mouse over, mouse down, disabled, selected, ...) unterscheiden, resp. für jeden Zustand des zu skinnenden Objekts separate Skins entworfen und mit dem Objekt assoziert werden müssen.

Grafische Skins

Bei grafischen Skins geht es im Wesentlichen um die Verwendung von JPEG, GIF oder PNG formattierten Grafiken im Zusammenhang mit den folgenden CSS Eigenschaften

  • disabledSkin
  • downSkin (mouse down)
  • overSkin (mouse over)
  • upSkin (mouse not over)
  • selectedDisabledSkin
  • selectedDownSkin
  • selectedUpSkin
  • selectedOverSkin

Dabei berücksichtigt Flex auch die Transparenz (Alpha Kanal) aller gängigen Grafikformate.

 

Beispiel:

Um einen Button grafisch zu skinnen gehen sie wie folgt vor:

Erstellen sie zum Beispiel in Photoshop je eine Grafik für die Zustände "mouseOver", "mouseDown" und "mouseUp" und testen sie das Resultat zum Beispiel mit folgendem Inline Code:

 

<mx:Button label="My Skinned Button"

overSkin="@Embed('button_over.png')"
downSkin="@Embed('button_down.png')"
upSkin="@Embed('button_up.png')"/>

 

Um den Pfadnamen der jeweiligen SkinDateien nicht über den ganzen Code verstreut zu haben empfielt es sich diese zentral in einem Codeblock zu managen:

 

<mx:Script>
<![CDATA[
[Embed(source="button_over.png")]
[Bindable]
public var buttonOver:Class;
[Embed(source="button_down.png")]
[Bindable]
public var buttonDown:Class;
[Embed(source="button_up.png")]
[Bindable]
public var buttonUp:Class;
]]>
</mx:Script>

<mx:Button label="My Skinned Button" overSkin="{buttonOver}" downSkin="{buttonDown}" upSkin="{buttonUp}"/>

 

oder noch besser diese in einer CSS-Datei zu verstecken:

 

<mx:Style>
   .skinnedButton
{
     overSkin: Embed(source="button_over.png");
     downSkin: Embed(source="button_down.png");
upSkin: Embed(source="button_up.png");
}
</mx:Style>

<mx:Button label="Skin Class" styleName="skinnedButton"/>

9-Scale Skalierung

Das Problem bei grafischen Skins ist natürlich die Skalierung welches aber pragmatisch durch die von Flex gebotene Möglichkeit der 9-Scale Skalierung relativ einfach entschärft werden kann in dem - wie im folgenden gezeigt - bei jeder Grafik eine "Zone" definiert werden kann worauf sich die Skalierung aussschliesslich bescränken soll ohne dabei die Ränder zu verändern.

 

[Embed(source="button_over.png",scaleGridTop="18",scaleGridBottom="31",scaleGridLeft="8",scaleGridRight="158")]

 

none nur horizontal no
nur vertikal Skalierungszone wird horizontal und vertikal skaliert nur vertikal
none nur horizontal no

Schlussbemerkung

Mit diesen Beispielen ist das Thema natürlich noch längst nicht abgeschlossen. Weiterführende Themen wie z.B. programmierte Skins sind aber nicht mehr so ganz trivial und nur für erfahrene Programmierer zu empfehlen. Ausserdem wurden die folgenden Themen hier NICHT behandelt - Erstellen von Theme Dateien - Vererbung von Styles - Verwendung von SWF-Dateien für Skins etc.

22. Januar 2008

Why is design of applications so important?

Modern management gurus tell you that design is one of the (and maybe THE) most important element in getting competitive advantage in today's world markets. This applies to your online services like your internet sales application ans your internal applications as well. Besides beeing very fast, flexible, easy to understand, your business applications MUST be well designed to get most out of your brand, culture and inner motivation. Especially for occasional users, it is important that you message on quality, actuality, reliability and coolness is linked to your brand as this will become the key factor for generating higher demand and brand recognition. But last but not least for your internal users, a good design increases efficiency and leads to higher acceptance and "felt" succuess. This is especially important in CRM applications where the benefit for the user is more on the long term. Thats why my we combine world-class design possibilities with world-class backend solutions. In Concrete this means we link Adobe Flex with 'webservices' loke mySAP CRM. We think, that using Flex as the "front-end" technology is currently the best solution for a design that doesn't compromise on functionality, maintainability or robusteness, portability and future readiness. Key benefits are:

  • Unlimited UI possibilities
  • As there will be no change to your current backend solution (Mainframe or .NET application you can develop and test our new front-end in parallel to your life systems.
  • Consolidate data from different sources (internal, external, new and legacy) into a single front-end user experience
  • Improve the "felt" coolness and acceptance of you existing applications without changing workflow and best practices.

16. Januar 2008

Abgeshene davon dass das Nokia N810 auch generell ein ziemlich geniales Stück Technologie ist, glänzt es vor allem durch die Unterstützung des Flash Player 9. Damit lassen sich nun all unsere AIR/Flex Applikationen wie zum Beispiel der ProjectAlizer mit im Hosensack rumtragen !¨

Keep-generated-actionscript

When you compile an mxml application, all your mxml is first converted to actionscript and then this actionscript is further compiled into a SWF. You can see this generated actionscript to learn the flex framework in depth using the flex compiler flag -keep-generated-actionscript. To set this flag in Flex Builder right click to open the project Properties, select Flex Compiler, and add -keep-generated-actionscript to the Additional compiler arguments. Now rebuild the project and you will see a new folder called ‘generated’ that appears and has all the generated code

14. Januar 2008

Flex :: CDATA-Block generieren

Um in einem *.mxml file einen leeren CodeBlock zu generieren genügt es einfach das Script Flag hinzuschreiben . Mit dem Klicken der Entertaste wird der ganze rest automatisch generiert: