Proiectați un vizualizator Panoramio Thumbnail în Flex

În timpul acestui tutorial vă voi îndruma prin modalitățile prin care Flex personalizează controalele de interfață. Mai exact, vom analiza elementul TileList, stilizându-l cu setul de instrumente GUI al Flex.

Pentru a trage toate acestea, vom face uz de API-ul Panoramio și vom construi un vizualizator dinamic de imagini miniatură.


Vizualizare rapidă

Iată vizualizatorul de miniaturi cu care lucrăm:

Introducere

De la începutul sistemelor de operare grafice au existat o serie de controale standard ale interfeței utilizator, cum ar fi butoane, etichete, casete de text și liste cu casete combo. Aceste controale și-au servit bine, dar în timp ce Vista, Windows 7, MacOS, KDE și Gnome ne aduc noi modele de design proaspăt, dezvoltatorii sunt deseori blocați proiectând propriile aplicații cu controale care nu și-au schimbat funcția de bază în 20 de ani.

Nu contează dacă faceți o pagină web, programând o aplicație Windows cu VB.Net sau creând o RIA cu Flex; când ajungi la ea, o listă este încă o listă și un buton este încă un buton.

Din fericire, Flex oferă dezvoltatorilor o modalitate convenabilă de a personaliza lista umilă, permițând modele mult mai interesante decât liniile standard de text. Vom folosi această funcție pentru a crea un vizualizator de imagini Panoramio.

Pasul 1: Creați un nou proiect Flex

Creați un nou proiect Flex. Pentru că vom trage fotografii din Panoramio (care returnează un obiect JSON) trebuie să facem referire la biblioteca AS3CoreLib (care poate converti textul JSON într-un obiect ActionScript), pe care îl puteți descărca de aici. Extrageți arhiva și apoi adăugați o referință la ea în "Flex Build Path".

Pasul 2: Definirea statelor

Spre deosebire de aplicațiile desktop, aplicațiile Flex pot avea doar o singură fereastră. Statele sunt utilizate pentru a schimba cu ușurință comenzile de pe ecran atunci când sunt necesare mai multe afișări, cum ar fi o vizualizare miniatură și o vizualizare detaliată.

Stări noi pot fi adăugate utilizând butonul "Statul nou" din caseta de instrumente State.

Vrem să adăugăm două state. Primul va fi numit "Thumbnails". Dați clic pe butonul "Statul nou" și completați dialogul ca în imaginea de mai jos. Observați că bifăm "Setare ca stare de pornire", care spune Flex că aceasta este starea care va fi afișată pentru prima oară.

De asemenea, avem nevoie de o stare numită "Detaliu". Din nou, dați clic pe butonul "Statul nou" și completați dialogul ca în imaginea de mai jos.

Pasul 3: Proiectați starea miniaturilor

Selectați starea "Thumbnails" din caseta de instrumente State.

Acum picteaza o noua componenta TileList pe GUI. Această componentă va fi utilizată pentru afișarea miniaturilor de fotografii.

Atribuiți TileList un ID de "miniaturi" și setați "Data Provider" la imagini. Flex vă permite să scrieți codul ActionScript în atributele elementului MXML prin includerea codului în bretele curse și folosim această funcție pentru a seta colecția de imagini (pe care o vom crea ulterior) ca sursă a datelor pentru TileList.

Pasul 4: Proiectați starea detaliilor

Selectați starea "Detail" din caseta de instrumente State.

Vopsește un control de imagine, cu un id de "fotografie", care ocupă cea mai mare parte a spațiului de pe ecran. Apoi, în partea de jos, adăugați două etichete, cu codurile "photoTitle" și "photoLocation", și un buton cu eticheta "Back".

De asemenea, trebuie să setăm proprietatea "La apăsare" a butonului pentru a this.currentState = 'Miniaturi'. Schimbarea valorii atribuite proprietății "currentState" este modul în care ne schimbăm între stările din Flex și, la fel ca și proprietatea "Data Provider" a TileList în pasul 3, vom încorpora un anumit cod ActionScript în atributul prin includerea lui în bare cotit . Prin atribuirea șirului "Thumbnails" proprietății "currentState", instruim Flex să renunțe la starea Thumbnails.

Interfața dvs. finală pentru starea Detaliu ar trebui să arate ca imaginea de mai jos.

Pasul 5: Creați o componentă MXML nouă

Componentele MXML pot fi utilizate pentru a defini modul în care sunt afișate plăcile individuale în cadrul componentei TileList. Faceți clic pe File> New> Componentă MXML.

Veți vedea acum un dialog care vă permite să specificați detaliile pentru Componenta MXML. Completați-l ca în imaginea de mai jos.

După ce ați terminat, veți fi dus la un ecran de design unde puteți picta componentele la fel ca în cazul aplicației principale Flex.

Pasul 6: Amenajarea plăcilor

Această componentă MXML va fi utilizată pentru a desena fotografiile individuale din TileList. După cum puteți vedea, aveți libertate aproape nelimitată în modul în care sunt proiectate plăcile. Fiecare placă poate fi proiectată cu orice control Flex în orice aspect care vă place.

Libertatea de a proiecta fiecare placă în mod individual este ceea ce face TileList și alte controale precum "DataGrid", "HorizontalList", "List", "Menu" și "Tree" atât de puternice. De fapt, nu am văzut niciodată alt set de instrumente GUI care să ofere dezvoltatorilor acest nivel de personalizare fără a trebui să dezvolte un nou control de la capăt.

Pentru aplicația noastră vom afișa două componente pe fiecare țiglă: o imagine și o etichetă. Modulul final ar trebui să arate cam ca imaginea de mai jos.

Pasul 7: Etichetă

Setați proprietatea Text pentru etichetă la data.photo_title.length> 30? date.photo_title.substr (0, 27) + '...': date.photo_title. Aici vom afișa proprietatea "photo_title" a obiectului care este legat de componentă (vom vedea cum se va lega aceasta mai târziu) folosind un operator ternar (în esență, o mențiune constrângătoare dacă ... else).

Dacă este vorba de 30 de caractere sau mai puțin, va fi afișat șirul complet. În caz contrar, afișăm primele 27 de caractere urmate de 3 perioade pentru a indica faptul că titlul a fost scurtat.

Pasul 8: Imagine

Setați proprietatea "Sursă" a imaginii la Data.photo_file_url. Din nou, folosim ActionScript pentru a scoate proprietatea "photo_file_url" a obiectului care este legat de component.

Pasul 9: Specificați manual atributele MXML

Reveniți la fișierul principal MXML și comutați editorul la vizualizarea Sursă.

Ar trebui să vedeți un element de stare adăugat la elementul Application. Acesta este marcajul care reprezintă stările definite în pasul 2.

Sub elementul de stat ar trebui să existe două elemente de stat, iar sub fiecare dintre ele vor exista elementele AddChild. Acestea se referă la componentele pe care le-am adăugat fiecărui stat.

Sub elementul de stat cu "numele" de "Thumbnails" ar trebui să vedeți un element AddChild care conține un element TileList. Acesta este TileList pe care l-am adăugat la pasul 3. Va trebui să adăugăm câteva atribute adiționale de mai jos pentru ca TileList să afișeze componenta personalizată MXML.

itemRenderer = "ImageThumbnail" itemDoubleClick = "photoSelected ()" doubleClickEnabled = "true"

Deci, întregul element TileList ar trebui să citească:

Atributul "itemRenderer" este numele componentei MXML pe care am creat-o la pasul 5.

Atributul "itemDoubleClick" stabilește funcția "photoSelected" care trebuie apelată atunci când un element este dublu-clic.

Atributul "doubleClickEnabled" indică componentei să trateze două clicuri de mouse ca un singur dublu-clic. Fără acest atribut, componenta ar trata un dublu clic ca două clicuri unice și evenimentul "itemDoubleClick" nu ar fi declanșat niciodată.

Pasul 10: Adăugați un efect de tranziție de stat

Flex vă permite să aplicați un efect atunci când treceți de la o stare la alta. Vom folosi această funcție pentru a bloca inițial ecranul când schimbăm între stările Miniatură și Detalii, apoi readuce ecranul înapoi.

Pentru a defini tranziția de stat trebuie să adăugăm un element "tranziții" ca un element al elementului "Aplicație" MXML.

  

În interiorul elementului de tranziție vom adăuga un element de tranziție.

  

Atributele "fromState" și "toState" definesc stările la care se va aplica tranziția. Aici am folosit asteriscul ca un wildcard, care se potrivește tuturor statelor, ceea ce înseamnă că efectul de tranziție va fi aplicat atunci când se trece de la orice stare veche la orice stare nouă.

În interiorul elementului de tranziție definim efectul.

Atributul "țintă" definește ce componentă (și copiii ei) va avea efectul de estompare aplicat. În acest caz vrem ca toate elementele să fie neclară, așa că setăm ținta pentru a indica "această".

Atributul "durată" definește durata de aplicare a efectului de estompare în milisecunde. Am folosit 500 aici, jumătate de secundă.

Atributele "blurYFrom" și "blurXFrom" definesc cât de neclar va apărea inițial efectul. Valorile mai mari aici fac efectul inițial mai neclar.

Atributele "blurYTo" și "blurXTo" definesc cât de neclar este efectul la sfârșitul duratei. Vrem să aducem ecranul înapoi în focus, așa că atribuim valori de 1 pentru fiecare dintre atribute.

Pasul 11: Preluați imaginile din Panoramio

În acest moment am definit interfața de utilizator. Acum trebuie să obținem niște imagini de afișat.

Adăugați următorul atribut elementului Application:

applicationComplete = "appComplete ()"

Aceasta stabilește funcția "appComplete" care trebuie apelată atunci când aplicația a inițializat.

Adăugați un element "Script" în elementul aplicației MXML. Acest lucru ne oferă un loc pentru scrierea codului ActionScript.

  

În elementul Script importați următoarele pachete.

import mx.collections.ArrayCollection; import mx.controls.Alert; import com.adobe.serialization.json.JSON;

Pasul 12: Politica Cross Domain

În mod implicit, Flex nu vă va permite să încărcați resurse dintr-un domeniu extern. Cu toate acestea, acest comportament poate fi suprasolicitat dacă domeniul de la distanță are un fișier de politică de securitate încrucișată (de obicei, crossdomain.XML). Din fericire, Panoramio are doar un astfel de fișier de politică, pe care îl încărcăm cu următorul cod:

Security.loadPolicyFile ( "http://www.panoramio.com/crossdomain.xml");

În pasul 3, setăm proprietatea "Data Provider" a TileList la o colecție numită "imagini". Aici definim colecția respectivă. Prin folosirea etichetei "Bindable" pe variabila, îi spunem Flex să urmărească orice modificare a colecției și să afișeze automat aceste modificări.

[Bindable] imagini var privat: ArrayCollection = null;

Pasul 13: Funcția appComplete

Adăugați o funcție numită "appComplete".

funcția privată appComplete (): void var panoramioURL: String = "http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=public&from=0&to=50&minx=-180&miny=-90&maxx=180&maxy=90&size= mediu"; cerere var: URLRequest = URLRequest nou (panoramioURL); var loader: URLLoader = nou URLLoader (cerere); loader.addEventListener (Event.COMPLETE, loaderComplete); loader.addEventListener (IOErrorEvent.IO_ERROR, funcție (eveniment: Eveniment): void Alert.show ("A apărut o eroare IO contactând Panoramio");); loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, funcție (eveniment: Eveniment): void Alert.show ("A apărut o eroare de securitate în contactarea Panoramio");); 

Obținerea imaginilor de la Panoramio este de fapt foarte ușoară. Spre deosebire de alte site-uri cu imagini, cum ar fi Flickr, Panoramio nu cere dezvoltatorului să obțină un API sau să utilizeze un API special. Pur și simplu faceți o solicitare HTTP la o adresă URL formatată special (pagina API Panoramio are toate detaliile) și folosiți JSON returnat pentru a obține acces la imagini.

În Flex, aceasta înseamnă crearea unui obiect "URLRequest" cu URL-ul Panoramio, apoi crearea unui nou "URLLoader", care să transmită această cerere în constructor. Apoi, trebuie să urmărim pentru 3 evenimente din URLLoader: Event.COMPLETE, IOErrorEvent.IO_ERROR și SecurityErrorEvent.SECURITY_ERROR.

Evenimentul Event.COMPLETE indică faptul că totul a mers bine și că serverul Panoramio a returnat informațiile de care avem nevoie. În acest caz, numim funcția "loaderComplete".

IOErrorEvent.IO_ERROR și SecurityErrorEvent.SECURITY_ERROR evenimentele indică faptul că ceva a mers prost. În acest caz, informăm utilizatorul că nu am putut contacta serverul Panoramio și nu merge mai departe.

Pasul 14: Funcția de încărcare a încărcătorului

Acum adăugați o nouă funcție numită "loaderComplete".

funcția privată loaderComplete (eveniment: Eveniment): void var răspuns: URLLoader = URLLoader (event.target); var răspunsData: obiect = JSON.decode (răspuns.data); this.images = nou ArrayCollection (); pentru fiecare (var imagine: Object in responseData.photos) this.images.addItem (image); 

Aici luăm JSON-ul returnat de Panoramio și îl convertim într-un obiect ActionScript folosind biblioteca AS3CoreLib de la pasul 1.

Unul dintre trucuri atunci când lucrați cu serviciile web în cunoașterea datelor care au fost efectiv returnate. Dacă utilizați Firefox există un mare add-on numit JSONovich care va forma codul JSON în browser. În imaginea de mai jos puteți vedea JSON formatat care a fost returnat de la serviciul web Panoramio. Observați că obiectul JSON are o proprietate numită "count" și un tabel denumit "photos" care conține obiectele care la rândul lor conțin detalii ale fotografiilor individuale.

Deci, ceea ce trebuie să facem este să luăm fiecare dintre obiectele din această gamă de fotografii și să le plasăm în colecția noastră de imagini. Aceasta este doar o chestiune de looping prin fiecare dintre obiectele din colecția de fotografii și apoi apelând "addItem" în colecția de imagini.

Deoarece colecția de imagini a avut eticheta "Bindable", adăugarea acestor obiecte în colecție va determina afișarea acestora. Dacă priviți înapoi la pasul 5, veți observa că valorile pentru etichetă și imagine au fost setate la proprietăți dintr-un obiect numit "date". Acest obiect de date face referință la un element din colecția de imagini și, dacă priviți la captura de ecran de mai sus, puteți vedea de unde provin proprietățile photo_file_url și photo_title.

Pasul 15: Funcția foto selectată

Funcția finală se numește "photoSelected".

funcția privată photoSelected (): void this.currentState = "Detail"; var selectatPhoto: Object = this.thumbnails.selectedItem; this.photo.source = selectedPhoto.photo_file_url; this.photoTitle.text = selectedPhoto.photo_title; this.photoLocation.text = "Lat:" + selectatPhoto.latitude + "Long:" + selectatFoto.longitude; 

Această funcție este apelată atunci când utilizatorul face dublu clic pe un element din TileList. Aici setăm starea curentă la "Detail" și setăm proprietățile imaginii și etichetelor utilizând proprietățile elementului TileList selectat.

Concluzie

Doar am zgâriat suprafața a ceea ce este posibil cu componentele MXML, dar sperăm că le puteți vedea potențialul. Fiind capabil să particularizați modul în care este desenată o țiglă, fără a fi nevoie să scrieți vreun cod, este doar una dintre multele caracteristici care stabilește Flex în afara celorlalte platforme de dezvoltare.

Cod