Proiectarea Si Elaborarea Aplicatiei Touch Me

Cuprins

Introducere

Odată cu apariția posibilității de a introduce datele pentru prelucrare în dispozitivele de calcul sa lucrat pentru a facilita aceste metode. Prima persoană care a creat un model de senzor care poate detecta atingerea într-un punct al unei plăci și transmiterea ca informție introdusă au fost E.A. Johnson savant al Institului Regal de Radare al Mari Britani în 1965-1967. Tentința de a moderniza a fost pe tot parcursul anilor de atunci pînă în prezent și putem presupune că și în viitor se va păstra. Tehnologiile care au fost cele mai populare bazate pe tehnologie touch au fost și sunt cele Rezistive și cele Capcitive care sau recomandat prin durabilitate, fiabilitate și preț ieftin de producție, în prezent se observă o scădere a utilizări touchului rezistiv datorită unui nivel de protecție scăzut și a unei tehnologi relative mai complicate și mai complexe de producere. Conform statistecelor aproximativ 70 % din cota de piață este acapartă de tehnologia Capcitiv Touch conform datelor din 2011, iar valoarea pe piața de dispositive mobile a acestei tehnologi pe piața dispozitivelor mobile a ajuns suma de 8 bilioane dolari S.U.A în anul 2012, conform acestor sondaje putem presupune că suma pe anii curenți va fi dublată sau triplată datorită mărirei numărului de dispozitive. Acest tip de sensor are o mulține de posibilități care urmează a fi implimentate cum ar fi detectarea amprentei, eliminarea definitivă a deformaților datorită factorilor externi, mărirea preciziei de atingere etc. În prezent sunt tendințe de a îmbina 2 tehnologi Touch petnru a obține mai bune perofrmanțe pentru anumite apilcații și domenii de utilizare, unul din promotori acestor inovații este companie niponă Panasoni.

Numărul dispozitivelor mobile ce sunt utilizate zilnic este peste 5.3 miliarde unități, iar până în 2015 doar producătorii cei mai mari planifică să mărească de trei ori vânzările și toate acestea fără a lua în considerație noile modele care vor fi întrebate pe piață și mai mult. Liderii în producerea dispozitivelor ce au ca platformă un sistem de operare mobil de ultima generație sunt companiile Google și Apple (deseori în alianță cu alte companii care se specializează în producerea microelectronicii , exemplu: Apple, Samsung , Lenovo, LG, Huawei) Conform datelor prestate de producători enumerași mai sus în primul trimestru a anului 2014 sau livrat 281.5 milioane de dispozitive mobile dintre care 85% au fost livrate de Samsung a cărui gamă de smartphone este bazată pe SO Android.

Toate dispozitivele mobile contemporane au un ”numitor comun” și anume tehnologiile senzoriale, care sunt una din cauzele ce au ridicat utilizarea lor la un nivel atât de înalt. În prezent observăm o tendință globala a tuturor producătorilor de a mări dimensiunele ecranelor a dispozitivelor mobile, astfel azi deja nu mai este o stranitate de a folosi un dispoziv mare, acest fap presupune dezvoltarea tehnologiei Touch Screen tot mai detaliat pentru a nu pierde din precizie și prețul de piață.

Actualitatea temei date rezultă din graficul ce urmează(Schema A), care ilustrează numărul dispozitivelor în baza SO iOS și Android apărute în ultimul timp.

Schema A.”Graficul de utilizare a dispozitivelor mobile bazate pe iOS și Android”

Datorită acestor cifre care ne arată că populația de azi este tot mai mult dependentă de tehnologiile noi și de implimentarea senzorului tuch pentru a face cît mai eficiente și mai simple aceste dispozitive utilizate zi de zi.

Scopul acestei lucrări este efectuarea unei analize comparative a tehnologiilor senzoriale utilizate a diferitor tehnologi pentru a aduce la cunoștință simplilor utilizatori, care dintre ele se recomandă de utilizat în anumite condiții, iar programatorilor începători, care sunt premisele dezvoltării aplicațiilor pentru SO Android utilizând tehnologia Touch Screen.

Teza este împărțită în 3 capitole care ne dezvăluia importanța și adevarata valoare a temei date. Primul capitol este baza știntifică a pricipiului de lucru a senzorului tuch, tipuri de senzori, avantajele și dezavantajele fiecărui tip. Capitolul doi ne caracterizează mediul de dezvoltare a aplicațiilor android și aplicația efectuată pentru a demonstra posibilitățile tehnologiei touch screen. Iar capitolu trei reprezintă concluzi, deducți și propuneri pe marginea temei date pentru a putea îmbunătăți și simplifica utilizarea dispozitivelor ce au la bază tehnologia dată.

Totodată, datorită cercetărilor efectuate în prezenta lucrare, a apărut posibilitatea elaborării unui nou program pentru Adroid bazat pe detectarea atingerii momentale și a atingerei swype, care ne va permite desenarea cu diferite nuanțe și modalități. Aplicația a fost elaborată într-un mediu de programare bazat pe limbajul JAVA și cu ajutorul programului Eclips(versiunea elaborată de companiea Google care presupune un adaus a Android SDK). Datorită că platforma este răspîndită gratis și este oferită toată documentația necesară pentru a crea noi aplicați pentru SO Android, putem găsi o vastă gamă de aplicații pentru diferite domenii, majoritatea sunt plasate pe Android Market.

În baza argumentelor, statistecelor și a datelor oferite putem spune că tema dată va fi actuală atîta timp cît nu vom crea alte metode ieftine, utile și practice pentru introducerea datelor pentru dispozitivele mobile, staționare și industriale.

I. Tehnologiile touch și implementarea lor în SO Android.

La baza oricărui dispozitiv touch evident se află senzorul. În prezent sunt o mulțime de dispozitive care folosest diferite tipuri de sensori touch datorită domenilor și modul de utilizare a dispozitivelor. Astfel putem deferenția următoarele tipuri de touch utilizate în industria morenă:

Rezistiv;

Capacitiv;

Capacitiv de Suprafață;

Project Capacitiv;

Mutual Capacitiv;

Auto-Capacitiv;

Infrared senzor;

Senzor optic;

Senzor acusto-pulsionar;

Sensor cu semnal de dispersie;

Însă din cauza că în prezent pe larg în industria de tehnologi inromaționale se folosec pe larg doar câteva tehnologi și anume Rezistivă și Project Capacitivă în continuare vom desfășura doar aceste dou-ă teme de bază.

I.1 Tehnologiile ”Resistive Touch” și ”Projected Capacitive”.

În timp ce sa dezvoltat tot mai mult dizpozitivile cu tastatură mecanică a apărut o întrebare care a adus o nouă eră în metodele de intrare a informților, și anume: ”Cum de mărit dimensiunele ecranului însă să păstrăm dimensinele normale pentru un dispozitiv mobil?”

Răspunsul la acestă întrebre este simplu, prin utilizrea a unei noi metode de intrare a informației și anume metoda cu senzori, care permite mărirea ecranului astfel de tastura mecanică nu mai nevoie. Datorită parametrilor de transparență și cei economici a fost luată decizia de a folosi sensozi touch pentru a putea introduce datele dorite. În prezent este o gama largă de senzore touch care sunt oferite pe piață cum ar fi:de tip rezistiv, capacitiv, infrared grid, unde sonore, optic-imaginar etc.

Însă din motive că pe despozitivele mobile se folosesc doar două tipuri și anume cele de tip Rezistiv și Capacitv, în continuare anume aceste două tehnologi le vom studia mai amănunțit.

I.1.1 Tehnologia ”Resistive Touch”.

Tehnologia ”Resistive” este cea mai răspândită tehnologie senzorială. Este o soluție relativ ieftenă și poate fi găsită pe majoritatea dispozitivelor cu ecrane tactile. Răspândirea s-a enormă a căpătat-o datorită posibilității de utilizare a mulțimii de obiecte de intrare (ex: degete, stylus tare și moale etc. )

Beneficii:

Dispozitive ieftene

Suportă o varietate de dispozitive de intrare

Sunt simple în utilizare și prezintă fiabilitate.

Funcționarea Rezistivelor

Există rezistive cu 4-fire, 5-fire, 7-fire și 8-fire, însă cel mai răspândite sunt cele cu 4-fire. Rezistivele cu 4 fire sunt compuse din straturile intercalate de sticlă OIS (oxid de indiu-staniu) și PET (polietilenă tereftalată) m acest proces este ilustrat în Figura N.1. Sticla este folosită pentru stabilitate mecanică, iar PET-ul asigură flexibilitatea mediului grație căruia cele două părți sunt conectate. Microdelimitatorii (2) separă straturile asigurând protecția de la intrări accidentale . Ele sunt efectuate de către producător, fapt ce permite controlul riguros asupra preciziei respectării tuturor dimensiunilor, densităților și a altor caracteristici. Densitatea punctelor determină metoda de interacțiune a panelului tactil asupra acțiunilor de intrare, densitatea joasă este destinată răspunderii la acțiunea degetului uman, pe când densitățile mari răspund la acțiunea obiectelor de tip stylus.

Figura N.1 „Straturile de pelicule în tehnologia Rezistivă.”

Opresiune pozitivă de aer între straturi și o construcție ermetică previne pătrunderea prafului de la intrarea în panou. Operațiune de bază  efectuată de panourile rezistive este prezentată în Figura N.2.

Strat dur

Peliculă PET

OIS strat

Bezel

Sticlă

Microdelimitatorii

Contactul dintre straturile OIS

Figura N.2 „Modul de lucru al touch-lui Rezistiv.”

Concomitent cu instalarea microdelimitatorilor, este adăugat și un accesoriu , care este plasat dea lungul laturilor . Acesta permite prelungirea vieții a peliculei din PET, îndeosebi datorită rezistenței față de acțiunile forțate de stylus (Figura N.3).

Figura N.3 „Punțile de delimitare.”

Punctul (B) împiedică pelicula din punctul (A) să ajungă la o stare astfel de ascuțită încât să poate dăuna construcției ermetice. Deformarea din acest punct slăbesc peliculele PET și OIS , respectiv oferind posibilitatea apariției problemelor premature in realizările necalitative. (Figura N.4.)

Figura N.4 „Modul de atingere a Touch-lui Rezistiv.”

În Figura N.5 este demonstrat în ce modalitate startul OIS bazat pe sticlă poate fi folosit pentru a măsura tensiunea în scopul determinării punctului de atingere.

Stratul OIS bazat pe PET, funcționează în mod analog însă el determină mișcările în direcția perpendiculară senzorului.

Măsurările Y – start OIS bazat pe sticlă Măsurările X – strat OIS bazat pe PET

Figura N.5 „Tipurile de Măsurări.”

Un microcontroler Serial sau USB în urmare înștiințează sistemul că a avut loc o acțiune asupra panelului senzor deoarece el urmărește variațiile tensiunii pe fiecare strat.

Strat dur

Polimer conductiv

Figura N.6 „Grosimea straturilor.”

Stratul dur poate suporta peste 200000(Figura N.6) de acțiuni cu stylus –ul fără careva degradări exterioare sau fizice (a proprietăților sale). Însă dispozitivele mobile , sunt foarte des utilizate, din care motiv rezistivele foarte rapid în lipsa respectării prescripțiilor tehnice ajung într-o stare nu prea plăcută pentru utilizator.

I.1.2 Tehnologia ”Projected Capacitive”

Utilizarea tehnologiei capacitive ne oferă o listă largă de beneficii, cele mai importante sunt :

Termen lung de exploatare

Proprietăți optice excelente

Multi-touch

Implementarea nedificilă

Totodată ecranele capacitive pot fi confecționate în întregime din masă plastică , ceea ce le oferă o flexibilitate și durabilitate enormă. Ele pot reacționa la interacțiunea cu bumbacul sau mănuși chirurgicale, fapt ce sporește gama instrumentelor de intrare. Deoarece stratul superior al tactilelor este efectuat din sticlă, ele opun rezistență majorității substanțelor chimice și funcționează cu ușurință la temperaturi extreme. În comparație cu tehnologia rezistivă, capacitivele sunt mai costisitoare.

Din neajunsuri pot fi evidențiate doar doua, care în raport cu dispozitivele mobile pot fi total neglijate:

Ca obiecte de intrare poate servi numai degetul uman sau careva adaptări speciale ale lui (ex. mănuși chirurgicale…)

Suprafața maximă a unui ecran tactil ce utilizează capacitivele este de 24”.

Funcționarea Capacitivelor

În Figura N.7 este prezentat cum tehnologia auto-capacitivă este implementată în ecranele tactile.

Figura N.7 „Tehnologia auto-capacitivă.”

Însă auto-capacitratul superior al tactilelor este efectuat din sticlă, ele opun rezistență majorității substanțelor chimice și funcționează cu ușurință la temperaturi extreme. În comparație cu tehnologia rezistivă, capacitivele sunt mai costisitoare.

Din neajunsuri pot fi evidențiate doar doua, care în raport cu dispozitivele mobile pot fi total neglijate:

Ca obiecte de intrare poate servi numai degetul uman sau careva adaptări speciale ale lui (ex. mănuși chirurgicale…)

Suprafața maximă a unui ecran tactil ce utilizează capacitivele este de 24”.

Funcționarea Capacitivelor

În Figura N.7 este prezentat cum tehnologia auto-capacitivă este implementată în ecranele tactile.

Figura N.7 „Tehnologia auto-capacitivă.”

Însă auto-capacitivele sunt utilizate in marea sa parte in altfel de dispozitive, pe când Capacitivele –reciproce sunt destinate anume dispozitivelor mobile. Capacitivele-reciproce reprezintă însăși tehnologia ”Projected Capacitive”. Ele reprezintă o continuitate de circuite care străpung toată suprafața tactilului, și la momentul interacțiunii fie cu un deget, controller-ul detectează în ce coordonată a avut loc atingerea.(Figura N.8)

Figura N.8 „Capacitivele-reciproce.”

În comparație cu auto-capacitivele, capacitivele-reciproce oferă o metodă mult mai simplă de determinare a coordonatelor de interacțiune, permițând la fel selectarea multiplă concomitentă (multi-touch)

În Figura N.9 este demonstrată implementarea capacitivelor-reciproce în ecranele tactile.

Figura N.9 „Capacitivele-reciproce.”

Ecranele tactile capacitive sunt numite ”scanate” datorită structurii matriciale a suprafeței prin care se calculează coordonatele punctelor active. Pentru a determina coordonatele exacte, este citit rândul/coloana rezultantă și contoarele folosite pentru triangulația anumitei locații tactile. Rezultatele sunt extrem de precise, rezoluția constituind 1024 x 1024 (zece bit). Scanarea de asemenea permite evitarea devierii coordonatelor. Acesta este posibilă datorită faptului că rândurile și coloanele sunt fixate fizic și toate calculele sunt efectuate in zone foarte mici. Datorită lipsei de deviere a coordonatelor , utilizatorul nu are nevoie de calibrare permanentă a ecranului tactil. Practic unica ”eroare ” care poate apărea este neacționarea la mișcările utilizatorului dacă ele for fi extrem de lente (fapt ce este iarăși practic imposibil)

Structura panelului tactil

Odată cu începerea utilizării tehnologiei Projected Capacitive care a fost prezentată în iPhone/iPod touch si care au stat la baza dezvoltări acestei tehnologi, a apărut o imensitate de metode de constituire a plăcilor tactile. Însă toate au două momente importante comune, mecanismul de senzor care se află în urma suprafeței tactile și utilizarea componentelor rigide. O structură clasică a tehnologiei este prezentată în continuare.(Figura N.10)

Figur N.10 „Structura Capacitive in iPhone/iPod touch.”

În dispozitivele Apple și Google structura ecranului este următoarea:

Stratul exterior din sticlă (1)

Întărit cu cavități și fisuri artificiale , dimensiunea variază de la 0.75 – 1.1 mm

Adeziv optic (2)

Oxid de indiu-staniu (OIS) (3)

Plasat în partea superioară a plăcii din sticlă având perimetrul efectuat din molibden/aluminiu/molibden

Sticlă (4)

0.55mm sau 0.75mm

Oxid de indiu-staniu (OIS) (5)

Plasat în partea superioară a plăcii din sticlă având perimetrul efectuat din molibden/aluminiu/molibden

Figura N.11 „Structura ecranului.”

Cu toate că ecranele tactile utilizate de dispozitivele în bază de iOS și Android au aceeași structură (acest fapt este posibil datorită brevetului de invenții înregistrat independent de aceste brand-uri ), ele diferă după modelul de implementare a stratului conductor a tactilului, numit în continuare pattern.

Patern-ul în dispozitivele cu Android:

Paternul constă este constituit din ”diamante centralizate” constituite pe bază de pătrate plasate sub unghiuri de 45° conectate din două părți cu micro-punți. Acest patern este realizat din două straturi, cel cu rânduri și respectiv al doilea cu coloane. Fiecare strat este combinat din partea interioară cu două unități de sticlă combinate intre ele de către diamantul centralizat. Dimensiunea diamantului variază în funcție de producător, însă dimensiunile lui nu depășesc 4-8mm.(Figura N.12)

Tehnologia dată mai este numită și tenologia G/G ( Glass – Glass ) adică folosirea sticlei duble, una pentru protecția anti zgîrieturi și lovitur și una pentru panelul touch.

Figura N.12 „Patern-ul în dispozitivele cu Android.”

I.1.3 Tehnologia ”Projected Capacitive OGS”

În prezent se folosește pe larg tehnologia OGS ( „One Glass Solution” ), acesta presupune aplicarea stratului touch direct pe stecla de protecție a ecranului dispozitivului mobil. Această tehnologie ne permite să eliminăm stratul de aer dintre touch și ecran astfel creaînd probleme cu reflectarea dublă a luminelor solare care duce la înrăutățirea calități imagini finale afișate la ecran.(FiguraN.13)

Figura N.13 „Reflectarea dublă în tehnologiea obișnuită și reflecția în tehnologia OGS.”

Odată cu apariția acesteia în 2012 acestă tehnologie a fost una de bază care sa dezvoltat în tehnologia touch, ea a adus următoarele avantaje comporativ cu tehnologia G/G și anume :

Eliminare reflecției duble.

Scăderea prețului de producere.

Micșorarea greutăți și a grosimei sticlei.

Totuși este un mare neajuns referitor la tehnologia OGS, acesta presupune rezistența la lovituri care este mai scăzută de cît a tehnologiei G/G. Însă în timpul de fața se lcurează la o sticlă călită mai trainică care va elimina acest neajuns.

Metoda de producți a acestei tehnologi este simplă și eficientă (Figura N.14), aceasta se paote descri în cinci pași:

Sticla curată și călită.

Baia de săruri și anume alumino-silcat.

Obținerea stratului capacitativ.

Tăerea linelor de conducere în stratul dat.

Obținerea sensorului touch pe suprafața de sticlă.

Figura N.14 „Tehnologia de producere a sensorului Touch OGS.”

I.2 Implementarea tehnologiilor touch în SO Android.

Cu toate că la momentul dat ambele tipuri de dispozitive au o implementare foarte asemănătoare a tehnologiei din punct de vedere fizic, rămâne o diferență imensă între implementările în software.

Diferența dată este cauzată în mare parte de politica ”conservativă ” a ”Apple” și cea ”inovativă ” a companiei ”Google”.

I.2.1 Clasele de bază.

Android, datorită diversificării versiunilor sale, și dispozitivelor suportate nu a avu posibilitatea creării unei tehnologii standarde asemenea celei de la Apple. Astfel Google a creat o structura de Framework-uri independente destinate rezolvării sarcinilor propuse indiferent de modelele dispozitivelor.

Clasele destinate prelucrării gesturilor

Dispozitivele cu ecranele tactile, pot interacționa la o varietate de gesturi (atingere simplă, alunecare, pinch etc.). Pentru a asigura recunoașterea tuturor gesturilor Google a introdus ”android.gesture API”. (Figura N.15)

Figura N.15 „Structura biblioteci gesture.”

Implementarea acestor gesturi în continuare pentru programator nu prezintă nici o dificultate, toate sunt asociate cu un identificator, și pot fi apelate cu ușurință.

Clasele destinate prelucrării resurselor multimedia

Platforma Android oferă suport incorporat pentru prelucrarea resurselor audio/video de o variante largă de extensii , pentru asigurarea incorporării acestora în aplicații.

De asemenea variată este și locația acestor resurse, deoarece clasa ”MediaPlayer” poate prelucra resurse atât locale cât și cele aflate la distanță, prin intermediul protocolului HTTP.

Totodată utilizatorul dispozitivului cu Android are posibilitatea de a înscrie resurse audio/video. Acest fapt este asigurat datorită clasei ”MediaRecorder”, care deține toate instrumentele necesare pentru înscrierea datelor multimedia.

Clasele destinate stocării datelor

Privitor stocarea datelor, Android oferă o gamă largă de posibilități. Alegerea este unei variante depinde doar de soluția ce urmează sa fie atinsă și de limitele care există , de exemplu dacă datele trebuie sa rămână private, sau din contra – partajate către alte aplicații , sau de volumul ocupat de aceste date.

Programatorul poate alege una din următoarele opțiuni:

”Shared Preferences” – stochează date private primitive in perechi cheie-valoare

”Internal Storage” – stochează date private in memoria dispozitivului

”External Storage ” – stochează date publice intr-un spațiu extern partajat.

”SQLite Database” – stochează date structurate într-o bază de date privată

”Network Connection” – stocarea datelor pe propriul web server.

Una din pricipalile avantaje a dispozitivelor bazate pe sitemul Android este posibilitatea de a extinde memoria internă cu ajutorul cartelelor de memorie externe, sitemul de determină ca putătoare de informație și orefă acces la toată informașia disponibilă. Un alt avantaje este că memoria internă poate fi eliberată cu ajutorul transferului a apilcaților pe memoria externă drept rezultat este eliberarea memoriei interne și mărirea rapidități de lucru a sistemului. Deja un avantaj dependent de producători de Procesoare este posibilitatea prin elemente periferice (OTG cabluri) de a conecta memori USB de diferite capacități.

I.2.2 Tipurile de atingeri.

Pentru a putea efectua diverse modificări pe suprafața de lucru a unui dispozitiv android au fost implimentate cele 3 metode de detectare a atingeri și anume :

Single Touch –atingerea simplă, doar una.

Multi Touch – atingerea multiplă.

Gesturi – atingerea multiplă cu ajutorului unui singur obiect, astfel se crează o cale a atingeri care ulterior este prelucrată de către dispozitiv.

Cu ajutorul acestor inovați a fost posibilă scalarea fotografilor, paginelor web sau a detectarea gesturilor pentru comenzi rapide de system. Odată cu implimentarea acestor metode lucrul cu dispozitvul a fost mult mai diversificat și mai accesibil.

Metoda Single Touch.

Acesta este una din cele mai des utilizate metodă la introducere datelor, ea reprezintă detectarea atingeri cu ajutoru coordonatelor x și y care sunt oferite de către sensor, astfel sistemul de operare detecteazăunde a fost efectuată atingerea și găsește obiectul amplast pe ecran la cordonatele date, ca rezultat obținem stare dorită a obiectului dat în dependență de cite ori am apelat la el. În Tabela N.1 de mai jos vom putea vedea care dintre flaguri se stabilesc la atingerea simplă, multiplă și la gesturi.

Tab. N.1 „Evenimentele inițiate la atingerea senzorului.”

Metoda Multi Touch.

Metoda dată a fost implimentată în versunea Android 2.0 și reperfectată în versiunea 2.2, datorită acestei implimentări a fost posibilă mărirea obiectelor mai ușor tot odată au fost adăugate mai multe inovați care aveau nevoie de două atingeri concomitente pentru a efectua sarcina dorită.

Ea se bazează pe un sir de pointeri care reprezintă o punctele atinse și care conțin coordonatele punctului dat și indexul acestui pointer care coincide cu numărul de atingeri concomitente. Tot odată sistemul foloseste această metodă doar atunci cînd depistează ca a fost creată încă o atingere nu doar ce-a existent curent ce ne dă un cîștig la resursele folosite de sistem și cele disponibile a dispozitivului utilizat.

Metoda de detectare a Gestelor.

Gesturile sau cum mai sunt numite swip-uri sunt atingerea multiple doar că este utilizat doar un punct inițial și este păstrată calea punctului creat inițial, astfel putem efectua diferite gesture sau chiar scri anumite caractere pe care sistemul de operare îl va determina și îl va propune spre exminare utilizatorului ca unu corect sau incorect. Un gest presupune în sine un pointer care are ca conșinut coordonatele inițiale și restul coordonatelor pînă la cel final cu pasul de mărimea 1.

II. Proectarea și elaborarea aplicației ”Touch Me”.

În capilul dat vom lua cunoștințe de bază referitor la crearea unui proect de aplicație pentru SO Android și vom arăta funcționalitatea aplicației create. Capitoul dat are o importanță majoră deoarece este lucrul aplicativ referitor la utilizarea tehnologiei Touch Screen și implimentarea a diverse modalități de introducere a datelor cu ajutorul acestuia.

II.1 Instrumente și limbaje aplicate.

Pentur a eleabora programul dat am folosit un șir de instrumente și limbaje care sunt elaborate special pentru SO Android, principalul limbaj de elaborare aplicaților pentru Android este: Java, XML și C. În lucrarea dată am folosit doar Java pentru a putea manipula cu obiectele create și de a îndepli funcțile necesare pentru crearea aplicației iar pentru interfața grafică a plicației am folosit XML.

Totodată am folosit Eclipse, instrumentul care este gratuit pentru descarcre de pe site-ul oficial al SO Android, însă el este folosit doar ca program de editare și descifrare a limbajului dat, pentru a putea compila și porni aplicația creată este necesar de scos și biblioteca împreuna cu compilatorul necesar adica Android SDK care la fel este oferit gratuit de către companiea Google.

II.1.1 Limbajul folosit pentru elaborarea aplicației.

Principalul limbaj utilizat în elaborarea aplicației este Java deci în continuare vom descrie clasele și funcțile utilizate din limbajul dat. Java este un limbaj de programare orientat-obiect, puternic tipizat, conceput de către James Gosling la Sun Microsystems (acum filială Oracle) la începutul anilor 90, fiind lansat în 1995. Cele mai multe aplicații distribuite sunt scrise în Java, iar noile evolutii tehnologice permit utilizarea sa și pe dispozitive mobile gen telefon, agendă electronică, palmtop etc. În felul acesta se creează o platforma unică, la nivelul programatorului, deasupra unui mediu eterogen extrem de diversificat. Acesta este utilizat în prezent cu succes și pentru programarea aplicațiilor destinate intranet-urilor. Pentru elaborarea aplicației am folosit principalile clase importate în programul dat:

android.view.MotionEvent – Evenimentele de mișcare descrie mișcările în ceea ce privește un cod de acțiune și un set de valori axe. Codul de acțiune specifică schimbarea de stat care a avut loc, cum ar fi un indicator merge în jos sau în sus. Valorile axelor descrie poziția și alte proprietăți circulație.De exemplu, atunci când utilizatorul atinge primul ecran, sistemul oferă un eveniment de atingere a corespunzătoare View cu ACTION_DOWN cod de acțiune și un set de valori axe care includ coordonatele Y de atingere și informații despre presiune, dimensiunea X și și orientarea zona de contact.Unele dispozitive pot raporta multiple urme de circulație, în același timp. Ecrane multi-touch emite o urmă mișcare pentru fiecare deget. Degetele individuale sau alte obiecte care generează urme de mișcare sunt menționate ca indicii. Evenimentele de mișcare conțin informații despre toate indicii care sunt active în prezent, chiar dacă unii dintre ei nu s-au mutat de la ultimul eveniment a fost livrat. Numărul de indicii vreodată doar schimbări de unul ca indicatori individuali merge în sus și în jos, cu excepția cazului în care gestul este anulat. Fiecare indicator are un ID unic care este atribuit atunci când primul se duce în jos (indicat de ACTION_DOWN sau ACTION_POINTER_DOWN). Un ID indicatorul rămâne valabilă până când indicat.

android.graphics.Canvas – Clasa Canvas deține "trage" apeluri. Pentru a desena ceva, ai nevoie de 4 componente de bază: un bitmap de a organiza pixeli, o pânză pentru a găzdui apelurile Draw (scris in bitmap), un desen primitive (de exemplu, rect, Path, text, bitmap), și o vopsea (pentru descrie culori si stiluri pentru desen).

android.view.Menu – În mod implicit, orice activitate sprijină un meniu de opțiuni de acțiuni sau opțiuni. Puteți adăuga elemente în acest meniu și gestiona clic pe adăugiri tale. Cel mai simplu mod de a adăuga elemente de meniu este umflarea un fișier XML în meniul prin MenuInflater. Cel mai simplu mod de a atașa cod de click-uri este prin onOptionsItemSelected (MenuItem) și onContextItemSelected (MenuItem).

android.graphics.Path – Clasa Calea incapsulează compus (contur multiplu) căi geometrice formate din segmente de linie dreapte, curbe pătratice, și curbe cubi. Acesta poate fi trase cu canvas.drawPath (cale, vopsele), fie umplut sau mangaiam (bazat pe Style vopselei), sau poate fi utilizat pentru tăiere sau a trage textul pe o cale.

Din clase folosite am avut unele funcți care sunt de bază pentru detectarea atingeri și transmitearea parametrilor pentru desenararea calei atingerii sau a unei simple atingere, pentru acesta am folosit metodele date:

public Path (Path src) – crează o nouă calea și păstrează datele în variabil de tip Path.

Event.getX() și Event.getY() – funcțile care răspund de detectarea de către system a coordonatelor peaxele X și Y.

public boolean onCreateOptionsMenu(Menu menu) – ne permite crearea unui meniu care va desparea la atingerea ecranului, tot odată ne permite crearea a unei liste de opțiuni în lista dată.

Pentru crearea interfaței grafice am utilizat XML care ne permite aranjarea obiectelor grafice sau a textului care este necesar de a fi afișa, acesta constă din unele tag-uri care se utilizează într-o ordine anumită. XML este un meta-limbaj de formatare a obiectelor grafice recomandat de Consorțiul Web pentru crearea de alte limbaje de marcare, cum ar fi XHTML, RDF, RSS, MathML, SVG, OWL etc. Aceste limbaje formează familia de limbaje XML. Meta-limbajul XML este o simplificare a limbajului SGML (din care se trage și HTML) și a fost creat în scopul exportului de date între aplicații pe internet, descriere structură date. XML este acum și un model de stocare a datelor nestructurate și semi-structurate în cadrul bazelor de date native XML. Cu ajutorul codurilor javascript, php etc. fișierele XML pot fi înglobate în paginile de internet, diverse aplicati, etc. cel mai elocvent exemplu este sitemul RSS care folosește un fișier XML pentru a transporta informațiile dintr-o pagină web către mai multe pagini web.

Avantaje:

extensibilitate (se pot defini noi indicatori dacă este nevoie);

validitate (se verifică corectitudinea structurală a datelor );

oferă utilizatorilor posibilitatea de a-și reprezenta datele într-un mod independent de aplicație;

XML este simplu și accesibil (sunt fișiere text create pentru a structura, stoca și a transporta informația);

poate fi editat, modificat foarte ușor (necesită doar un editor text simplu precum notepad, wordpad etc.);

II.1.2 Instrumentele utilizate.

Pentru a crea aplicația dată am folosit mediu de dezvoltare Eclipse open-sourse perponderent folosit pentru limbajul Java, tot odată el poate fi folosit și pentru alte limbje cum ar fi C, C++, COBOL, Python, Perl și PHP. Însă am folosit anume versiunea răspândită de companiea Google care a modificato oleacă pentru a fi mai comod de programat anume pe SO Android. Aceasta se poate descarca gratuit de pe site-ul oficial al companiei Google și anume ” https://dl-ssl.google.com/android/eclipse/”, tot pe site-ul oficial este oferită instrucțiune detaliată de instalarea a softului dat, deci se poate de folosit foarte ușor și rapid acest instrument, este de menționat că acestă versiune este deja cu Android SDK încorporată deci nu mai necesită instalări adăugatore. După instalarea softului dat este necesar de descărcat mașina viruală Android și alte biblioteci utile pentru versiune noi care nu sunt în Eclipse acesta se face prin aratarea calei de descarcare a pachetelor necesare și a versiunei dorite, această etapă tot este descrisă pe site-ul oficial(Figura N.16).

Figura N.16 „Instalrea a unui nou soft pentru programarea aplicației.”

După configurarea cu success vom obține un soft funcțional care ne va permite de a elabora o aplicație în mediul dorit de dezvoltare, evident în cazul nostrum vom alege un proect de genul Android Application Project, pentru acesta vom urma calea File-New Project- Android Application Project. Alegând opțiunea dată vom fi rugați să dăm un nume aplicației care dorim să o creăm(Figura N.17), și să introducem versiunea de Android care va fi compatibilă aplicația noastră, prima este versiunea de început a compatibilităț, iar a doua va fi versiunea finală de compatibilitate, evident acesta fiind ultima versiune disponibilă. Tot aicea vom alege tema dorită pentru bara de acțiune a plicației date, aicea având drept ca alegere o varietate din 4 opțiuni și prima fiind nulă adică Android o va folosi pe cea nativă existentă în SO utilizat de dispozitiv. Odată cu îndeplinirea a tuturor cânpurilor vom apăsa butonul Next care ne va deschide o noua fereastră, acesta ne va oferi date referitor la locul de păstrare a proectul creat, crearea a imaginei de pornire, crearea activității

Figura N.17 „Crearea unei aplicați Android.”

etc. vom avea necesitatea de a apăsa doar butonul Next fără a modifica ceva. Următoare fereastră ne va da posibilitatea de a alegea imaginea de pornire a aplicației sau dacă nu o avem o vom folosi pe cea standartă care este deja scalată pentru toate tipurile de ecran, se poate de folosit ca imagine de pronire un text anumit sau o animație creată. Tot aici putem alege cum va fi forma fundalului și culoarea a imaginei de acces la aplicație(Figura N.18).

Figura N.18 „Alegerea imaginei de pornire.”

Acesta find ultimul pas importatnt, apoi apasăm Next și Finish. În rezultat obținem un nou proect care are deja create unele clase și poate rula ca o simplă aplicație care va afișa ”Hello world”(Figura N.19).

Figura N.19 „Aplicația Android creată inițial.”

Odată cu finisarea creării proectului dat putem deja lucra asupra efectuării și modelării aplicației dorite, folosind deja clasele și obiectele create. Astfel se poate spune că Android SDK ne ajută la crearea proectelor și ne simplifică scopul propus spre realizare.

II.2 Prezentarea Aplicației Touch Me.

Crearea unui proect nou a fost primul pas necesar în elaborarea aplicației, adică a fost fundamentul în crearea aplicații, acuma vom studia ce și cum a fost aplicat pentru a reuși de a citi și a detecta atingerea pe ecranul unui dispoitiv cu Android. Tot odată pentru a putea testa și elabora aplicația în timp real am folosit un dispozitiv bazat pe SO Android Ver.4.1.2 care a fost concectat în regim de testare a aplicației. La finele acestui capitol și în anexe vor fi prezentate rularea aplicației create pe diferite dispozitive.

II.2.1 Algoritmul și logica Aplicației.

Înainte de a începe explicația fiecărei porțiuni din programul elaborate vom determina principalile clase și fișiere care sau utilizat pentru aplicația dată.

Pachetul de bază se numște touch.me și el conține șase fișiere de bază pentru aplicația dată și anume:

ColorSelect.java – Este fișierul care are drept scop de a vizualiza fereastra pentru selectarea culori dorite la și transmiterea la clasa pricipală pentru înlocuire.

MainPaint.java – Răspunde de toate activitățile care se crează în timpul rulări programului și de desenarea însăși.

Graphics.java – Determină orientarea ecranului și amplasarea obiectelor care sunt la moment pe ecran.

PictureLayout.java – Prelucrează exepțile care apar la disenare.

Places.java – Crează mapa pentru păstrarea imaginelor dacă nu este creată și salvază imaginea creată.

Splash.java – Conține un subprogram care ne arată o imagine de întimpinare și apelează la programul de bază după o perioadă de timp.

Diagrama claselor este reprezentată în Anexa B, acolo putem observa dependența claselor și variabilile utilizate. Observăm că unele clase nu sunt dependente una de alta astfel ele sunt clase independente care sunt doar apelate petnru a efectua anumite proprietăți ale programului. Clase care nu au dependență sunt : Splash , Places, PictureLayout. Aceste sunt clase care răspund de elementele periferice a programului, adică utilizarea lora este de cele mai dese ori doar unică în rularea programului. În Anexa C se va prezenta codul sursă a fișierului MainPaint.java pentru a arăta procesele și funcțile de bază care sutn folosite în programul dat.

Vom începe cu elaborarea fucților care ne permite detectarea atingeri și a swype-ului adică trasarea unei căi a atingeri. Pentru aceasta vom apela la fucțile descrise mai sus și anume event.getX() și event.getY() care ne permit detectarea coordonatelor atingeri și păstrarii acestea în două variabile reale care se vor transmite la funcția de desenare a punctului atins și a drumului parcur de către deget pe ecran. Folosind metoda onTouchEvent(MotionEvent event) putem detecta atingerea în trei momente: la atingerea ecranului, la trasarea unei căi pe ecran și la ridicarea degetului de pe ecran(Figura N.20).

Figura N.20”Codul sursă pentru citirea atingerii în diferite ipostaze.”

Observăm că în Figura N.20 fiecărui mod de atingere sunt apelate diferite funcții care ne permit detectarea punctului de atingere sau de a detecta un șir de atingeri. Funcția invalidate() este necesară pentru a forța funcția OnDraw() (Figura N.21) de a desena obiectele care le avem pentru detectare atingerea, adică desenarea a cerculilor și calea atingerilor.

Figura N.21 „Desenarea obiectelor la atingere.”

Parametri x,y și path sunt transmiși de către funcțile care ne permit determinarea lor, acestea sunt preznetate în (Figura N.22). Iar parametri mPaint, paint, pain, mBitmap și mBitmapPaint sunt predefiniți în codul programului care este prezent în Anexa B a lucrării date.

Figura N.22 „Detectarea coordonatelro și înscrierea în vectorul path.”

Tot aicea se poate de observat că am folosit o constantă statică care ne va permite deplasarea degetului pe ecran, este un pas pe care îl comparăm cu deplasarea de coordonate și dacă corespunde condiției atuncea deplasăm datele după formula de mai sus. Observăm că sunt metode de păstrare a coordonatelor pentru fiecare modalitate de atingere. Determinarea și prelucrarea atingeri este doar o parte din program, mai este necesar de afișat la ecran informației și a meniului pentru selectarea opțiunelor care sunt disponibile.

Meniul este deja creat din programul principal însă avem necesitatea de a introduce și opțiunele de care avem nevoie, pentru acesta vom folosi metoda onCreateOptionsMenu(Menu menu) (Figura N.23), ea ne permite să creăm meniulu utilizând adăugarea elemtelor după algoritmul că primul element al meniului este de bază, iar restul elementelor vor avea ca punct de reper primul element. Astfel pozitia elementelor în meniu este determinată de suma poziției primului element cu pasul necesar .

Figura N.23 „Crearea opțiunelor de meniu.”

După crearea opțiunelor meniului este necesar de a defini fiecare opține care va fi selectată pentru asta vom folosi funcția onOptionsItemSelected(MenuItem item), acesta are ca scop metoda case care ne permite de a determina ce obiect a fost atins și al selecta din lista disponibilă în funcție dată astfel se va efectua un șir de metode necesare. În cazul selectări elementului ”Info” din meniul dat acesta va apela funcția care ne permite creări unei noi ferestre care va afișa un mesaj despre programul dat și va propune de a Aproba sau Respinge de a lăsa un comentariu pe sit-ul unde este amplasată aplicația pentru descărcare.

Una din proprietățile posibile a programului este stocarea imaginei create în memoriea dispozitivului dat, acesta a fsot posibilă datorită utilizări clasei Places care are ca scop crearea unei mape pentru stocarea imaginelor în memoria externă a dispozitivului (Figura N.24) și de salva un fișier temporal care se va crea la pornirea programului pentru a fi împlut sau șters la ieșire din el. Observăm că limbajul java are funcți native pentru procesul dat care sunt ușor efectuate de So Android.

Figura N.24 „Crearea unei mape pentru stocarea imaginelor.”

II.2.2 Lucrul aplicției Touch Me pe un dispozitiv Android.

Pentru a putea utiliza aplicația dată a fost nevoie de un dipozitiv perfomant care funcționează pe SO Android deoarece emulatorul care este încorporat în Eclipse nu ne permite lucrul cu sensorul Touch. Deci pentru acesta am utilizat un telefon mobil care are un sensor de tip Capcitiv cu un ecranului de 4.5” și o rezoluție de 960×540 pix. dar și pe multe alte dispozitive care sunt pe platforma mobilă Android pentru a detecta dacă sunt unele probleme la lucrul cu diferite dimensiuni ale ecranului. Explicația detaliată a aplicației rulată pe dispozit este detaliată în Anexa A.

Concluzii.

În urma efectuării lucrării date am stabilit care sunt pricipiile de funcționare a celor mai uitilizate tipuri de touch-uri și parametri lora, observăm în ultimul timp o tendință mare de folosire în masă a touch-lui Capcitiv deoarece este mai rezistiv la zgârieturi și lovituri, datorită stratului exterior din sticlă cât și mai ușor de folosit, acesta ulterior va fi înlocuti cu noua tehnologie de producere OGS care va permite admirarea la maxim a capcităților de redare a imaginii de către ecranele performante. Principala deosebire dintre sensori Rezistiv și Capcitiv era prețul foarte mic de producție a celui Rezistiv, însă în ultimii ani acesta deja nu mai au nici un obstacol datorită noilor tehnologii de producere a sensorilor Capacitivi. Totodată marile companii ca Samsung, HTC și Appel deja folosesc pentru sensori săi sticlă călită de tipul Gorila Glass de generația a 3-ea care presupune o durabilitate ridicată și o rezistență la lovitură de pînă la 2000N pe cm2. Cu toate acestea încă mai sunt companii care produc dispozitive mobile cu senzor Rezistiv deoarece acestea au o precizie mai ridicată și este mai comod pentru unele sfere de utilizare cum ar fi arta plastică sau desen tehnic.

Odată cu dezvoltarea tehnologilor moderne care ne permite detectarea atingeri și utilizarea pe larg a ei în industrie, sa putut implimenta și în dispozitivile mobile cum ar fi tablete sau telefone mobile, însă din cauza că softurile elaborate pentru acestea limitau posibilitatea deplină a tehnologilor Touch au fost elaborat SO Android care a cucerit în ziua de azi întreaga lume, aceasta folosind în întregime noua tehnologie la maximum. Compania Appel pricipalul rival a trasat accentul pe stil și exlusivitate cu iPhone/iPad/iPod astfel acapărând piața de dispozitive cu prețuri ridicate, însă ea are un succes doar în statele înalt dezvoltate. Astfel datorită simplității și accesibilității, SO Android acuma domină piața dispozitivelor mobile, deoarece: necesită resurse hardwere relativ puține, are o gamă largă de dispozitive create și este distribuit gratuit astfel asigurând un mediu de dezvoltare pentru programotor accesibil.

Din cele de mai sus putem trage concluzi că un utilizator simplu care doreste sa își procure un dispozitiv sau ar dori să înceapă programarea pe un dispozitiv cu tehnologiea Touch Screen ar trebui să se conducă după următoarele puncte:

Unul din cele mai bune senzore touch de azi este cel bazat pe tehnologiea Capcitv îmbinată cu OGS, anume spre acesta trebue să tindă la alegere;

Dispozitivul trebue să ruleze un sistem de operare modern care ar avea multe aplicați în domenii diferite, aicea SO Android nu are rivali deoarece are o mulțime de aplicați cât gratuite atât și cu plată;

Pentru programatori începători este important ca programele și documentația să fie oferită gratuit sau la un preț foarte accesibil, pentru criteriul dat SO Android tot nare rivali pe piața de creare a aplicaților deoarece pentru a programa aplicație pe dispozitivele cu iOS este necesar de un capital destul de mare;

Încă un criteriu importat este ca Sistemul de Operare să fie reînoit cu înbunătățiri actuale la diferite perioade de timp, încă odată menționăm că în timp de 7 ani din 2007 până în prezent au fost prezentate 17 reînoiri și reperfectări;

Pe parcursul elaborării lucrării am însușit cunoștințe destul de vaste în domeniul tehnologiei Touch Screen și a sistemului de operare Android, cu ajutorul acestor cunoștințe am elaborat aplicația Touch Me care a fost o experiență destul de importantă în primii pași spre meseria studiată. Din acestă experință am concluzionat că SO Android are o vastă capcitate de a prelucra orice gest sau atingere a senzorului touch pentru a oferi o comoditate și o utilizare cât mai plăcută. Elaborarea aplicației a fost o încercare destul de grea pentru mine deoarece anterior nu am mai elaborat aplicație de genul dat și pentru SO Android, însă cunoașterea limbajul JAVA și funcțile native au simplificat destul de mult acest proces. Pe lângă experiența acăpărată acestă lucrare mi-a trezit dorința de a mă dezvolta în continuare în domeniul dat și de a reperfecta aplicația dată ptntru ca să poată suștine multitouch și desenarea concomitentă a două sau mai multe linii.

Sper că în viitorul apropiat am să progresez în domeniul de elaborare a aplicațiilor mobile și voi putea elabora noi aplicații care vor avea la bază aceste 2 mari tehnologii care nu pot exista una fară de alta la momentul dat.

IV. Bibliografie.

Projected Capacitive Touch Screens – Gary L. Barrett, Ryomei Omote , California 2010.

The Future of Mobile Touch – Walker Mobile, LLC, 2011

The Android Developer’s Cookbook: Building Applications with the Android SDK – James Steele, Nelson To, Addison-Wesley, 2010

Android Application Development Programming with the Google SDK – Rogers, Lombardo, Mednieks, Meike, O'Reilly, 2010

Android Programming Tutorials – Mark L Murphy, 3rd Edition – 2011

Curs practice de Java-Cristian Frăsinaru, Editura București 2010

Fișierul Xml.http://ro.wikipedia.org/wiki/XML (vizitat 13.I.20014)

Elaborarea aplicațiloe pentru SO Andorid. http://developer.android.com/index.html (vizitat 10.I.20014)

Tehnologia Appel http://en.wikipedia.org/wiki/IOS_ (vizitat 24.III.20014)

Tehnologia OGS. http://www.hnwbkj.com/en/newshow.asp?id=10&bid=18 (vizitat 20.IV.20014)

Metoda de producere a sensorului OGS.

http://www.schott.com/xensation/english/products/xcover/its.html?so=russia&lang=russian (vizitat 29.IV.20014)

Metodele single touch și multitouch utilizate în aplicațile android. http://www.vogella.com/tutorials/AndroidTouch/article.html (vizitat 29.IV.20014)

Livrarea dispozitivelor mobile în primul trimestru al anului 2014. http://stiri-telefoane.mobilissimo.ro/statistici/samsung-a-livrat-mai-multe-smartphone-uri-in-primele-3-luni-din-2014-decat-apple–lg–lenovo-si-huawei-la-un-loc_21233.html (vizitat 12.IV.20014)

Anexa A.

La startearea aplicație apare fundalul de pornire care este reprezentat în Figura N.25 , iar după lansarea fundalului de lucrul vom avea un scurt mesaj de salutare lacare difera de la prima pornire a aplicației pe dispozitiv de cel care apare la a doua pornire a aplicației, aceste mesaje sunt temporale deci ne permit de a desena chiar din momentul apariției fundalului de lucur.

Figura N.25 „Fundalul de pornire a aplicației Touch Me.”

Pentru a desena ceva este novoie ca sa apasăm într-un punct al senzorului și apoi fără să luam degetul sau stilus-ul de pe ecran să facem o mișcare în orice direcție dormi, iar calea atingeri va fi desenată de progam (Figura N.26).

Figura N.26 „Desenarea pe suprafața de lucur.”

Pentru a putea viziona meniul cu opțiuni adăugătoare apăsăm tasta Settings iar în unile dispozitive dacă nu este ca tastă reală va fi creată de către SO pentru a putea accesa meniul dat. În urma tastări vom putea vedea meniul aplicației (Figura N.27).

Figura N27 „Meniul Aplicației.”

Aicea putem selecta toate elementel meniului disponibele cum ar fi: Culoarea, Pasta, Creion, Mărirea pensulei și meniul adăugător. Dacă vom selecta elementul Culoarea vom apărea o palitră care ne va permite selectarea culori dorite iar în centrul acestia va fi un cerc de culoarea selectată, pentru a aproba culoarea este necesar să apăsăm în cercul din interiorul palitrei(Figura N.28).

Figura N.28 „Selectarea Culori.”

Dacă dorim să grosinea liniei o putem face prin selectarea a elemntului Mărirea Pensulei și va apărea o ferestră cu selectar de mărime, unde mărimea inițială este 5, ce-a minimă este 1 iar ce-a maximală este 25(Figura N.29).

Figura N.29 „Schimarea grosimei liniei.”

Tot aicea putem alege diferite stiluri de desenare cum ar fi desenarea cu pastă sau cu creion, însă acesta este mai puțin semnificativ din punt de vedere conceptual deoarece se schimbă doar stilu cu care se va folosi funcția în funcția path. Pe lângă acesta putem observa că este prezentă și ștergerea parțială care ne permite să ștergem doar ce dorim, calea ștergeri se va colora cu culoare neagră pentru a ne permite vizualizarea căei de parcurge iar ulterior va dispărea după o perioadă scurta de timp. Cu părere de rău nu sa putu fixa acest moment deoarece perioada este prea scurta pentru a putea efectua fotografieri ecranului.

În meniul adăugător More putem găsim încă 4 submeniuri, și anume(Figura N.31):

Salvare.

Șterge Tot.

Împărțeștete.

Info.

Figura N.30 „Meniul Adăugător.”

Salvarea este un element de bază care ne permite să salvăm desenul creat pentru revederea ulterioară sau pentru transferul pe alt dispozitiv electronic, după selectarea elementului de salvare vom urmări un scurt mesaj cu informația unde a fost salvată imaginea(Figura N.31). Formatul de salvare a imaginei este .png care ne asigură o calitate bună a imagini.

Figura N.31 „Calea imaginei salvate.”

La selectarea a ștergeri totatel vom obține o suprafată curata de lcuru ca la pornirea aplicației, următorul element al meniului adăugător este elementul Împărțeștete care ne permite să ca aplicația să detecteze toate aplicațile care au legătură de comunicare, de stocare a informașiei pe un server sau de transmitere prim metode wireless imaginea salvată anterior(Firuga N.32).

Figura N.32 „Aplicațile disponibile pentru a distribu imaginea.”

Ultimul element al acestui meniu este Info care ne propune spre vizualizare o scurtă descriere a apicației date și posibilitatea de a recomanda aplicașia pe un site de distribuire a aplicației, acesta este posibil numa dacă vom selecta buronu Aprobal(Figura N.33).

Figura N.33 „Elementul Info și recomandarea aplicației.”

Anexa B.

File MainPaint.java

package com.example.touchme;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Path;

import android.os.Bundle;

import android.view.Display;

import android.view.Menu;

import android.view.MenuItem;

import android.view.MotionEvent;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.TextView;

public class MainActivity extends Activity {

float x = 0;

float y = 0;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);//specificarea formei

layout=(LinearLayout)findViewById(R.id.layout);//gasirea id necesar

layout.addView(new CustomView(MainActivity.this));

}

Paint mPaint;

public class CustomView extends View { //crearea unei mape pentru canvas

final TextView Ecran = (TextView)findViewById(R.id.textView1);

Display currentDisplay = getWindowManager().getDefaultDisplay();

@SuppressWarnings("deprecation")

float dw = currentDisplay.getWidth();

@SuppressWarnings("deprecation")

float dh = currentDisplay.getHeight();

Bitmap mBitmap;

Paint paint;

Path path;

Paint pain;

Canvas canvas;

private Paint mBitmapPaint;

public CustomView(Context context) {

super(context);

mPaint = new Paint();

mPaint.setAntiAlias(true);

mPaint.setDither(true);

mPaint.setColor(0xff0000ff);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeJoin(Paint.Join.ROUND);

mPaint.setStrokeCap(Paint.Cap.ROUND);

mPaint.setStrokeWidth(5);

mBitmap = Bitmap.createBitmap((int)dw , (int)dh, Bitmap.Config.ARGB_8888);//spcificarea parametrilor ecranului

canvas = new Canvas(mBitmap);

path= new Path();

paint = new Paint();

pain = new Paint();

mBitmapPaint = new Paint(Paint.DITHER_FLAG);

pain.setColor(Color.WHITE);

paint.setColor(Color.BLUE);//culoare cercului desenat

paint.setStyle(Style.FILL);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

}

protected void onDraw(Canvas canvas) {//desenarea cercului la atingere

super.onDraw(canvas);

canvas.drawColor(0xFFFFFFFF);

canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

canvas.drawPath(path,mPaint);

canvas.drawCircle(x, y, 30, paint);

canvas.drawCircle(x, y, 28, pain);

canvas.drawCircle(x, y, 10, paint);

}

public float mX, mY;

private static final float TOUCH_TOLERANCE = 3;

private void touch_start(float x, float y) {

path.reset();

path.moveTo(x, y);

mX = x;

mY = y;

}

private void touch_move(float x, float y) {

float dx = Math.abs(x – mX);

float dy = Math.abs(y – mY);

if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {

path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);

mX = x;

mY = y;

}

}

private void touch_up() {

path.lineTo(mX, mY);

canvas.drawPath(path, mPaint);

path.reset();

}

public boolean onTouchEvent(MotionEvent event) {

x = event.getX();

y = event.getY();

switch (event.getAction()){

case MotionEvent.ACTION_DOWN:

touch_start(x,y);

invalidate();

break;

case MotionEvent.ACTION_MOVE:

x = event.getX();

y = event.getY();

coordonates();

touch_move(x, y);

invalidate();

break;

case MotionEvent.ACTION_UP:

touch_up();

invalidate();

break;

}

return true;

}

}

public void coordonates(){

final TextView Ecran = (TextView)findViewById(R.id.textView1);//specificarea id pentru afisare la ecran

Ecran.setText("Coordonatele atingeri pe ecran: x ="+x+" si y = "+y );

}

private static final int COLOR_MENU_ID = Menu.FIRST;

private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;

private static final int BLUR_MENU_ID = Menu.FIRST + 2;

private static final int SIZE_MENU_ID = Menu.FIRST + 3;

private static final int ERASE_MENU_ID = Menu.FIRST + 4;

private static final int CLEAR_ALL = Menu.FIRST + 5;

private static final int SAVE = Menu.FIRST + 6;

private static final int SHARE = Menu.FIRST + 7;

private static final int ABOUT = Menu.FIRST + 8;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

menu.add(0, COLOR_MENU_ID, 0, "Culoarea").setIcon(R.drawable.color);

menu.add(0, EMBOSS_MENU_ID, 0, "Pasta").setIcon(R.drawable.emboss);

menu.add(0, BLUR_MENU_ID, 0, "Creion").setIcon(R.drawable.blur);

menu.add(0, SIZE_MENU_ID, 0, "Marimea Pensulei").setIcon(R.drawable.size);

menu.add(0, ERASE_MENU_ID, 0, "Sterge").setIcon(R.drawable.erase);

menu.add(0, CLEAR_ALL, 0, "Sterge Tot");

menu.add(0, SAVE, 0, "Salvarea");

menu.add(0, SHARE, 0, "Impartestete");

menu.add(0, ABOUT, 0, "Info");

/****

*Acesta este blocul declarativ al meniului pentru program

*Cu ajutorul menu.add adaugam diferite obiecte de meniu

*****/

return true;

} @Override

@Override

public boolean onOptionsItemSelected(MenuItem item) {

mPaint.setXfermode(null);

mPaint.setAlpha(0xFF);

switch (item.getItemId()) {

case COLOR_MENU_ID:

new ColorPickerDialog(this, this, mPaint.getColor()).show();

return true;

case EMBOSS_MENU_ID:

if (mPaint.getMaskFilter() != mEmboss) {

mPaint.setMaskFilter(mEmboss);

} else {

mPaint.setMaskFilter(null);

}

return true;

case BLUR_MENU_ID:

if (mPaint.getMaskFilter() != mBlur) {

mPaint.setMaskFilter(mBlur);

} else {

mPaint.setMaskFilter(null);

}

return true;

case SIZE_MENU_ID:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View layout = inflater.inflate(R.layout.brush,

(ViewGroup) findViewById(R.id.root));

AlertDialog.Builder builder = new AlertDialog.Builder(this)

.setView(layout);

final AlertDialog alertDialog = builder.create();

alertDialog.show();

SeekBar sb = (SeekBar) layout.findViewById(R.id.seekBar1);

sb.setProgress(5);

final Button done = (Button) layout.findViewById(R.id.select_size);

final TextView txt = (TextView) layout

.findViewById(R.id.size_value);

txt.setText("Marimea de baza a pensulei este: 5");

sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

public void onProgressChanged(SeekBar seekBar,

final int progress, boolean fromUser) {

txt.setText("Pensula selectate este: " + progress);

mPaint.setStrokeWidth(progress);

done.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

if (progress == 0) {

Toast.makeText(

getApplicationContext(),

"Selectati marime nima a pensului 1.",

Toast.LENGTH_SHORT).show();

} else {

alertDialog.dismiss();

}

}

});

}

public void onStartTrackingTouch(SeekBar seekBar) {

}

public void onStopTrackingTouch(SeekBar seekBar) {

}

});

return true;

case ERASE_MENU_ID:

// mPaint.setColor(bgColor);

mPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

return true;

case CLEAR_ALL:

Intent intent = getIntent();

overridePendingTransition(0, 0);

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

finish();

overridePendingTransition(0, 0);

startActivity(intent);

return true;

case SAVE:

takeScreenshot(true);

break;

case SHARE:

File screenshotPath = takeScreenshot(false);

Intent i = new Intent();

i.setAction(Intent.ACTION_SEND);

i.setType("image/png");

i.putExtra(Intent.EXTRA_SUBJECT,

getString(touch.me.R.string.share_title_template));

i.putExtra(Intent.EXTRA_TEXT,

getString(touch.me.R.string.share_text_template));

i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(screenshotPath));

try {

startActivity(Intent.createChooser(i,

getString(touch.me.R.string.toolbox_share_title)));

} catch (android.content.ActivityNotFoundException ex) {

Toast.makeText(this.getApplicationContext(),

touch.me.R.string.no_way_to_share,

Toast.LENGTH_LONG).show();

}

break;

case ABOUT:

try {

AlertDialog.Builder alert = new AlertDialog.Builder(this);

alert.setTitle("Touch Me – Info");

String msg1 = "- Acesta este un simplu program pentru determinarea posibilitatile sensorului touch.";

String msg2 = "- Puteti salva toate desenele create.";

alert.setMessage(msg1 + "\n" + msg2);

alert.setPositiveButton("Aprobal.",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int whichButton) {

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri

.parse("https://google.com"));

startActivity(intent);

}

});

alert.setNegativeButton("Nu, Multumesc.",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int whichButton) {

}

});

alert.show();

} catch (Exception e) {

// prindem exceptia

}

}

return super.onOptionsItemSelected(item);

}

private File takeScreenshot(boolean showToast) {

View v = getWindow().getDecorView();

v.setDrawingCacheEnabled(true);

Bitmap cachedBitmap = v.getDrawingCache();

Bitmap copyBitmap = cachedBitmap.copy(Bitmap.Config.RGB_565, true);

FileOutputStream output = null;

File file = null;

try {

File path = Places.getScreenshotFolder();

Calendar cal = Calendar.getInstance();

file = new File(path,

cal.get(Calendar.YEAR) + "_" + (1 + cal.get(Calendar.MONTH)) + "_"

+ cal.get(Calendar.DAY_OF_MONTH) + "_"

+ cal.get(Calendar.HOUR_OF_DAY) + "_"

+ cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)

+ ".png");

output = new FileOutputStream(file);

copyBitmap.compress(CompressFormat.PNG, 100, output);

} catch (FileNotFoundException e) {

file = null;

e.printStackTrace();

} finally {

if (output != null) {

try {

output.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (file != null) {

if (showToast)

Toast.makeText(getApplicationContext(),

"Imaginea sa salavat in " + file.getAbsolutePath(),

Toast.LENGTH_LONG).show();

// scanam ecranul shi facem o imagine a ecranului

// salvam imaginea de pe ecran

Intent requestScan = new Intent(

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

requestScan.setData(Uri.fromFile(file));

sendBroadcast(requestScan);

return file;

} else {

return null;

}

}

private boolean isFirstTime() {

SharedPreferences preferences = getPreferences(MODE_PRIVATE);

boolean ranBefore = preferences.getBoolean("RanBefore", false);

if (!ranBefore) {

// first time

SharedPreferences.Editor editor = preferences.edit();

editor.putBoolean("RanBefore", true);

editor.commit();

}

return !ranBefore;

}

private boolean isSecondTime() {

SharedPreferences preferences = getPreferences(MODE_PRIVATE);

boolean ranBefore = preferences.getBoolean("SecondRun", true);

if (ranBefore) {

// sreturnam valaorea de pronire

SharedPreferences.Editor editor = preferences.edit();

editor.putBoolean("SecondRun", false);

editor.commit();

}

return !ranBefore;

}

public boolean connectionAvailable() {

boolean connected = false;

@SuppressWarnings("static-access")

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(getApplicationContext().CONNECTIVITY_SERVICE);

if (connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)

.getState() == NetworkInfo.State.CONNECTED

|| connectivityManager.getNetworkInfo(

ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {

connected = true;

} //determinam daca avem conecxiune la internet pentru a accesa locatia dorita

return connected;

}

}

Bibliografie.

Projected Capacitive Touch Screens – Gary L. Barrett, Ryomei Omote , California 2010.

The Future of Mobile Touch – Walker Mobile, LLC, 2011

The Android Developer’s Cookbook: Building Applications with the Android SDK – James Steele, Nelson To, Addison-Wesley, 2010

Android Application Development Programming with the Google SDK – Rogers, Lombardo, Mednieks, Meike, O'Reilly, 2010

Android Programming Tutorials – Mark L Murphy, 3rd Edition – 2011

Curs practice de Java-Cristian Frăsinaru, Editura București 2010

Fișierul Xml.http://ro.wikipedia.org/wiki/XML (vizitat 13.I.20014)

Elaborarea aplicațiloe pentru SO Andorid. http://developer.android.com/index.html (vizitat 10.I.20014)

Tehnologia Appel http://en.wikipedia.org/wiki/IOS_ (vizitat 24.III.20014)

Tehnologia OGS. http://www.hnwbkj.com/en/newshow.asp?id=10&bid=18 (vizitat 20.IV.20014)

Metoda de producere a sensorului OGS.

http://www.schott.com/xensation/english/products/xcover/its.html?so=russia&lang=russian (vizitat 29.IV.20014)

Metodele single touch și multitouch utilizate în aplicațile android. http://www.vogella.com/tutorials/AndroidTouch/article.html (vizitat 29.IV.20014)

Livrarea dispozitivelor mobile în primul trimestru al anului 2014. http://stiri-telefoane.mobilissimo.ro/statistici/samsung-a-livrat-mai-multe-smartphone-uri-in-primele-3-luni-din-2014-decat-apple–lg–lenovo-si-huawei-la-un-loc_21233.html (vizitat 12.IV.20014)

Anexa A.

La startearea aplicație apare fundalul de pornire care este reprezentat în Figura N.25 , iar după lansarea fundalului de lucrul vom avea un scurt mesaj de salutare lacare difera de la prima pornire a aplicației pe dispozitiv de cel care apare la a doua pornire a aplicației, aceste mesaje sunt temporale deci ne permit de a desena chiar din momentul apariției fundalului de lucur.

Figura N.25 „Fundalul de pornire a aplicației Touch Me.”

Pentru a desena ceva este novoie ca sa apasăm într-un punct al senzorului și apoi fără să luam degetul sau stilus-ul de pe ecran să facem o mișcare în orice direcție dormi, iar calea atingeri va fi desenată de progam (Figura N.26).

Figura N.26 „Desenarea pe suprafața de lucur.”

Pentru a putea viziona meniul cu opțiuni adăugătoare apăsăm tasta Settings iar în unile dispozitive dacă nu este ca tastă reală va fi creată de către SO pentru a putea accesa meniul dat. În urma tastări vom putea vedea meniul aplicației (Figura N.27).

Figura N27 „Meniul Aplicației.”

Aicea putem selecta toate elementel meniului disponibele cum ar fi: Culoarea, Pasta, Creion, Mărirea pensulei și meniul adăugător. Dacă vom selecta elementul Culoarea vom apărea o palitră care ne va permite selectarea culori dorite iar în centrul acestia va fi un cerc de culoarea selectată, pentru a aproba culoarea este necesar să apăsăm în cercul din interiorul palitrei(Figura N.28).

Figura N.28 „Selectarea Culori.”

Dacă dorim să grosinea liniei o putem face prin selectarea a elemntului Mărirea Pensulei și va apărea o ferestră cu selectar de mărime, unde mărimea inițială este 5, ce-a minimă este 1 iar ce-a maximală este 25(Figura N.29).

Figura N.29 „Schimarea grosimei liniei.”

Tot aicea putem alege diferite stiluri de desenare cum ar fi desenarea cu pastă sau cu creion, însă acesta este mai puțin semnificativ din punt de vedere conceptual deoarece se schimbă doar stilu cu care se va folosi funcția în funcția path. Pe lângă acesta putem observa că este prezentă și ștergerea parțială care ne permite să ștergem doar ce dorim, calea ștergeri se va colora cu culoare neagră pentru a ne permite vizualizarea căei de parcurge iar ulterior va dispărea după o perioadă scurta de timp. Cu părere de rău nu sa putu fixa acest moment deoarece perioada este prea scurta pentru a putea efectua fotografieri ecranului.

În meniul adăugător More putem găsim încă 4 submeniuri, și anume(Figura N.31):

Salvare.

Șterge Tot.

Împărțeștete.

Info.

Figura N.30 „Meniul Adăugător.”

Salvarea este un element de bază care ne permite să salvăm desenul creat pentru revederea ulterioară sau pentru transferul pe alt dispozitiv electronic, după selectarea elementului de salvare vom urmări un scurt mesaj cu informația unde a fost salvată imaginea(Figura N.31). Formatul de salvare a imaginei este .png care ne asigură o calitate bună a imagini.

Figura N.31 „Calea imaginei salvate.”

La selectarea a ștergeri totatel vom obține o suprafată curata de lcuru ca la pornirea aplicației, următorul element al meniului adăugător este elementul Împărțeștete care ne permite să ca aplicația să detecteze toate aplicațile care au legătură de comunicare, de stocare a informașiei pe un server sau de transmitere prim metode wireless imaginea salvată anterior(Firuga N.32).

Figura N.32 „Aplicațile disponibile pentru a distribu imaginea.”

Ultimul element al acestui meniu este Info care ne propune spre vizualizare o scurtă descriere a apicației date și posibilitatea de a recomanda aplicașia pe un site de distribuire a aplicației, acesta este posibil numa dacă vom selecta buronu Aprobal(Figura N.33).

Figura N.33 „Elementul Info și recomandarea aplicației.”

Anexa B.

File MainPaint.java

package com.example.touchme;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Path;

import android.os.Bundle;

import android.view.Display;

import android.view.Menu;

import android.view.MenuItem;

import android.view.MotionEvent;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.TextView;

public class MainActivity extends Activity {

float x = 0;

float y = 0;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);//specificarea formei

layout=(LinearLayout)findViewById(R.id.layout);//gasirea id necesar

layout.addView(new CustomView(MainActivity.this));

}

Paint mPaint;

public class CustomView extends View { //crearea unei mape pentru canvas

final TextView Ecran = (TextView)findViewById(R.id.textView1);

Display currentDisplay = getWindowManager().getDefaultDisplay();

@SuppressWarnings("deprecation")

float dw = currentDisplay.getWidth();

@SuppressWarnings("deprecation")

float dh = currentDisplay.getHeight();

Bitmap mBitmap;

Paint paint;

Path path;

Paint pain;

Canvas canvas;

private Paint mBitmapPaint;

public CustomView(Context context) {

super(context);

mPaint = new Paint();

mPaint.setAntiAlias(true);

mPaint.setDither(true);

mPaint.setColor(0xff0000ff);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeJoin(Paint.Join.ROUND);

mPaint.setStrokeCap(Paint.Cap.ROUND);

mPaint.setStrokeWidth(5);

mBitmap = Bitmap.createBitmap((int)dw , (int)dh, Bitmap.Config.ARGB_8888);//spcificarea parametrilor ecranului

canvas = new Canvas(mBitmap);

path= new Path();

paint = new Paint();

pain = new Paint();

mBitmapPaint = new Paint(Paint.DITHER_FLAG);

pain.setColor(Color.WHITE);

paint.setColor(Color.BLUE);//culoare cercului desenat

paint.setStyle(Style.FILL);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

}

protected void onDraw(Canvas canvas) {//desenarea cercului la atingere

super.onDraw(canvas);

canvas.drawColor(0xFFFFFFFF);

canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

canvas.drawPath(path,mPaint);

canvas.drawCircle(x, y, 30, paint);

canvas.drawCircle(x, y, 28, pain);

canvas.drawCircle(x, y, 10, paint);

}

public float mX, mY;

private static final float TOUCH_TOLERANCE = 3;

private void touch_start(float x, float y) {

path.reset();

path.moveTo(x, y);

mX = x;

mY = y;

}

private void touch_move(float x, float y) {

float dx = Math.abs(x – mX);

float dy = Math.abs(y – mY);

if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {

path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);

mX = x;

mY = y;

}

}

private void touch_up() {

path.lineTo(mX, mY);

canvas.drawPath(path, mPaint);

path.reset();

}

public boolean onTouchEvent(MotionEvent event) {

x = event.getX();

y = event.getY();

switch (event.getAction()){

case MotionEvent.ACTION_DOWN:

touch_start(x,y);

invalidate();

break;

case MotionEvent.ACTION_MOVE:

x = event.getX();

y = event.getY();

coordonates();

touch_move(x, y);

invalidate();

break;

case MotionEvent.ACTION_UP:

touch_up();

invalidate();

break;

}

return true;

}

}

public void coordonates(){

final TextView Ecran = (TextView)findViewById(R.id.textView1);//specificarea id pentru afisare la ecran

Ecran.setText("Coordonatele atingeri pe ecran: x ="+x+" si y = "+y );

}

private static final int COLOR_MENU_ID = Menu.FIRST;

private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;

private static final int BLUR_MENU_ID = Menu.FIRST + 2;

private static final int SIZE_MENU_ID = Menu.FIRST + 3;

private static final int ERASE_MENU_ID = Menu.FIRST + 4;

private static final int CLEAR_ALL = Menu.FIRST + 5;

private static final int SAVE = Menu.FIRST + 6;

private static final int SHARE = Menu.FIRST + 7;

private static final int ABOUT = Menu.FIRST + 8;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

menu.add(0, COLOR_MENU_ID, 0, "Culoarea").setIcon(R.drawable.color);

menu.add(0, EMBOSS_MENU_ID, 0, "Pasta").setIcon(R.drawable.emboss);

menu.add(0, BLUR_MENU_ID, 0, "Creion").setIcon(R.drawable.blur);

menu.add(0, SIZE_MENU_ID, 0, "Marimea Pensulei").setIcon(R.drawable.size);

menu.add(0, ERASE_MENU_ID, 0, "Sterge").setIcon(R.drawable.erase);

menu.add(0, CLEAR_ALL, 0, "Sterge Tot");

menu.add(0, SAVE, 0, "Salvarea");

menu.add(0, SHARE, 0, "Impartestete");

menu.add(0, ABOUT, 0, "Info");

/****

*Acesta este blocul declarativ al meniului pentru program

*Cu ajutorul menu.add adaugam diferite obiecte de meniu

*****/

return true;

} @Override

@Override

public boolean onOptionsItemSelected(MenuItem item) {

mPaint.setXfermode(null);

mPaint.setAlpha(0xFF);

switch (item.getItemId()) {

case COLOR_MENU_ID:

new ColorPickerDialog(this, this, mPaint.getColor()).show();

return true;

case EMBOSS_MENU_ID:

if (mPaint.getMaskFilter() != mEmboss) {

mPaint.setMaskFilter(mEmboss);

} else {

mPaint.setMaskFilter(null);

}

return true;

case BLUR_MENU_ID:

if (mPaint.getMaskFilter() != mBlur) {

mPaint.setMaskFilter(mBlur);

} else {

mPaint.setMaskFilter(null);

}

return true;

case SIZE_MENU_ID:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View layout = inflater.inflate(R.layout.brush,

(ViewGroup) findViewById(R.id.root));

AlertDialog.Builder builder = new AlertDialog.Builder(this)

.setView(layout);

final AlertDialog alertDialog = builder.create();

alertDialog.show();

SeekBar sb = (SeekBar) layout.findViewById(R.id.seekBar1);

sb.setProgress(5);

final Button done = (Button) layout.findViewById(R.id.select_size);

final TextView txt = (TextView) layout

.findViewById(R.id.size_value);

txt.setText("Marimea de baza a pensulei este: 5");

sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

public void onProgressChanged(SeekBar seekBar,

final int progress, boolean fromUser) {

txt.setText("Pensula selectate este: " + progress);

mPaint.setStrokeWidth(progress);

done.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

if (progress == 0) {

Toast.makeText(

getApplicationContext(),

"Selectati marime nima a pensului 1.",

Toast.LENGTH_SHORT).show();

} else {

alertDialog.dismiss();

}

}

});

}

public void onStartTrackingTouch(SeekBar seekBar) {

}

public void onStopTrackingTouch(SeekBar seekBar) {

}

});

return true;

case ERASE_MENU_ID:

// mPaint.setColor(bgColor);

mPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

return true;

case CLEAR_ALL:

Intent intent = getIntent();

overridePendingTransition(0, 0);

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

finish();

overridePendingTransition(0, 0);

startActivity(intent);

return true;

case SAVE:

takeScreenshot(true);

break;

case SHARE:

File screenshotPath = takeScreenshot(false);

Intent i = new Intent();

i.setAction(Intent.ACTION_SEND);

i.setType("image/png");

i.putExtra(Intent.EXTRA_SUBJECT,

getString(touch.me.R.string.share_title_template));

i.putExtra(Intent.EXTRA_TEXT,

getString(touch.me.R.string.share_text_template));

i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(screenshotPath));

try {

startActivity(Intent.createChooser(i,

getString(touch.me.R.string.toolbox_share_title)));

} catch (android.content.ActivityNotFoundException ex) {

Toast.makeText(this.getApplicationContext(),

touch.me.R.string.no_way_to_share,

Toast.LENGTH_LONG).show();

}

break;

case ABOUT:

try {

AlertDialog.Builder alert = new AlertDialog.Builder(this);

alert.setTitle("Touch Me – Info");

String msg1 = "- Acesta este un simplu program pentru determinarea posibilitatile sensorului touch.";

String msg2 = "- Puteti salva toate desenele create.";

alert.setMessage(msg1 + "\n" + msg2);

alert.setPositiveButton("Aprobal.",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int whichButton) {

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri

.parse("https://google.com"));

startActivity(intent);

}

});

alert.setNegativeButton("Nu, Multumesc.",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int whichButton) {

}

});

alert.show();

} catch (Exception e) {

// prindem exceptia

}

}

return super.onOptionsItemSelected(item);

}

private File takeScreenshot(boolean showToast) {

View v = getWindow().getDecorView();

v.setDrawingCacheEnabled(true);

Bitmap cachedBitmap = v.getDrawingCache();

Bitmap copyBitmap = cachedBitmap.copy(Bitmap.Config.RGB_565, true);

FileOutputStream output = null;

File file = null;

try {

File path = Places.getScreenshotFolder();

Calendar cal = Calendar.getInstance();

file = new File(path,

cal.get(Calendar.YEAR) + "_" + (1 + cal.get(Calendar.MONTH)) + "_"

+ cal.get(Calendar.DAY_OF_MONTH) + "_"

+ cal.get(Calendar.HOUR_OF_DAY) + "_"

+ cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)

+ ".png");

output = new FileOutputStream(file);

copyBitmap.compress(CompressFormat.PNG, 100, output);

} catch (FileNotFoundException e) {

file = null;

e.printStackTrace();

} finally {

if (output != null) {

try {

output.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (file != null) {

if (showToast)

Toast.makeText(getApplicationContext(),

"Imaginea sa salavat in " + file.getAbsolutePath(),

Toast.LENGTH_LONG).show();

// scanam ecranul shi facem o imagine a ecranului

// salvam imaginea de pe ecran

Intent requestScan = new Intent(

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

requestScan.setData(Uri.fromFile(file));

sendBroadcast(requestScan);

return file;

} else {

return null;

}

}

private boolean isFirstTime() {

SharedPreferences preferences = getPreferences(MODE_PRIVATE);

boolean ranBefore = preferences.getBoolean("RanBefore", false);

if (!ranBefore) {

// first time

SharedPreferences.Editor editor = preferences.edit();

editor.putBoolean("RanBefore", true);

editor.commit();

}

return !ranBefore;

}

private boolean isSecondTime() {

SharedPreferences preferences = getPreferences(MODE_PRIVATE);

boolean ranBefore = preferences.getBoolean("SecondRun", true);

if (ranBefore) {

// sreturnam valaorea de pronire

SharedPreferences.Editor editor = preferences.edit();

editor.putBoolean("SecondRun", false);

editor.commit();

}

return !ranBefore;

}

public boolean connectionAvailable() {

boolean connected = false;

@SuppressWarnings("static-access")

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(getApplicationContext().CONNECTIVITY_SERVICE);

if (connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)

.getState() == NetworkInfo.State.CONNECTED

|| connectivityManager.getNetworkInfo(

ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {

connected = true;

} //determinam daca avem conecxiune la internet pentru a accesa locatia dorita

return connected;

}

}

Similar Posts