Programavimas

„GraphLib“: atviro kodo „Android“ biblioteka, skirta grafikams

Grafikai ir duomenų grafikai yra nuostabūs įrankiai, iliustruojantys ryšius, vaizduojantys duomenų tendencijas ir stebint tikslus „Android“ programose. Pats tuo įsitikinau prieš kelerius metus, kai buvęs mano studentas laimėjo pirmąją vietą studentų mobiliųjų programėlių konkurse, kurį rėmė Čarlstono gynybos rangovų asociacija. Pagrindinis laimėjusios programos „Diabetas ir aš“ bruožas buvo galimybė apskaičiuoti dienos cukraus kiekį.

Kaip kitą pavyzdį apsvarstykite svorio stebėjimo programą, kuri rodo progresą, palyginti su tikslo svoriu. 1 paveiksle parodyta, kaip tokia programa gali atrodyti „Android“ telefone. Paveiksle naudojama raudona linijos diagrama, rodanti 2017 m. Vidutinius mėnesio svorius. Tai rodo tikslo svorį kaip žalią tiesią liniją netoli dugno. (Nors linijinėje diagramoje parodytos duomenų reikšmės yra hipotetinės, jos yra realios, susijusios su šio straipsnio autoriumi.)

Johnas I. Moore'as

Šiame straipsnyje aš naudosiu savo atvirojo kodo biblioteką „GraphLib“, kad pademonstruočiau „Android“ matematinių funkcijų braižymo pagrindus. Tai nėra ta pati grafikų biblioteka, kurią mano studentas naudojo savo programai. Tiesą sakant, tai yra daug paprasčiau ir lengviau naudoti.

atsisiųsti Atsisiųsti „GraphLib“ Gaukite atvirojo kodo „Android“ grafikų bibliotekos, pristatytos šiame straipsnyje, kodą. Sukūrė Johnas I. Moore'as.

„GraphLib“ apžvalga

„GraphLib“ susideda iš vienos sąsajos ir aštuonių klasių. Trys iš šių klasių yra bibliotekos viduje ir turi prieigą tik prie paketo, todėl norint suprasti „GraphLib“ nereikės jų suprasti. Dvi iš likusių klasių turi labai paprastą funkcionalumą, o likusią dalį nesunku pasiimti.

Žemiau aprašysiu „GraphLib“ sąsają ir visas aštuonias klases. Atkreipkite dėmesį, kad kurdamas ir testuodamas biblioteką naudojau „Java 8“ funkcijas, tokias kaip funkcinės sąsajos ir „lambda“ išraiškos, tačiau palyginti paprastas yra modifikuoti šias funkcijas ankstesnėms „Java“ versijoms.

Funkcinė „GraphLib“ sąsaja

Kaip parodyta 1 sąraše, sąsaja Funkcija turi tik vieną abstraktų metodą ir todėl yra funkcinė sąsaja. Atkreipkite dėmesį, kad ši sąsaja maždaug atitinka „Java 8“ „DoubleUnaryOperator“, rastas pakuotėje java.util.funkcija. Skirtumas yra tas Funkcija nenaudoja jokių kitų „Java 8“ funkcijų, išskyrus anotaciją @ Funkcinė sąsaja. Šios anotacijos pašalinimas yra vienintelis pakeitimas, būtinas norint atlikti Funkcija sąsaja suderinama su ankstesnėmis „Java“ versijomis.

Sąrašo 1. sąsaja Funkcija

 paketas com.softmoore.android.graphlib; @FunctionalInterface viešoji sąsaja Funkcija {public double apply (double x); } 

Sužinokite apie lambda išraiškas

Lambda išraiškos, taip pat žinomos kaip uždarymai, funkciniai literalai arba tiesiog lambdas, apibūdina funkcijų rinkinį, apibrėžtą „Java Specification Request“ (JSR) 335. Mažiau oficialūs „lambda“ posakių įvadai pateikiami naujausios „Java“ mokymo programos versijos skyriuje; „JavaWorld“ straipsnyje „Java programavimas su lambda išraiškomis“ ir keliuose Briano Goetzo straipsniuose „State of the lambda“ ir „State of the lambda: Libraries edition“.

„GraphLib“ klasės

Užsiėmimai Taškas ir Etiketė yra palyginti paprasti: Taškas apibendrina porą dvigubų verčių, žyminčių tašką x, y- lėktuvas ir Etiketė apima dvigubą vertę ir eilutę, kur dviguba reikšmė reiškia ašies tašką, o eilutė naudojama tam taškui pažymėti. 1 paveiksle pateiktame pavyzdyje naudojami taškai, apibūdinantys linijos diagramą ir ašies etiketes apačioje, nurodant mėnesių raidžių santrumpas. Toliau straipsnyje pateiksiu daugiau pavyzdžių, iliustruojančių šių klasių naudojimą.

Užsiėmimai „GraphFunction“, „GraphPoints“ir „ScreenPoint“ yra ne tik labai paprasti, bet ir bibliotekos vidiniai bei turi prieigą tik prie paketo. Jums tikrai nereikia suprasti šių klasių, kad galėtumėte naudotis biblioteka, todėl jas trumpai aprašysiu čia:

  • „GraphFunction“ apima funkciją (t. y. klasę, kuri įgyvendina sąsają Funkcija) ir spalva, naudojama šiai funkcijai nupiešti.
  • „GraphPoints“ apibendrina taškų sąrašą kartu su spalva, naudojama jiems braižyti. Ši klasė naudojama viduje tiek taškams braižyti, tiek braižyti linijų grafikus.
  • „ScreenPoint“ „Android“ įrenginio ekrane sukomponuoja skaičių skaičių reikšmę, nurodančią pikselių koordinates. Ši klasė yra panaši, bet paprastesnė nei „Android“ Taškas pakuotėje android.graphics.

Pateikiau šių klasių šaltinio kodą, jei jus domina išsami informacija.

Trys likusios „GraphLib“ bibliotekos klasės yra Grafikas, Grafikas. Statybininkasir „GraphView“. Svarbu suprasti kiekvieno iš jų vaidmenį „Android“ programoje.

Klasė Grafikas yra informacijos apie pieštinas spalvas, taškus, etiketes, grafikus ir kt., tačiau ji iš esmės nepriklauso nuo „Android“ grafikos detalių. Nors Grafikas turi daug laukų, visi jie turi numatytąsias reikšmes, todėl tikslinga naudoti „Builder“ modelį kuriant šios klasės egzempliorius. Klasė Grafikas yra įdėtas statinis poklasis, pavadintas Statybininkas, kuri naudojama kuriant Grafikas objektai.

Dvi klasės Grafikas ir Grafikas. Statybininkas iš kūrėjo perspektyvos ir turėtų būti suprantami iš esmės kaip vienas. Tiesą sakant, jums reikia tik suprasti, kaip naudoti įdėtą klasę Statybininkas sukurti Grafikas objektas. Kūrėjai iš tikrųjų nieko nedaro tiesiogiai su Grafikas objektas jį sukūrus, o ne perduoti jį a „GraphView“ objektas, kuris atlieka viską, kad būtų rodoma „Android“ įrenginyje.

2 sąraše apibendrinami klasėje galimi metodai Grafikas. Statybininkas. Vėlesni pavyzdžiai parodys, kaip naudoti „Builder“ modelį kuriant Grafikas objektai. Kol kas pakanka pažymėti, kad, išskyrus numatytąjį konstruktorių (pirmoji eilutė 2 sąraše) ir statyti () metodas (paskutinė 2 sąrašo eilutė), visi kiti metodai pateikia Statybininkas objektas. Tai leidžia susieti skambučius su kūrėjo metodais.

Sąrašas 2. Metodų santrauka klasėje Grafikas. Statybininkas

 public Builder () public Builder addFunction (Function function, int graphColor) public Builder addFunction (Function function) public Builder addPoints (Point [] points, int pointColor) public Builder addPoints (List points, int pointColor) public Builder addPoints (Point [] taškai) public Builder addPoints (taškų sąrašas) public Builder addLineGraph (Point [] taškai, int lineGraphColor) public Builder addLineGraph (taškų sąrašas, int lineGraphColor) public Builder addLineGraph (taškas [] taškai) public Builder addLineGraph (taškų sąrašas) public Builder setBackgroundColor (int bgColor) public Builder setAxesColor (int axesColor) public Builder setFunctionColor (int functColor) public Builder setPointColor (int pointColor) public Builder setWorldCoordinates (double xMin, double xMax, double yMin, double yMax) public Builder setX ) public Builder setXTicks (dvigubas [] xTicks) public Builder setXTicks (sąrašas xTicks) public Builder rinkinysYTYT (dvigubas [] yTicks) public Builder rinkinysYTYT (sąrašas yT) icks) public Builder setXLabels (Label [] xLabels) public Builder setXLabels (List xLabels) public Builder setYLabels (Label [] yLabels) public Builder setYLabels (List yLabels) public Graph build () 

2 sąraše pastebėsite, kad daugelis metodų yra perkrauti, kad būtų galima priimti objektų masyvus arba objektų sąrašus. Šio straipsnio pavyzdžiams teikiu pirmenybę masyvams, o ne sąrašams, vien todėl, kad masyvus inicijuoti yra daug lengviau, bet „GraphLib“ palaiko abu. Tačiau „Java 9“ bus patogūs gamyklos metodai kolekcijoms, taip pašalinant šį nedidelį masyvų pranašumą. Jei „Java 9“ būtų plačiai naudojama šio straipsnio metu, norėčiau, kad abiejuose būtų teikiami sąrašai, o ne masyvai „GraphLib“ ir vėlesni pavyzdžiai.

„Builder“ modelis

Norėdami sužinoti daugiau apie „Builder“ modelį, žr. Antrąjį Joshua Blocho efektyvios „Java“ leidimą arba Dustin Marx „JavaWorld“ straipsnį „Per daug parametrų„ Java “metoduose, 3 dalis:„ Builder “modelis“.

Vadinamos „Android“ vartotojo sąsajos klasės Peržiūrųir klasė Vaizdas pakuotėje android.view yra pagrindinis vartotojo sąsajos komponentų komponentas. Vaizdas užima stačiakampę sritį ekrane ir yra atsakingas už piešimą ir įvykių tvarkymą. Žiūrint iš paveldėjimo perspektyvos, klasė Vaizdas yra protėvių klasė ne tik vartotojo sąsajos valdikliai (mygtukai, teksto laukai ir kt.), bet ir maketai, kurie yra nematomos peržiūros grupės, kurios pirmiausia yra atsakingos už savo antrinių komponentų tvarkymą.

Klasė „GraphView“ pratęsia klasę Vaizdas ir yra atsakingas už informacijos, pateikiamos a Grafikas „Android“ įrenginio ekrane. Taigi, klasė „GraphView“ yra vieta, kur vyksta visas piešimas.

Naudojant „GraphLib“

Yra du „Android“ vartotojo sąsajų kūrimo būdai: procedūrinis metodas („Java“ šaltinio kode) arba deklaratyvus metodas (XML faile). Bet kuris iš jų yra galiojantis, tačiau sutarimas yra kuo labiau naudoti deklaratyvų požiūrį. Savo pavyzdžiams naudojau deklaratyvų požiūrį.

Yra penki pagrindiniai programos naudojimo žingsniai „GraphLib“ biblioteka. Prieš pradėdami atsisiųskite sukurtą „Java“ šaltinio kodą į „GraphLib“ biblioteką.

atsisiųsti Atsisiųsti „GraphLib.jar“ Gaukite sukompiliuotą „Java“ šaltinio kodą, skirtą „GraphLib“. Sukūrė Johnas I. Moore'as.

1 žingsnis. Padarykite „graphlib.jar“ prieinamą savo „Android“ projektui

Sukurkite naują projektą naudodami „Android Studio“ ir nukopijuokite JAR failą graphlib.jar į libs jūsų projekto pakatalogis programa kataloge. „Android Studio“ perjunkite aplanko struktūrą iš „Android“ į Projektas. Kitas, libs aplankas (įdėtas į programa aplanką), dešiniuoju pelės mygtuku spustelėkite JAR failą ir spustelėkite Pridėti kaip biblioteką. Šis paskutinis veiksmas pridės JAR failą jūsų programos priklausomybių skyriuje statyti.gradle failą. Žr. „Kaip pridėti stiklainį išorinėse„ Android Studio “bibliotekose“, jei jums reikia pagalbos atliekant šį veiksmą.

2 žingsnis. Sukurkite „Android“ veiklą, kuri naudos „GraphLib“

„Android“ programose veikla reiškia vieną ekraną su vartotojo sąsaja. Veikla pirmiausia apibrėžiama dviem failais: XML failas, nurodantis vartotojo sąsajos išdėstymą ir komponentus, ir „Java“ failas, apibrėžiantis vykdymo laiko funkcijas, pvz., Įvykių tvarkymą. Kai sukuriamas naujas projektas, „Android Studio“ paprastai sukuria numatytąją veiklą Pagrindinis užsiėmimas. Naudokite šią veiklą arba sukurkite naują savo programai.

3 žingsnis. Prie veiklos išdėstymo pridėkite „GraphView“

Veiklos išdėstymo XML faile deklaruosite „GraphView“ objektą panašiai kaip deklaruojate mygtuką arba teksto rodinį, išskyrus tai, kad turite nurodyti visą paketo pavadinimą „GraphView“. 3 sąraše rodoma maketo failo ištrauka, kurioje deklaruojamas a „GraphView“ po kurio eina a „TextView“ kaip vertikalaus linijinio išdėstymo dalis. Laikantis rekomenduojamos praktikos, faktinės plokštės pločio ir aukščio vertės „GraphView“ yra apibrėžti atskirai matmuo išteklių failai, kur skirtingi išteklių failai pateikia skirtingo ekrano dydžio / tankio vertes. (Pastaba: Aš naudoju 325 abiejose toliau pateiktų pavyzdžių vertėse.)

Sąrašas 3. „GraphView“ ir „TextView“ deklaravimas išdėstymo XML faile

4 veiksmas. Importuokite bibliotekos klases į veiklą

4 sąraše rodomas programos importavimo ataskaitų sąrašas, jei bibliotekos klasės importuojamos atskirai. Importo sąrašą galima sutrumpinti į vieną eilutę kaip importuoti com.softmoore.android.graphlib. * jei pageidaujama. Asmeniškai aš norėčiau pamatyti išplėstą sąrašą, kaip parodyta 4 sąraše.

Sąrašas 4. Importuokite bibliotekos klases

 importuoti com.softmoore.android.graphlib.Function; importuoti com.softmoore.android.graphlib.Graph; importuoti com.softmoore.android.graphlib.GraphView; importuoti com.softmoore.android.graphlib.Label; importuoti com.softmoore.android.graphlib.Point; 

5 žingsnis. Sukurkite „Graph“ objektą ir pridėkite jį prie „GraphView“

5 sąraše rodomas paprasto grafiko objekto sukūrimas - šiuo atveju grafiko objektas, kuriame naudojamos visos numatytosios reikšmės. Iš esmės jame yra tik rinkinys x- ir y-ašai, kur abiejų ašių vertės svyruoja nuo 0 iki 10. Sąraše taip pat nustatomas ekrano pavadinimas ir teksto rodinio tekstas po diagrama.

Sąrašas 5. Sukurkite „Graph“ objektą ir pridėkite jį prie „GraphView“

 Grafiko diagrama = new Graph.Builder () .build (); GraphView graphView = findViewById (R.id.graph_view); graphView.setGraph (grafikas); setTitle („Tuščias grafikas“); TextView textView = findViewById (R.id.graph_view_label); textView.setText ("Ašių grafikas"); 

2 paveiksle parodytas šios programos vykdymo „Android“ įrenginyje rezultatas.

Johnas I. Moore'as

„GraphLib“ naudojimas „Android“ programose

Likusioje straipsnio dalyje daugiausia dėmesio skirsiu „GraphLib“ bibliotekos realiam naudojimui kuriant „Android“ programas. Pateiksiu septynis pavyzdžius su trumpais aprašymais ir šaltinio kodo ištraukomis. Atminkite, kad šių pavyzdžių „Java“ kodų sąrašai skirti naudoti Grafikas. Statybininkas sukurti tinkamą Grafikas objektas. Skambučiai į findViewById (), setGraph (), setTitle ()ir pan., būtų panašūs į 5 sąraše pateiktus ir nėra įtraukti į kodų sąrašus.