Cerinte
Pentru a putea intelege pe deplin acest tutorial sunt necesare oarecare cunostinte de CSS (cascade style-sheet), Flex, nivel de incepator si, desigur, o minte deschisa si multa vointa.
CSS poate fi descris ca o metoda de a controla modul de prezentare a unui document la nivel de formatare. De aceea, cel mai des va fi folosit pentru a controla modul in care continutul va fi afisat in pagina, stiulurile aplicate, de la tipul fontului pana la marimea ferestrelor si a bordurilor. CSS a fost adoptat in totalitate de Adobe pentru a putea controla o componenta a unei aplicatii, ori a aplicatiei la nivel global.
Majoritatea stilurilor definite intr-o aplicatie flex sunt mostenite de componentele ei, astfel se permite programatorului definirea unor reguli de stil de la cel mai intalt nivel pana la baza. Mai mult decat atat, externalizarea stilurilor ajuta la organizarea dezvoltarii unui proiect, astfel incat programatorul sa se poata ocupa de functionalitate, iar designerul sa se poata ocupa de interfata. Aceste stiluri vor fi continute de toate controalele si ferestrele din containerul principal, facand aplicatia foarte dinamica, respectand totodata principiul mostenirii definit nu numai in standardele CSS, dar si in standardele OOP.
Din nefericire, exista componente care nu pot fi accesate, si care vor trebui definite individual pentru fiecare element in parte. Astfel de caracteristici sunt: inaltimea (height) si latimea(width) care apartin unei clase de baza a componentelor, UIComponent.
Ce metode se folosesc pentru a defini stilurile in Flex?
Flex permite definirea stilurilor in 2 moduri esentiale, folosierea selectoarelor globale din CSS (
Desigur, ca si in XHTML, stilurile pot fi continute in interiorul aplicatiei, ori extern reprezentand in fapt, respectarea standardelor web 2.0.
Compilarea stiulurilor
In Flex sunt mai multe metode de a introduce definitii pentru stiuluri, ca si in CSS, este introdus in cod (inline), extern si incorporat. In acelasi timp e de retinut ca sunt caracteristici comune tuturor tagurilor (spre exemplu, tuturor etichetelor sau tuturor butoanelor unei aplicatii), si caracteristice unice, specifice (care fac referire sa zicem la o anume eticheta sau care definesc o clasa de stil ce poata fi folosita pentru anumite componente). Sa vedem un exemplu in care aplicam stiluri:
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
-
<mx:Panel title="Panou personalizat" width="400" height="400">
-
<mx:Label text="Iata o fraza pe care o putem personaliza in functie de preferinte" />
-
</mx:Panel>
-
</mx:Application>
Vom introduce stilul utilizand tagurile
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
-
<strong><mx:Styles></strong>
-
<strong></mx:Styles></strong>
-
<mx:Panel title="Panou personalizat" width="400" height="400">
-
<mx:Label text="Iata o fraza pe care o putem personaliza in functie de preferinte" />
-
</mx:Panel>
-
</mx:Application>
In aceste taguri vom introduce proprietatea pe care o definim si valoare acesteia :
-
<mx:Style>
-
<strong>Application {</strong>
-
<strong>backgroundColor: #CCCCCC;</strong>
-
<strong>}</strong>
-
</mx:Style>
Aceasta va fi o proprietatea ce va fi mostenita de toate componente aplicatiei Flex. Iata in schimb o proprietate ce nu va mai fi mostenita:
-
<mx:Style>
-
Application {
-
backgroundColor: #FFCCFF;
-
<strong>textDecoration: underline;</strong>
-
}
-
</mx:Style>
Proprietatea textDecoration nu va fi mostenita in nici un fel, de-a lungul ierarhiei aplicatiei. Pentru a o mosteni la nivelul tuturor componentelor aplicatiei folosim selectorul global:
-
<mx:Style>
-
global {
-
fontFamily:'Trebuchet';
-
fontSize:14px;
-
textDecoration: underline;
-
fontWeight: bold;
-
fontStyle: italic;
-
}
-
Application {
-
textDecoration: underline;
-
backgroundColor: #FFCCFF;
-
}
-
</mx:Style>
O lista completa a selectorilor pentru fiecare dintre componentele unei aplicatii Flex poate fi vazuta aici.
Folosirea Actionscript pentru a defini stilurile
Un alt mod de a defini selectori globali in interiorul unei aplicatii flex este prin intermediul pachetului mx.styles.StyleManager ce va trebui chemat la inceputul scriptului pentru a putea folosi aceasta clasa.
Cu ajutorul metodei getStyleDeclaration(selector:Style) se va putea identifica proprietatea tipului de interfata pe care il setam (buton, panouri, text, etc). Pentru a putea seta aceasta proprietate ce ne intereseaza, vom utiliza metoda setStyle().
Iata un exemplu de folosire a clasei styleManager.
StyleManager.getStyleDeclaration(global).setStyle(fontSize, 12);
Vom pune accent pe codul folosit pentru a defini aceste caracteristici, introdus in aplicatie in interiorul tagurilor
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
-
<mx:Script>
-
<![CDATA[
-
import mx.styles.StyleManager;
-
private function initiazaStil():void {
-
// stilul global se va aplica la toate controalele din aplicatie
-
StyleManager.getStyleDeclaration("global").setStyle("fontSize",12);
-
StyleManager.getStyleDeclaration("global").setStyle("fontStyle","italic");
-
StyleManager.getStyleDeclaration("global").setStyle("fontWeight","bold");
-
StyleManager.getStyleDeclaration("global").setStyle("textDecoration", "underline");
-
StyleManager.getStyleDeclaration("global").setStyle("fontFamily","Arial");
-
}
-
]]>
-
</mx:Script>
-
<mx:Panel title="Folosirea clase styleManager din ActionScript">
-
<mx:Label text="Tex de incercare a stilurilore globale" />
-
</mx:Panel>
-
</mx:Application>
Am definit mai sus functia initiazaStil() care va seta toate proprietatile globale ce ne intereseaza, iar pentru a putea chema aceasta functie ne vom folosi de evenimentul de sistem creationComplete() ce va fi chemat la inceputul aplicatiei. Iata cum vor deveni declaratiile aplicatiei:
Pentru cazul in care vom incarca un stil extern, este necesar sa-l aplicam aplicatiei inainte de initializarea acesteia, dar mai ales va trebui sa suprascriem getter-setter-ul aplicatie pentru ca aceasta sa nu porneasca inainte de aplicarea stilului incarcat.
Iata un exemplu:
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" preinitialize="loadStyle()">
-
private function loadStyle():void {
-
var eventDispatcher:IEventDispatcher = StyleManager.loadStyleDeclarations("exemplu_tema.swf");
-
eventDispatcher.addEventListener(StyleEvent.COMPLETE, completeHandler);
-
}
-
private function completeHandler(event:StyleEvent):void {
-
//aici pot fi inserate operatiuni de update la diverse componente, daca sunt necesare spre exemplu, update-uri de styleName
-
super.initialized = true;
-
}
-
-
override public function set initialized(value:Boolean):void {
-
// asteapta ca CSS-ul sa fie incarcat
-
}
Completari
Este de notat ca, in ciuda faptului ca flex a integrat foarte bine CSS-ul, nu toate specificatiile pot fi setate prin intermediul stilurilor globale, ci vor trebui definite pentru fiecare element in parte, atunci cand vor fi create. Este cazul inaltimii si latimii panourilor, elementelor height si width, fiind componente ale clasei UIComponent.
In cele din urma, va trebui sa punctez, ca si in CSS si XHTML, o proprietate CSS care este inline va avea prioritate fata de declaratie ei in functia global sau in aplicatie.

Comentarii recente