Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop [611704]
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
1
1. Introducere
Având în vedere importanț a deosebită acordată jocurilor în perioada ace sta, am decis
ca ace astă lucrare de licență să prezinte implementarea unui joc de noroc, numit „Roata
Norocului ”. Lucrarea prez intă o versiune pentru desktop ș i una pentru android. Aceste
două aplicații au la bază același principiu de funcționare.
În general pentru a câș tiga un joc de noroc nu trebuie să fii foarte inteligent sau să ai
foarte multe cunoștințe, ci doar să ai noroc. Însă , în acest joc nu e suficient să ai noroc, ci
trebuie să fii și iscusit. Deoarece, doar fiind atent la detalii poți ghici fraza.
Aplicația „Roata Norocului ” se adresează tuturor utilizatorilor, fiind destinată exclusiv
pentru scopuri de divertisment. Această aplicație vine în sprijinul emisiunilor de
divertisment care se bazează pe această tematică. Ea este gândită și realizată pe baza unei
emisiuni TV. Cu aj utorul ei utilizatorii se vor obișnui cu regulile jocului și își vor dori să
vizioneze mai mult aceste emisiuni pentru a câștiga experiență în descifrarea frazelor. Și
nu în ultimul rând își vor încerca norocul la roată. Frazele sunt proverbe sau zicători des
utilizate de noi.
Interfața grafică este foarte atractivă pentru majoritatea categoriilor de utilizatori. În
ambele versiuni , design -ul oferă orientare rapidă fiind ușor, intuitiv și comod. Am ales
platforma de NetBeans IDE și Android Studio deoarece îmi place limbajul Java și aș vrea
să continui pe acest domeniu. Și bineînțeles pentru că este un limbaj foarte complex,
oferindu -ți o multitudine de unelte pentru a putea dezvolta orice aplicație în timp util ,
având și funcționalități complexe .
Această lucrare este împărțită în trei părți. În prima parte a lucrării sunt detaliate
tehnologiile utilizate pentru implementarea aplicației. Limbajul JAVA stă la baza celor
două platforme utilizate. Am ales acest limbaj de programare, deoarece consider că Ja va
este un lider în multitudinea limbajelor de programare existente. Astfel, programele în
Java pot fi executate pe orice sistem de operare de calcul indiferent de configurațiile
hardware , cu condiția să fie instalat Java Virtual Machine pe dispozitivul re spectiv .
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
2
În a doua parte a lucrării este descrisă, în mare, această aplicație. În acest capitol este
redat modul de funcționare a aplicației și elementele utilizate din cadrul celor 2 platforme.
În următorul capitol este descrisă realizarea aplicației. Fi ecare parte a acestui joc este
descrisă amănunțit , fiind date o mulțime de exemple concrete referitoare la implementarea
aplicației: precum codul anumitor părți din joc și chiar imagini care ilustrează
funcționalitatea acelui cod.
Pe versiunea de android, fiecare câștigător al jocului este salvat în baza de date locală,
astfel ținându -se evidența câștigătorilor. Informațiile din baza d e date sunt afișate într -o
listă în aplicație, având și posibilitatea de a șterge oricare dintre câștigători.
Impl ementare a aplicației a fost realizată cu ajutorul a numeroase metode și clase
specifice platformelor alese. Aplicația este formată dintr -o multitudine de compone nte
care sunt organizate prin intermediul containerelor , iar cu ajutorul thread -urilor se fac
update -uri la interfață în timpul jocului.
Utilizarea acestei aplicații aduce utilizatorului următoarele beneficii:
– dezvoltarea spiritului de observație,
– dezvoltarea spiritului de inițiativă ;
– dezvoltarea spiritului de competiție;
– dezvoltare a intelectuală;
– exersarea atenției și a imaginației .
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
3
2. Tehnologii utilizate
2.1 Platforma NetBeans IDE
NetBeans IDE este un mediu de dezvoltare , un instrument pentru programatori,
dedicat pentru scrierea, compilarea, testarea, depanarea, proiectarea și instalarea programelor.
Este scris în Java, însă poate accepta orice limbaj de programare. De asemenea, există un
număr imens de module pentru extinderea NetBeans IDE. Este un produs gratuit, fără
restricții legate de modul de utilizare.
Componentele Swing din NetBeans , spre deosebire de predecesoarele din versiunile
Java anterioare, sunt implementate în î ntregime î n Java. Ac easta are ca rezultat o mai bună
compatibilitate cu platforme diferite decât în cazul folosirii componentelor AWT.
Unul din principalele cerințe ale tehnologiei Swing a fost să pună la dispoziție un set
de componente GUI extensibile care să permită dezvoltarea rapi dă de aplicații Java cu
interfaț a grafică competitivă din punct de vedere com ercial. Cel mai important pachet, care
conține componentele de bază este javax. swing.
Elementele grafice sunt de două tipuri:
1. Componente : componentele sunt entități grafice elementare, precum JButtons,
JLabels, JTextField etc. Componentele pot fi numite și blocuri funcționale. Aceste a servesc la
implementarea interfețelor grafice destinate utilizatorilor.
2. Containere : containerele precum JFrame, JPanel, sunt folosite pentru a conține
componente. Componentele se pot aranja într -un anume fel în i nteriorul unui container
specificând tipul de layout dorit. Un container poate conține subcontainere. Este chiar
recomandat, pentru a putea aranja obiectele într -un anume fel în interiorul containerului să se
folosească subcontainere.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
4
Componentele folosit e pentru crearea interfețelor grafice Swing pot fi grupate astfel:
• Componente atomice: JLabel, JButton, JCheckBox, JRadioButton, JToggleButton,
JScrollBar, JSlider, JProgressBar, JSeparator
• Componente complexe: JTable, JTree, JComboBox, JSpinner, JLis t, JFileChooser,
JColorChooser, JOptionPane
• Componente pentru editare de text: JTextField, JFormattedTextField,
JPasswordField, JTextArea, JEditorPane, JTextPane
• Meniuri: JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem,
JRadioButtonMenuItem
• Containere intermediare: JPanel, JScrollPane, JSplitPane, JTabbedPane,
JDesktopPane, JToolBar
• Containere de nivel înalt: JFrame, JDialog, JWindow, JInternalFrame, JApplet
Containerele reprezintă suprafețe de afișare pe care pot fi plasate alte componente,
eventual chiar alte containere.
Interfața grafică servește interacțiunii cu utilizatorul. De cele mai multe ori programul
trebui e să facă o anumită prelucrare în momentul în care utilizatorul a efectuat o acțiune și,
prin urmare, componentele trebuie să genereze evenimente în funcție de acțiunea pe care au
suferit -o (acțiune transmisă de la tastatură , mouse, etc.). În limbajului Java, evenimentele sunt
instanțe ale claselor derivate din AWTEvent.
Așadar, un eveniment este produs de o acțiune a utilizatorului asupra unui obiect
grafic, deci evenimentele nu trebuie generate de programator. În schimb, într -un program
trebuie specificat codul care se execută la apariția unui eveniment. Tratarea eveni mentelor se
realizează prin intermediul unor clase de tip listener, clase care sunt definite în pachetul
java.awt.event.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
5
Cele mai importante interceptoare de evenimente sunt:
• ActionListener – tratează evenimente de acțiune , care sunt generate de acțiunea unui
utilizator asupra unei componente, cum ar fi execuția unui clic pe un buton.
• WindowListener – tratează evenimente de ferestre, care sunt generate de
maximizarea, minimizarea, mutarea sau închiderea ferestrelor.
• MouseListener – tratează ev enimente de mouse, care sunt generate de clicuri cu
mouse -ul, de pătrunderea indicatorului mouse -ului pe suprafața unei componente sau de
părăsirea acesteia.
• FocusListener – tratează evenimente de selecționare, care sunt ge nerate, atunci când
o component ă devine selectată sau când pierde acest atribut.
• AdjustmentListener – tratează evenimente de modificare a componentelor.
• ItemListener – tratează evenimente generate de modificarea stă rii unei componente .
• KeyListener – tratează evenimente care apar c ând utilizatorul apasă o anumită tastă.
Evenimentele de tip ActionEvent trebuie să implementeze interfaț a ActionListener , ele sunt
trimise metodelor actionPerformed() cu urmă toarea sintax ă:
public void actionPerformed(ActionEvent e){
…
}
Interfeț ele ajută la identificarea obiectelor capabile de o primi anumite tipuri de evenimente .
Evenimente le specifice componentelor / containerelor AWT și metodele de tratare:
Eveniment Metode de tratare
ActionEvent actionPerformed()
ItemEvent itemStateChanged()
TextEvent textValueChanged()
KeyEvent keyTyped() , keyPressed() , keyReleased()
MouseEvent mouseClicked() , mousePressed(),
mouseMoved() etc .
FocusEvent focusGained() , focusLost()
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
6
2.2 Android Studio
Android Studio este dedicat implementării aplicațiilor mobile. De asemenea este cea
mai rapidă cale de a dezvolta o aplicație android folosind cea mai înaltă calitate. Ace astă
platformă include tot ce ai nevoie pentru a crea o aplicație: editor de cod, instrument de
analiză de cod, e mulator și altele. Cu ajutorul editorului inteligent, care te ajută la fiecare pas,
lucrezi mult mai rapid și productiv. Android Studio îți permite să implementezi o aplicația
care este suportată pe orice dispozitiv android.
Cele mai importante componente ale unei aplicații Android sunt:
Activity (Activitate)
reprezintă interfața cu utilizatorul;
o aplicație Android poate avea una sau mai multe activități ;
fiecare Activitate are propriul său ciclu de viață, independent ciclului de viață al
procesului asociat aplicației;
fiecare activitate are propria sa stare și datele acesteia pot fi salvate sau restaurate;
activitățile pot fi pornite de aplicaț ii diferite.
utilizând managerul de activități, sist emul Android gestionează o stivă de activități care
se găsesc în diferite stări (pornire, în execuție, întreruptă, oprită, distrusă);
Intent (Intenț ie)
reprezintă o entitate folosită pentru a descrie o operație care urmează să fie executată;
este un mesaj transmis către o alta componentă pentru a anunța o operațiune;
este similar oarecum cu conceptul de event -handler din .NET sau Java ;
este gestionată de o instanță a clasei Intent.
Service (Serviciu)
un task care se execută în fundal, fără o interacțiune directă cu utilizatorul;
este gestionat de o instanță a clasei Service .
Broadcast receiver
o componentă care ră spunde la anunțuri difuzate la nivel de sistem.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
7
Ciclului de viață al unei Activităț i descrie starea în care o activitate poate fi la un moment dat.
Running – Activitatea a fost creată (în onCreate()), pornită (în onStart()) și este afișată
pe ecranul dispozitivului . În cazul în care activitatea a mai fost utilizată și aplicația a salvat
starea acesteia (onSaveInstanceState()), activitatea este reluată din acel punct
(onRestoreInstanceState() și onResume()). În această stare utilizatorul interacționează cu
activitatea prin intermediul interfeței dispozitivului precum: ta statură , touchscreen, display .
Paused – Activitatea pierde prim ul-planul (onPause()), deoarece o altă activitate este
executată, de exemplu: o fereastră de dialog. De asemenea, în cazul în car e aparatul intră în
modul sleep, activitatea este oprita tempora r și își poate relua execuția (onResume()) ,iar apoi
este plasată înapoi în prim -plan.
Stopped – Activitatea nu mai este în uz și pentru că este op rită (onStop()) nu este
vizibilă . Pentru a fi reactivată , activitatea trebuie să fi repornită (onRestart() ș i onStart()) și
reluată (onResume());
Destroyed – Activitatea este distrusă (onDestroy()) și memoria s -a eliberat. Fie
deoarece nu mai este necesară, fie sistemul are nevoie de memorie suplimentară pentru
rutinele proprii sau pentru alte activită ți.
Sistemu l anunță atunci când activitatea își schimbă starea prin intermediul handler –
elor:
onCreate(Bundle) – este apelat ă când activitatea este creată . Folosind argumentul
metodei de tip Bundle există posibilitatea să restabiliți starea activității, care a fost salvată
într-o sesiune anterioară. După ce activitatea a fost creată , va fi pornită în: onStart();
onStart() –este apelată în cazul în care activitatea urmează să fie afișată. Din acest
punct, activitatea poate veni în prim -plan sau rămâne ascunsă în fundal;
onRestoreInstanceState(Bundle) –este apelată în cazul în ca re activitatea este
inițializată cu datele dintr -o stare anterioară, ce a fost salvată; în mod implicit, sistemul
restaurează starea interfeței cu utilizatorul;
onResume() –este apelat ă când activitatea este vizibilă iar utilizatorul poate
interacționa cu aceasta. Din această stare, activitatea poate fi pl asată în fundal, devenind
întreruptă;
onRestart() –este apelată în cazul în care activitatea revine în prim -plan dintr -o stare
oprită . După aceasta, activitate este pornită din nou;
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
8
onPause() –este apelată atunci când si stemul aduce în prim -plan o altă activitate.
Activitatea curent ă este mutată în fundal și mai târziu poate fi oprită sau repornită și afișată .
Acesta este un moment bun pentru a salva datele aplicației într -un mediu de stocare persistent
(fișiere, baze de date) , deoarece după această fază activitatea poate fi terminată și distrusă fără
a se anunța acest lucru.
onSaveInstanceState(Bundle) –este apelată pentru a salva starea curentă a activită ții.
În mod implicit, sistemul salvează starea interfeței cu utilizatorul;
onStop() –este apelată în cazul în care activitatea nu mai este u tilizată și nu mai este
vizibilă, deoarece o altă activitate interacționează cu utilizatorul. Din acest punct, activitatea
poate fi repornită sau distrusă;
onDestroy() –este apelată în cazul în care activitatea este distrusă, iar memoria s -a
eliberat. Acest lucru se poate întâmpla în cazul în care sistemul necesită mai multă memori e
sau dacă programatorul termină explicit activitatea apelâ nd metoda finish() din clasa Activity .
Figura 2.2.1 ilustrează legătura strânsă dintre stările descrise mai sus:
Figura 2.2.1 -Stările unei activități în Android
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
9
(sursa: http://android.rosedu.org/2015/laborator -02-structura -android -depanare ).
Pentru a supradefini metodele anterioare, tr ebuie să se acorde atenție semnă turii
acestora (numele metodei și lista de parametri). Este mai sigur să folosim adnotarea
@Override p entru a solicita o validare din partea compilatorului (în cazul în care metoda
definită nu supradefinește o metodă din clasa de bază, atunci se obține o eroare de compilare).
Resursele aplicației sunt stocate în directorul res din cadrul proiectului Android.
Pentru a gestiona diferite tipuri de resurse, directorul res al proiectului conține subdirectoare
specifice. Structura acestui folder este ilustrată prin intermediul tabelului 2.2.2 .
Director Resursa -fișiere XML
res/animator/ ce definesc proprietățile animațiilor
res/anim/ pentru animații bazate pe transformări
res/color/ ce definesc culori
res/drawable/ Fișiere bitmap (.png, .jpg, .gif) sau fișiere
XML ce definesc resurse ce pot fi desenate
res/layout/ ce definesc design -ul interfeței
res/menu/ ce definesc meniurile aplicației
res/raw/ diferite în format binar sau text
res/values/ care conțin valori simple, cum ar fi șiruri
de caractere, numere întregi și culori. Este
recomandat să utilizați convențiile de nume
de fișiere pentru anumite tipuri de resurse:
arrays., colors.xml , dimens.xml ,
strings.xml , styles.xml.
res/xml/ care pot fi citite
Tabel 2.2.2 – Subdirectoarele folderului res
Toate resursele din subdirectoarele directorului res/ sunt incluse în pachetul aplicației de
către compilator. Pentru a facilita accesul și controlul resurselor din codul aplicației,
compilatorul generează o clasă, numită R, care conține identificatori sta tici utilizați pentru
referirea fiecă rei resurse.
Limbajele de programare și instrumentele de dezvoltare au evoluat pentru a permite
programatorilor să dezvolte aplicații mai complexe și să se concentreze asupra funcționalității
soluției, asupra arhitectur ii și mai puțin asupra scrierii codului.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
10
Interfața cu util izatorul reprezintă o componentă impor tantă a aplicației, dar nucleul și
funcționalitatea este dată de codul sursă din spatele ei. Fără acesta, interfața cu utilizatorul
este inutilă, deoarece nu f ace nimic.
Designul declarativ al interfeței, pentru aplicaț ii Android, este bazat pe limbajul descriptiv
XML(asemănă tor cu HTM L-ul), care poate fi ușor de citit și de înțeles de către programatori
cu puține cunoștințe pe platforma Android. Fișierele XML care conțin descrierea interfeței
sunt plasate în subdirectorul \res\layout \ din proiectul Android.
Forma inițială generată de plugin -ul Android Studio este:
<?xml version="1.0" encoding ="utf-8"?>
<LinearLayout
xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
<TextView
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/hello"
/>
</LinearLayout >
Citind documentul main.xml este ușor să observi că ecranul este definit printr –
un LinearLayout cu o orientare verticală care umple ecranul și care conține un
element TextView .
Pentru a modifica într -un mod declarativ aplicația Android propusă, trebuie editat
fișierul main.xml .
Designul procedural și cel declarativ de interfețe Android :
Următo rul tabel (tabel 2.2.3) prezintă pe scurt avantajele ș i posibilitățile fiecărei metode
utilizate pentru a proiecta interfața cu utilizatorul a aplicațiilor mobile:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
11
Designul Procedural al
interfeței Android Designul Declarativ al interfeței Android
– utilizându -se codul sursa Java
în metoda onCreate() a clasei
Activity – definindu -se elementul XML in fișierul main.xml din
subdirectorul \res\layout \ al proiectului Android
this.setTitle(
"First Android
Application" ); editarea elementului
<string name="app_name" >
First Android Application
</string>
în fișierul strings.xml al proiectului
TextView txtInfo =
new
TextView( this);
txtInfo.setText(
"Hello
World!");
<TextView
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:text ="Hello World!"
android:textSize ="20dp"
android:textColor ="#0f0"
android:typeface ="sans"
android:textStyle ="bold|italic"
/>
Button btnClick =
new Button(this);
btnClick.setText(
"Click!" );
<Button
android:layout_width ="120px"
android:layout_height ="wrap_content"
android:text ="Click!"
/>
Tabel 2.2. 3 –Designul Procedural/Declarativ
Structura unui proiect în Android:
• Fișiere sursă (src)
• Fișiere sursă Java (java)
• Resurse (res)
• res/drawable
• res/layout
• res/values
• res/menu
• res/xml
• res/raw
• Resurse preluate ca fluxuri de date (assets)
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
12
• Fișier de configurare (AndroidManifest.xml)
• Proprie tățile sistemul de compilare
• build.gradle
• Fișiere generate :
• R.java
Descrierea pe scurt a celor mai importante directoare :
assets –în acest folder sunt plasate de obicei orice fel de fișiere care
sunt folosite în aplicație, de exemplu fișierele audio în format
MP3.
libs– aici plasăm bibliotecile Java adiționale pe care dorim să le
folosim în proiect, în format JAR.
res– poate cel mai important director din proiect, acesta conține o
serie de subdirectoare dedicate resurselor de UI. El conține, în
general, fișiere XML și imagini PNG sau JPG.
drawable – este un subdirector care conține toate elementele grafice
ce sunt folosite în a plicație. Acestea pot fi atât imagini, PNG -uri
sau JPG -uri, dar și XML -uri ce definesc anumite forme .
layout – este un alt subdirector extrem de important pentru că,
conține toate fișierele care definesc interfața cu utilizatorul.
values – în acest subdirector sunt plasate fișierele care definesc
diferite valori folosite de aplicație. Consider că cel mai folosit fișier
de aici este strings.xml , care oferă posibilitatea de a defini textele
ce apar în aplicație și care sunt disponibile apoi în codul sursă prin
intermediul identificatorilor .
src– directorul care conține sursele Java ale aplicației mobile .
Logurile sistemului sunt cele mai importante informații pe care le poate oferi
android -ul. Aici sunt descrise toate acțiunile îndeplinite d e către dispozitiv, excepțiile apărute
și informațiile necesare depanării . Log -urile vor apărea în panoul denumit LogCat .
Tipul mesajului
I (Information) – mesaj informativ ;
D (Debug) – mesaj utile la depanare ;
W (Warning) – mesaj de avertizare ;
E (Error ) – mesaj de eroare (excepțiile ce întrerup o componentă apar de obicei în
acest mesaj) ;
V (Verbose ) – informații suplimentare afiș ate de programe .
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
13
3. Descrierea aplicației
3.1 Prezentare a general ă
3.1.1 Aplicația desktop
Implementarea grafică a jocului pentru PC –uri este realizată cu ajutorul
componentelor si containerelor din Swing. Astfel conține 2 JFrame -uri: primul frame conține
pagina principală, care este formată dintr -un component JButton „Play” și un container
JPanel care conține o i magine. Iar al doilea frame conține restul elementelor , fiind main -ul
acestei aplic ații. Numele jucă torilor este preluat cu ajutorul dialogului.
Unelte folosite în implementarea aplicației:
JLabel este un component utilizat pentru afișa rea textului sau imagini i dintr -un
container. Acest component este cel mai simplu din punct de vedere al
funcționalității oferite.
JButton este, cum îi spune și numele, un buton. Acesta poate avea afișat un
text sau o imagine. Când butonul este apăsat se generează un ActionEvent.
JTextField reprezintă o zonă în care se poate introduce text scurt, de o singură
linie.
JoptionPane , cu ajutorul acestui component poți interacționa cu utilizatorul
prin intermediul dialogului.
JPanel este un container generic care poate conține alte elemente. Poate fi
vizibil, schimbându -i-se culoarea background -ului, sau modelul marginii, sau
rămâne invizibil, folosit doar pentru ierarhizarea conținutului. Este indicat să
nu se plaseze alte obiecte direct pe un JFrame, ci doar pe un JPanel care să
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
14
conțină restul elementelor . Acest lucru este foarte util și când aveți nevoie să
schimbați complet elementele dintr -un JFrame, înlocuiți doar JPanel -ul.
JFrame este un container care, le fel c a și JPanel, organizează componentele
din cadrul aplicației .
Clasa JComponent este superclasa tuturor componentelor Swing , mai puțin a celor care
descriu containere de nivel înalt JFrame, JDialog, JApplet. Deoarece JComponent extinde
clasa Container, deci și Component, ea moștenește funcționalitatea generală a containerelor și
componentelor AWT, furnizând bineînțeles și o serie întreagă de noi facilită ți.
Roata este realizată cu ajutorul clasei MyComponent pe care am creat -o, aceasta fiind
extinsă clasei JComponent . Roata se învârte timp de câteva secunde, cu ajutorul unui thread,
colorând -o de fiecare dată cu culori diferite . Fiecărei culoare de pe roat ă i se asociază random
o valore dintr -un vector de String predefinit.
3.1.2 Aplicația android
Platforma Android oferă o mare flexibilitate în construirea interfeței cu utilizatorul. Putem
folosi fie una din cele două metode, fie le combină m pentru a realiza exact ceea ce ne dorim.
Spre exemplu, putem defini structura de bază a interfeței în fișieru l XML, iar apoi putem
adăuga cod în aplicația noastră pentru a adăuga noi obiecte, sau pentru a le modifica pe cele
deja definite în fișierul XML.
Avantajul definirii elementelor unei interfețe prin metoda XML este separarea interfeței
de codul care contro lează elementele definite. Asta înseamnă că implementarea aplicației este
mult mai logică și mai ușor de urmat. De fiecare dată când va fi nevoie să modificăm un
element din interfață nu va trebui decât să îi ajustăm proprietățile din fișierul XML.
Interfa ța cu utilizatorul este implementată cu ajutorul elementelor grafice specifice
android -ului. Android generează toate fișierele necesare pentru a putea începe să construim
aplicația. Astfel grafica aceste i aplicații e ste realizată în special din fiș ierul xml. Însă unele
efecte ale textului sunt modificate la un moment dat și în activity. Aplicația combină armonios
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
15
designul procedural cu cel declarativ. Astfel utilizatorul se poate bucura de un design atractiv,
ușor și intuitiv.
Câteva din u neltele f olosite în realizarea acestei aplicații:
Layout -uri:
LinearLayout așează elementele grafice pe aceeași linie, specificându –
se orientarea prin atributul android:orientation . Acest atribut poate
avea doua valori: vertical – elementele vor fi așezate în coloană și
horizontal – elementele vor fi așezate pe linie .
RelativeLayout plasează componentele unele în funcție de celelalte.
Aliniere:
– Relativă la container (true/false):
• android:layout_alignParentTop|Left|Right|Bottom
• android:layout_centerHorizontal|Vertical
• android:layout_centerInParent
– Relativă la alte componente (id ‐ul):
• android:layout_alignLeft|Right|Start|Top|End
Poziționare:
– android:layout_below, android:layout_above
– android:layout_toEnd|Left|Start|Righ tOf
Ferestre de informare :
AlertDialog:
– este creat de clasa AlertDialog.Builder ;
– fereastra acestui dialog conține: titlu, mesaj/listă/opțiuni și
butoane (maxim 3) ;
– crearea și afișarea dialogului se face cu metoda: show();
– pentru închiderea ei folosim metodele: dismiss(), cancel().
Clasa Handler: Fiecare obiect de tip Handler este asociat unui fir de execuție
și unei cozi de mesaje .
Bazelor de date – SQLite : cu ajutorul acestora se stochează datele dorite prin
intermediul aplicației în dispozit ivul mobil.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
16
Shared Preferences : salvare și restaurarea datelor în dispozitiv.
ListView: este un View care conține o listă de elemente. ListView -ul poate fi plasat
pe orice tip de activity . Descrierea acestuia se face în fiș ierul xml.
Clasa Toast: Toast.makeText(this, "Așteaptă…", Toast.LENGTH_SHORT).show();
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
17
4. Dezvoltarea aplicației
4.1 Arhitectura aplicației
4.1.1 Roata norocului -desktop
Pașii pe care i -am urmat în crearea și afișarea interfețe i grafice sunt următorii :
– Am creat două ferestre principale , de tip JFrame și le-am stabilit proprietă țile: titlu,
culoare, dimensiuni etc.
– Apoi am creat componentelor atomice ș i am stabili t și proprietă ților acestora:
dimensiuni, text af ișat, culoare etc.
– Am grupat componen tele atomice în containere intermediare, care sunt obiecte de
tip JPanel.
– Am adă ugat containerelor interm ediare componentele necesare și am stabili t modul
de aș ezare a acestora în fereastră .
– Nu în ultimul rând , am tratat evenimente le asociate componentelor ș i ferestrei
principale, prin definirea clase i de tip “ascultă tor” la evenimentele generate de componentele
vizuale.
Prima pagină a aplicației este redată ilustrată în următoarea figură ( Figura 4.1.1.1 ):
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
18
Figura 4.1.1 .1- Layout -ul principal al aplicației
Aceasta este formată dintr -o fereastră Jframe care conține un container JPanel, care are
setată o imagine de fundal și componentul JButton de Play. Fereastra apare în centrul
ecranului și este prestabilită la aceste dimensiuni. Am dezactivat butonul de maximizare ,
deoarece am dorit ca frame -ul să apară la aceste dimensiuni .
Clasa definită pentru acest frame se numește PlayFrameActivity care este extinsă
clasei JFrame , iar în interiorul acestei clase am definit 2 variabile de tip J Frame : jframe –
fereastra de întâmpinare și jframeMain – fereastra unde se desfășoara jocul.
Fereastra de întâmpinare este creată astfel:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
19
Butonul ui Play îi sunt asociat e eveniment ele:
– KeyEvent : produs de apă sarea unei taste.
– MouseEvent : produs de apă sarea sau deplasare a mouse -ului pe suprafața
componentei.
Am folosit ambele evenimente, deoarece majoritatea utilizatorilor sunt obișnuiți să
apese tasta „Enter” pentru a inter acționa cu aplicația. Metodele folosite sunt:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
20
Odată acționat butonul de Play se inițializează clasa MainFrame care înainte de a
apărea , declanșează 2 dialoguri care culeg numele utilizatorilor. Dialogul este redat în Figura
4.1.1.2 pentru primul jucă tor, iar pentru al doilea se schimbă textul „Player 1 ” în „Player 2 ”,
acesta fiind transmis ca și parametru :
Figura 4.1.1.2 – Dialog
Dacă dialogul va prelua un nume null, acesta va apă rea din nou, până când caseta va
conține ceva caractere, astfel nu permite utilizatorului să introducă un nume care de fapt este
fără caractere. Butonul OK trece la următoarea etapă, fie la colectarea numelui următorului
jucător, fie și mai departe, adică în meniul principal. Prin apăsarea butonului de „Cancel ” vei
părăsi aplicația . Codul corespunzător acestui dialog este:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
21
După introducerea celor 2 juc ători apare frame -ul principal, care este ilustrat în Figura
4.1.1. 3, afișată mai jos :
Figura 4.1.1. 3- Interfața cu utilizatorul
Jucătorul activ îi este colorat numele cu o culoare deschisă de albastru , iar la cel
inactiv numele îi este colorat cu un gri închis.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
22
După cum se observă vocalele sunt inactive inițial. Însă dacă se dorește a da soluția
sau a cumpăra o vocală, apăsând butonul corespunzător butoanele cu vocale vor deveni active
și cele cu c onsone vor fi inactive.
Dacă butonul de „învârte ” a fost apăsat atunci roata se învârte cu ajutorul unui Thread
timp de câteva secunde, JTextField -ul numit score se colorează cu, culoarea specifică de pe
roată și i se atașează scorul corespunzător culor ii la care roata s -a oprit. În acest timp numai
consoanele sunt active. Doar ghicind consoana corectă se poate atribui jucătorului scorul
câștigat la roată. Consoanele care apar în frază vor fi vizibile și utilizatorului , iar pentru a știi
ce consoane s -au folosit, ele vor fi colorate cu roșu. Vocalele care sunt cumpărate și se găsesc
în frază se vor colora cu verde, iar cele care nu se găsesc vor fi colorate cu violet. Metoda ca re
face consoanele și/sau vocalele vizibile sau n u este:
În Figura 4.1.1. 4, de mai jos se pot vedea detaliile ilustrate mai devreme.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
23
Figura 4.1.1. 4- Interfața în timpul jocului
Jucătorul va fi noti ficat printr -un dialog în cazul în care litera selectată nu se găsește în
frază. După apariția acestui dialog , scorul parțial al jucătorului curent se pune pe 0 și se trece
la jucă torul următor. Figura 4.1.1.5 redă în prim -plan acest dialog:
Figura 4.1.1. 5- Dialog de informare
Dialogul de informare este realizat cu ajutorul codului următor:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
24
Metoda are un parametru de tip String cu ajutorul căruia pot să generez dialogul cu
orice mesaj , astfel interacționez foarte ușor cu utilizatorul.
Apăsând butonul de Dau soluția va apărea dialogul din Figura 4.1.1.6 , unde jucătorul
este înșt iințat de faptul că doar dând soluția corectă va primi punctajul de 700 de puncte.
Astfel utilizatorul are posibilitatea de a continua apăsând butonul Yes sau poate abandona
operațiunea apăsând butonul No.
Figura 4.1.1. 6- Dialog de confirmare
Și în cazul în care unul din tre jucători câștigă va apărea un dialog de informare ca în
Figura 4.1.1. 7, specificând numele câș tigătorului pe runda curentă.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
25
Figura 4.1.1. 7- Dialog pentru afișarea câștigătorului
Iar când butonul Cumpăr o vocală este apăsat se generează un nou dialog care este
realizat prin codul :
Dacă se confirmă solicitarea unei vocale atunci se face o verificare a scorul ui pentru
jucătorul curent, iar dacă scorul total al acestuia nu este mai mare sau egal cu punctajul de 500
de puncte, cât valorează o vocală , atunci acesta va fi notificat prin dialogul de informare de
acest lucru.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
26
Toate butoanele sunt salvat e într-un vector de butoane și cu ajutorul unei parcurger i
for le-am adăugat ActionListener fiecăruia , iar în următoar ea metodă este verificat fiecare
buton în parte, pentru a se stabili ce trebuie să se întâmple dacă un anumit buton este acționat :
@Override
public void actionPerformed(ActionEvent e) {… }
Următorul cod ilustrează pașii parcu rși atunci când vocala I este selectată:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
27
Fraza este stocată într -un HashMap în care , cu ajutorul chei i se află poziția literei în
frază, iar valoarea este litera de pe poziția din cheie. Metoda următoare primește ca parametru
HashMap -ul care conține toa tă fraza și litera care se caută. În vectorul keys sunt toate
pozițiile în care s -a găsit litera căutată. Astfel la calcularea scorului se ia în considerare
aparițiile literei ghicite, deoarece scorul câștigat la roată se multiplică de keys.length() ori.
După fiecare apăsare de vocală sau consoană se verifică dacă mai există litere de ghicit
în frază. Acest lucru este realizat prin numărarea de spațiilor din frază la începutul rundei și
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
28
apoi se tot compară numărul de spații cu ce l actual. Pe urmă se v erifică și numărul rundei, iar
dacă acesta este 3 se afișează un dialog de informare cu scorul total de pe toate rundele
câștigate și cu numele câștigătorului. În finalul rundei 3, după afișarea mesajelor de informare
se pornește un Timer, după câteva secu nde de la afișarea dialogului, care închide fraime -ul
principal și cre ează o nouă fereastră cu frame -ul de întâmpinare, dându -i posibilitatea
utilizatorului să joace din nou.
În continuare voi prezenta butoanele: Dau soluția și Cumpă r o vocală care au fiecare
atașat evenimentul MouseClicked:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
29
Cu ajutorul clasei Player preiau foarte ușor informațiile referitoare jucătorului care mă
interesează. Aceasta este structurată în felul următor:
În continuare am să prezi nt pe scurt modul de reali zare și de funcționare a roții .
Aceasta este realizată cu ajutorul clasei:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
30
Însă construirea propriu -zisă a roții se face în clasa MyComponent , care este extinsă clasei
JComponent . În interiorul ei este definit un vector de obiecte de tip SliceValues care specifică
în câte părți să fie î mpărțită roata și culoarea fiecă rei părți. Variabilele acestei clase sunt:
Colorarea fiecărei părți din roată se face random. Metoda care desenează roata se numește
drawPie(…) . Cu ajutorul unei parcurgeri for a vectorului de tip SliceValues , se ia fiecare
valoare în parte și se adună într -o variabilă total , astfel se calculează unghiurile la fiecare pas .
Cel de -al doilea for parcurge același vector și calculează la fiecare pas unghiul de început și
unghiul fin al al bucății din roată care îl desenează în pasul i cu a jutorul metodei din
Graphics2D: g.fillArc(MainFrame.X+20, MainFrame.Y+20, MainFrame.latime -40,
MainFrame.inaltime+20, startAngle, arcAngle);
Metoda descrisă mai sus, arată astfel:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
31
Constructorul clasei MyComponent este:
Variabila de clasă Graphics g din MainFrame este inițializat astfel:
g=roata.getGraphics();
– roata este containerul JPanel unde se desenează roata.
Metoda care învârtește roata se numește randomSpin() și este gândită astfel:
La fiecare ap ăsare al butonului spin se formează un Thread care colorează roata random timp
de câteva secunde. După fiecare repaint() acest thread intră în repaus câteva secunde, apoi
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
32
verifică dacă timpul curent în milisecunde este mai mare decât timpul apăsării butonului plus
1000. Când această condiție este îndeplinită se afișează utilizatorului informațiile dorite și
apoi se oprește thread -ul. Acest proces se reia la fiecare apăsare a butonului Învârte . Astfel
este realizată și pusă în funcțiune această roată în această aplicație .
În final am să ilustrez cu ajutorul figurii 4.1.1.8 , structura codului din frame -ul
principal și toate metodele implementate :
Figura 4.1.1. 8- Structura clasei principale
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
33
4.1.2 Roata norocului -android
Aplicația android are un design intuitiv și plăcut. Interf ața cuprinde ferestre de dialog,
o multitudine de controale vizuale și grafică 2D. Designul declarativ are următoarea
structură:
În cadrul relativelor sunt organizate componentele: TextView, ImageView și Button.
Utilizarea acestor RelativeLayout -uri oferă programatorului o mult mai bună structură a
codului și totodată o manipulare a datelor mult mai rapidă. Astfel pentru a pune vizibil e
componentele dorite se pune vizibil RelativeLayout -ul dorit.
Exemplu: roata.setVisibility(View. VISIBLE);
-roata –fiind un RelativeLayout.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
34
Iar layout -ul inițial care îi apare utilizatorului este redat în Figura 4.1.1. 9:
Figura 4.1.1. 9- Layout -ul inițial
Fiecare view al aplicației este structurat într -un RelativeLayout, care conține o
multitudine de componente vizuale. Pe baza id -ului se utilizează exact layout -ul dorit la
momentul res pectiv. După inițializarea fiecă rui relativ în onCreate() :
se poate folosi metoda setVisibility() pentru a face layout -ul dorit să apară sau să dispară :
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
35
Header -ul este creat separat într -un alt relativ cu id -ul: header și cuprinde:
Prima componentă este un ImageView care cuprinde iconița aplicației, a doua este un
TextView unde este specificat numele aplicației , iar celelalte 2 sunt alte ImageView -uri cărora
le sunt atașate câte un eveniment. Prin acționarea iconiței cu id -ul about se pot afla informații
despre apli cație, iar pe cealaltă iconiță cu id -ul clasament , utilizatorul poate vizualiza toți
câștigătorii care au jucat de pe dispozitivul respectiv. Câștigătorii sunt afișați într -o listă din
baza de date locală a dispozitivului .
Lista conține 4 elemente: numele câștigătorului, scorul lui total de pe rundele
câștigate, durata jocului și un buton de șterge. Figura 4.1.1.10 redă această listă:
Figura 4.1.1. 10- Lista câștigătorilor
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
36
Lista este creată astfel încât, dând clic pe un anumit element din listă se generează un
dialog unde apare întrebarea: Vrei să ștergi acest jucător? Dacă răspunsul utilizatorului este
Da, atunci se va șterge jucătorul din baza de date a dispozitivului și nu va mai fi afișat în listă,
iar dacă răspunsul este negativ nu se întâmplă nimic.
Dialogul este generat prin codul următor :
Poziția este preluată cu ajutorul metodei onItemClick():
Poziția se transmite ca și parametru pentru a se putea lua poziția exactă din listă pe care
utilizatorul dorește să o elimine din baza de date .
Această listă este creată într -un layout separat numit listactivity.xml și conține:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
37
Pentru a genera lista am realizat o clasă MyAdapterList care este extinsă clasei
BaseAdapter :
Acest adapter este încărcat într -o clasă numită ListActivity care afișează layout -ul
listactivity.xml. Layout -ul este vizibil la acționarea iconiței de clasament. Trecerea dintr -o
pagină în alta se face cu ajutorul intent -urilor.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
38
Exemplu:
List_row -ul precizat mai sus, în codul clasei MyAdapterList , este layout -ul care apare
în fiecare linie a listei. Fiecare component care formează linia unei liste este formatat într-un
anumit mod. În continuare am să prezint structura acestui layout și cum am formatat
TextView -ul ce conține numele jucătorului:
În clasa ListActivity , se citesc toți câștigătorii stocați în baza de date și sunt puși într -un
ArrayList<HashMap<String, String>> , iar acesta este transmis ca parametru la constructorul
clasei MyAdapterList , pentru a prelua datele din acest ArrayList și a le af ișa utilizatorului .
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
39
Momentan, baza de date cuprinde doar un tabel , unde sunt salvate următoarele
informații: id -ul, numele, durata jocului în secunde și scorul total . Clasa care creează această
bază de date se numește DataBase fiind extinsă clasei SQLiteOpenHelper .
Metoda care șterge un câștigător din baza de date este alcătuită din următorul cod:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
40
Adăugarea unui câștigător în baza de date se face astfel:
Metoda care returnează toți jucătorii din tabela player, într-un ArrayList :
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
41
Cu ajutorul cursorului se parcurge fiecare linie din tabelă, informațiile de pe acea linie
sunt stocate într -un HashMap , iar acesta este adăugat în ArrayList . String -urile folosite în
construirea HashMap -ului sunt definite în MainActivity astfel:
Prin acț ionarea iconiței about din cadrul header -ului se apelează clasa AboutActivity
care setează layout -ul about.xml. Designul acestui layout îl regăsim în Figura 4.1.1. 11:
Figura 4.1.1. 11- Pagina “Despre Aplica ție”
Și este creat declarativ :
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
42
TextView -ul din layout -ul anterior, care are textul -Roata Norocului, are următorul
style:
Pentru definirea dimensiunii textului am folosi t atributul android:textSize . Iar pentru font si
stil se folosește: android:typeface si android:textStyle . Culoarea textului este setată folosind
atributul android:textColor , valoare a #RGB este definită în colors.xml .
Frazele care apar în aplicație sunt stocate în folderul res/values/strings.xml :
Bineînțeles că, acestor fraze se mai pot adăuga și altele. Însă pentru început am introdus
numai frazele din figura de mai sus. Aceste string -uri sunt folosite în aplicație astfel:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
43
Cu ajutorul listei list de tip ArrayList se afișează la fiecare rundă o altă frază. Informațiile
despre jucători, precum n umele lor se preiau cu ajutorul unui dialogului ., generat prin codul :
Utilizatorului îi apare view-ul redat în Figura 4.1.1. 12:
Figura 4.1.1. 12- Dialog în android
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
44
La fel se procedează și pentru cel de -al doilea jucător. Pentru fiecare dintre cei doi jucători se
creează o variabilă de tip Player, unde stocăm informaț iile despre ei. Clasa Player ne ajută să
manipulăm datele mult mai ușor și este structurată astfel:
Layout -ul principal al acestei aplicații este format dintr -ul RelativeLayout care
cuprinde TextView -uri și 4 butoane principale . În următoarea imagine am să prezint o parte
din structura acestui layout:
După cum se observă relativul are un id: mainFraza și este așezat cu ajutorul
atributelor: gravity -așezându -l pe orizontal în centrul relativului , layout_below -specifică după
care component să se așeze, layout_marginTop , iar visibility este gone inițial.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
45
După toate TextView -urile, care constitui e fraza , sunt așezate cele 4 butoane
principale ale aplicației : Învârte Roata , Cumpără o vocală , Dau soluția și Folosesc un
indiciu . Acestea sunt create declarativ în fișierul activity_main.xml:
Butoanele sunt așezate și modelate cu ajutorul atributelor din imaginea anterioară.
Pentru a adăuga un eveniment butonului se folosește atributul – android:onClick,
specificându -se între ghilimele numele metodei care se dorește să se apeleze, aceasta având ca
parametru o variabilă de tip View . Fiecare text de pe aceste butoane are efecte realizate cu
ajutorul atributelor : android :shadowColor= "#222222", android :shadowRadius= "2",
android :shadowDy= "5", android :shadowDx= "5".
Culorile folosite în aplicație sunt stocate în folderu l: res/values/colors.xml
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
46
Acestea pot fi folosite în 2 moduri:
în designul procedural:
b[i].setBackgroundColor(getResources().getColor(R.color.pink));
în designul declarativ:
android:textColor="@color/white"
Cele 4 butoane din pagina principală au rolul cel mai important în aplicație. Prin
interacționare cu aceste butoane, aplicația știe ce să -i afișeze utilizatorului. La fel și
dialogurile generate la acționarea butoanelor sunt folosite pentru a interacționa cu jucătorul și
a afla ce dorește să facă în pasul respectiv, astfel oferindu -i și posibilitatea să se răzgândească .
Fiecare buton are pe onClick metoda handleMainFlow() .
Această metodă este gândită astfel:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
47
Clasa View – reprezintă blocul de bază ce cuprinde componentele din interfață cu
utilizatorul. Cu metoda specifică acestei clase: getId() pot să aflu care dintre componentele
interfeței este acționat. Astfel am realizat un switch() pe id -uri, iar în cazul în care butonul
Învârte Roata este apăsat : relativele de care nu am nevoie la aces t pas sunt puse gone , iar
cele care îmi sunt folositoare , la momentul actual, sunt visible . Dacă este acționat butonul
Cumpăr o vocală , atunci metoda checkScore() verifică scorul jucătorului curent și dacă are
suficiente puncte va afișa dialogul de confirmare a acțiunii, însă dacă nu are puncte destule va
apărea mesajul de eroare în care este informat de problemă ( Figura 4.1.1.13 ).
Figura 4.1.1.13 – Dialog de eroare
Metoda care verifică scorul jucătorului curent este:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
48
Pentru acționarea butonului Dau soluția apare , la fel , un dialog de confirmare (Figura 4.1.1.1 4).
Figura 4.1.1.1 4- Dialog de confirmare
Ceea ce este adus în plus pe acea stă versiune, față de versiunea de pe desktop este acest buton
numit Folosesc un indiciu , care prin acționarea lui se deschide un nou view ce conține o
imagine sugestivă și de folos utilizatorului pentru a putea ghici fraza . (Figura 4.1.1.1 5).
Figura 4.1.1.1 5- Indiciul rezolvării frazei
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
49
Roata este implementată după același principiu ca și în aplicația desktop, doar că
sunt folosite clasele specifice Android -ului. Clasa Paint pentru a seta style -ul și culorile, cu
care vreau să desenez . Clasa RectF pentru a specifica chenarul unde vreau să desenez roata.
Iar cu ajutorul metodei onDraw() din clasa Canvas am desenat roata. La fel se resetează
punctu l de început la fiecare iterație, pentru a desena toate părțile care formează roata.
Designul acestui layout este ilustrat în Figura 4.1.1.1 6:
Figura 4.1.1.1 6- Roata
Se observă că butonul de spin este acționat, deoarece a apărut toast -ul cu mesajul „Așteaptă..”
Culorile se generează random:
Fiecărei culoare i se atribuie un anumit punctaj. Totul depinde de norocul pe care îl are
utilizatorul .
Modalitatea de gândire pentru învârtirea roatei este aceiași ca pe versiunea de
desktop, d ar are unele îmbunătățiri, deoarece platforma Android îți oferă o multitudine de
clase și metode pentru a face un design interactiv.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
50
Butonului de spin îi este asociată metoda pe onClick() :
Apăsând acest buton se apelează metoda de mai sus, iar rotirea și schimbarea layout –
urilor se face prin metoda următoare:
Pe parcursul rotirii apare notificare a realizată cu ajutorul unui Toast , cu mesajul de
“Așteaptă… ”. Cu ajutorul handler -ului fac vizibile componentele dorite și le pun gone pe
celelalte. Handler -ul are o întârziere de câteva secunde dându -i utilizatorului posibilitatea de a
vedea punctajul obținut la roată , după care schimbă layout -urile.
Pentru a jon gla cât mai rapid și ușor cu layout -urile am realizat 2 metode, care sunt
apelate de fiecare dată când vreau să schimb layout -ul principal cu altele sau invers:
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
51
Layout -ul principal al aplicației este alcătuit dintr -o mulțime de textView -uri și
butoane. Designul folosit în crearea interfeței este unul declarativ, în cea mai mare măsură.
Simetria componentelor oferă utilizatorului un design plăcut și totodată îl ajută să utilizeze
aplicația mult mai ușor și rapid. În Figura 4.1.1.1 7 putem vizualiza layout -ul descris :
Figura 4.1.1.1 7- Layout -ul principal
TextView -urile colorate în alb îi arată utilizatorului cât de lungă este fraza, iar
textView -ul care nu conțin e nimic, arată sfârșitul cuvântului. Deci, componentele colorate în
albastru nu sunt folosite în runda curentă. Jucătorul curent este evidențiat prin faptul că
background -ul textView -ului ce conține numele acestuia este de culoare roșie .
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
52
La începutul fiecărei runde se inițializează textView -urile astfel:
După apăsarea oricărui buton din cele care conțin consoane sau vocale se verifică
dacă mai sunt litere de ghicit, iar dacă nu mai sunt se afișează dialogul de informare,
informându -l pe utilizator că runda s -a terminat și este menționat numele câștigătoru lui din
runda respectiv ă (Figura 4.1.1.1 8):
Figura 4.1.1.1 8- Dialog cu numele câștigătorului
Tot aici se verifică și dacă runda este 3, iar dacă este se pornește un thread cu ajutorul
clasei Handler și interfeței Runnable . Când runda este 3, atunci se ia timpul curent pentru
variabila date_end cu metoda : getInstance().getTime() din clasa Calendar . Timpul de la
începutul jocului este salvat într -o altă variabilă, astfel la acest pas se calculează durata
jocului , adică din date_end se scade date_begin pentru a afla durata . În timpul afișării
dialogului cu, cine a câștigat, se salvează în baza de date toate informațiile referitoare la
câștigător. Thread -ul are o întârziere de câteva secunde, pentru a se putea afișa dialogul c are
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
53
apare la sfârșitul fiecărei runde, iar numai apoi se afișează câștigătorul jocului, afișându -se și
scorul total.
Codul ce generează acest handler este:
Layout -ul care îi apare utilizatorului la momentul respectiv se regăsește în Figura 4.1.1.1 9:
Figura 4.1.1.1 9- Afișarea câștigătorului al acestui joc
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
54
După apăsarea butonului de OK apare layout -ul inițial, unde utilizatorul are
posibilitatea să joace din nou , apăsând butonul de Play, să vizioneze toți câștigătorii salvați în
baza de date, cu ajutorul iconiței de clasament , sau poate vedea informațiile despre aplicație
prin intermediul iconiței about .
Componentele de pe pagina principală au atașate fiecare pe onclick() aceiași meto dă,
adică handleStartFlow():
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
55
5. Manual de utilizare
5.1 Principiul de funcționare a jocului:
Dialogul preia numele fiecărui jucător.
Jocul este format din 3 runde.
În prima rundă, primul jucător începe jocul iar apoi alternează.
Jucătorul are următoarele posibilități:
– să învârtă de roată pentru a acumula puncte, iar apoi să
ghicească o consoană care se află în frază pentru a beneficia
de punctele obținute la roată.
– să dea soluția, pentru un punctaj fix de 700 de puncte.
– să folos ească un indiciu, care constă într -o poză sugestivă.
– și să cumpere o vocală, dacă are suficiente puncte, adică 500
de puncte.
Dacă ai apăsat butonul de „învârte ” nu poți apăsa decât pe consoane.
Când butonul de „Cumpără vocală ” este activ doar butoanele cu vocale
sunt vizibile.
Când învârți roata poți da fie pe un punctaj bun, care variază de la 100 –
2000 de puncte, fie pe „Faliment”
„Falimentul” îți aduce scorul total și parțial pe 0 și se trece la următorul
jucător.
Atunci când selectezi o consoană, dar ea nu se află în frază, vei fi
notificat, scorul parțial se pune pe 0 și se trece la celălalt jucător.
La finalul rundei, când toată fraza este descifrată, apare un dialog cu
numele jucătorului care a câștigat runda și scorul total actual.
Jocul se încheie cu o notificare printr -un dialog care conține numele
câștigătorului și scorul total pe toate rundele câștigate.
Câștigător este cel care are 2 sau 3 runde câștigate, fără a ține cont de
scor.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
56
În final se salvează în baza de date numele ju cătorului, scorul total de
pe toate rundele câștigate și durata jocului exprimată în secunde.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
57
6. Concluzii
În concluzie aplicația Roata Norocului , cu designul ei atrăgător și simplu este dedicat
tuturor utilizatorilor care iubesc aplicațiile de divertisment. Consider că simetria tuturor
componentelor conferă utilizatorului o plăcere în utilizarea aplicației.
Lucrarea este structurată și gândită ast fel încât să fie înțeleasă de oricine. Metodele create
sunt descrise, în mare, cum au fost gândite și la ce folosesc. Fiecare buton acționat apelează o
metodă specifică, acest lucru fiind exemplificat prin exemplele date.
Consider că structura acestei luc rări poate ajuta pe oricine să -și creeze propria aplicație.
Etapele pe care le -am parcurs pentru a realiza aplicația sunt evidențiate și bine exemplificate
în lucrare: prin cod, imagini și explicații.
Ceea ce m -a motivat să dezvolt această aplicație este pasiunea mea pentru jocuri, dar nu
orice jocuri și dorința de a învăța să programez în android. Orice joc, consider că trebuie să îți
trezească interesul, adică la fiecare pas să apară ceva la care nu te aștepți, să fie palpitant ca să
nu te plictisești. În ideea aceasta am creat roata, care îți ia aleator un anumit punctaj chiar și
„Falimentul”.
După părerea mea, această aplicație ajută la dezvoltarea intelectuală a utilizatorului.
Totodată îți dezvoltă și spiritul de observație și de competiție. Iar atenția la detalii trebuie să
fie în prim -plan pentru a reuși să câștigi ,având și un scor bun . Utilizatorul o să fie stimulat să
acumuleze cât mai multe puncte pentru a fi pe primul loc, astfel dezvoltându -se spiritul de
competiție.
În final, țin să specific că această aplicație vreau să o extind. Adică, acest joc multiplayer
să fie online. Astfel jucătorii având posibilitatea de a cunoaște și de a interacționa cu alți i prin
intermediul acestui joc. Așadar aplicația va avea nevoie de o bază de date imensă, unde vor fi
stocați acești utilizatori și bineînțeles că pentru fiecare joc în parte se va genera alte 3 fraze,
care nu au mai apărut, specifice fiecărei runde. Și pentru fiecare rundă în parte se va afișa
indiciul rezolvării frazei, toate aceste imagini vor fi stocate pe un server. Deci aplicația o să
trebuiască să a ibă conexiune la internet pentru a se putea desfășura jocul. În final, această
aplicație o să fie una f oarte complexă.
Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop
2016
58
7. Bibliografie
[1] Horia Georgescu , Introducere în Universul Java , Tehnica , București, 2002
[2] Cosmin Strilețchi, Mircea -Florin Vaida , Elemente de bază privind programarea
în mediul Java , Casa Cărții de Știință , Cluj -Napoca, 20 15
[3] http://math.hws.edu/eck/cs124/downloads/javanotes6 -linked.pdf
[4] http://sunt.gq/Android.pdf
[5] http://strawberry.ipworkshop.ro/introducere_android/curs/curs5
[6] http://www.itcsolutions.eu/2011/09/08/android -tutorial -concepte -activitati -si-
resurse -ale-unei-aplicatii -android/
[7] https://docs.oracle.com/javase/tut orial/2d/advanced/transforming.htm
[8] http://web.info.uvt.ro/~iordan/P_III/Cristian_Frasinaru –
Curs_practic_de_Java.pdf
[9] https://developer.android.com/training/multiple -threads/communicate -ui.html
[10] http://www.cs.columbia.edu/~coms6998 -8/lectures/lec4 -Android.pdf
[11] http://www.tutorialspoint.com/android/android_advanced_tutorial.pdf
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Implementarea unei aplicații de divertisment pentru dispozitive mobile și desktop [611704] (ID: 611704)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
