Programiranje

GraphLib: odprtokodna knjižnica Android za grafe

Grafi in grafikoni podatkov so čudovita orodja za ponazoritev odnosov, prikaz podatkovnih trendov in sledenje ciljem v aplikacijah za Android. To sem se prepričal tudi sam pred nekaj leti, ko je nekdanji moj študent osvojil prvo mesto na študentskem tekmovanju v mobilnih aplikacijah, ki ga je sponzoriralo Združenje izvajalcev obrambe Charleston. Ključna značilnost zmagovalne aplikacije, "Diabetes in jaz", je bila zmožnost dnevnega prikazovanja ravni sladkorja.

Še en primer je aplikacija za sledenje teže, ki prikazuje napredek glede na ciljno težo. Slika 1 prikazuje, kako bi lahko bila taka aplikacija videti na telefonu Android. Slika uporablja rdeč črtogram za prikaz povprečnih mesečnih uteži za leto 2017. Ciljno težo prikazuje kot zeleno ravno črto blizu dna. (Čeprav so vrednosti podatkov, prikazane v črtnem grafu, hipotetične, so realne glede avtorja tega članka.)

John I. Moore

V tem članku bom z odprtokodno knjižnico GraphLib predstavil osnove grafičnega prikazovanja matematičnih funkcij v Androidu. To ni ista knjižnica grafov, ki jo je moj študent uporabil za svojo prijavo. Pravzaprav je veliko preprostejši in enostavnejši za uporabo.

prenos Prenos GraphLib Pridobite izvorno kodo za odprtokodno grafično knjižnico Android, predstavljeno v tem članku. Ustvaril John I. Moore.

Pregled GraphLib

GraphLib je sestavljen iz enega vmesnika in osmih razredov. Trije od teh razredov so interni v knjižnici in imajo samo paketni dostop, zato vam jih za uporabo GraphLib ne bo treba razumeti. Dva od preostalih razredov imata zelo preprosto funkcionalnost, preostalih pa ni težko pobrati.

Spodaj bom opisal vmesnik GraphLib in vsakega od njegovih osmih razredov. Upoštevajte, da sem za razvijanje in preizkušanje knjižnice uporabljal funkcije Java 8, kot so funkcionalni vmesniki in lambda izrazi, vendar je te značilnosti razmeroma enostavno spremeniti za starejše različice Jave.

Funkcionalni vmesnik GraphLiba

Kot je prikazano v seznamu 1, vmesnik Funkcija ima samo eno abstraktno metodo in je zato funkcionalen vmesnik. Upoštevajte, da je ta vmesnik približno enakovreden Java 8 DoubleUnaryOperator, najdena v paketu java.util.function. Razlika je v tem Funkcija ne uporablja nobene funkcije Java 8, razen pripisa @FunctionalInterface. Odstranjevanje tega pripisa je edina sprememba, ki je potrebna za izvedbo Funkcija vmesnik, združljiv s starejšimi različicami Jave.

Seznam 1. Funkcija vmesnika

 paket com.softmoore.android.graphlib; @FunctionalInterface javni vmesnik Funkcija {public double apply (double x); } 

Spoznavanje lambda izrazov

Lambda izrazi, znani tudi kot zapiranja, funkcijski dobesedni izrazi ali preprosto lambda, opisujejo nabor funkcij, opredeljenih v zahtevi za specifikacijo Java (JSR) 335. Manj formalni uvod v lambda izraze je na voljo v delu najnovejše različice vadnice Java; v članku JavaWorld "Programiranje Java z lambda izrazi" in v nekaj člankih Briana Goetza, "Stanje lambde" in "Stanje lambde: izdaja knjižnic."

Razredi GraphLib

Predavanja Točka in Oznaka so razmeroma preproste: Točka enkapsulira par dvojnih vrednosti, ki predstavljajo točko v x, y-letalo in Oznaka enkapsulira dvojno vrednost in niz, pri čemer dvojna vrednost predstavlja točko na osi, niz pa se uporablja za označevanje te točke. Primer na sliki 1 s točkami opisuje linijski graf in nalepke za os na dnu, ki prikazujejo enočrkovne okrajšave za mesece. V nadaljevanju članka bom predstavil več primerov, ki ponazarjajo uporabo teh razredov.

Predavanja GraphFunction, GraphPoints, in ScreenPoint niso samo zelo preprosti, ampak so tudi notranje v knjižnici in imajo samo paketni dostop. Za uporabo knjižnice teh razredov resnično ni treba razumeti, zato jih bom na kratko opisal tukaj:

  • GraphFunction enkapsulira funkcijo (tj. razred, ki izvaja vmesnik Funkcija) in barvo, ki se uporablja za risanje te funkcije.
  • GraphPoints inkapsulira seznam točk skupaj z barvo, uporabljeno za njihovo risanje. Ta razred se interno uporablja tako za risanje točk kot za risanje linijskih grafov.
  • ScreenPoint enkapsulira par celoštevilnih vrednosti, ki predstavljajo koordinate pikslov na zaslonu naprave Android. Ta razred je podoben, vendar preprostejši od razreda Android Točka v paketu android.graphics.

Za te razrede sem navedel izvorno kodo, če vas podrobnosti zanimajo.

Preostali trije razredi v knjižnici GraphLib so Graf, Graph.Builder, in GraphView. Pomembno je razumeti vlogo, ki jo ima vsak od njih v aplikaciji za Android.

Razred Graf vsebuje informacije o barvah, točkah, nalepkah, grafih itd., ki jih je treba narisati, vendar je v bistvu neodvisno od podrobnosti grafike Android. Medtem Graf ima veliko polj, vsa imajo privzete vrednosti, zato je smiselno uporabiti vzorec Builder za ustvarjanje primerkov tega razreda. Razred Graf vsebuje ugnezdeni statični podrazred z imenom Graditelj, ki se uporablja za ustvarjanje Graf predmetov.

Dva razreda Graf in Graph.Builder iti skupaj z vidika razvijalca in bi jih bilo treba razumeti v bistvu kot eno. V resnici morate le razumeti, kako uporabljati ugnezdeni razred Graditelj ustvariti a Graf predmet. Razvijalci v resnici ničesar ne naredijo neposredno z a Graf predmet, potem ko je bil ustvarjen, razen da ga posreduje GraphView object, ki deluje tako, da prikaže vse v napravi Android.

Seznam 2 povzema metode, ki so na voljo v razredu Graph.Builder. Kasnejši primeri bodo ponazorili, kako uporabiti vzorec Builder za ustvarjanje Graf predmetov. Za zdaj je dovolj omeniti, da poleg privzetega konstruktorja (prva vrstica v seznamu 2) in zgraditi () (zadnja vrstica v seznamu 2), vse druge metode vrnejo Graditelj predmet. To omogoča povezovanje klicev z metodami graditelja.

Seznam 2. Povzetek metod v razredu Graph.Builder

 public Builder () public Builder addFunction (funkcija funkcije, int graphColor) javni Builder addFunction (funkcija funkcije) javni Builder addPoints (Point [] točke, int pointColor) javni Builder addPoints (seznam točk, int pointColor) javni Builder addPoints (Point [] točke) public Builder addPoints (seznam točk) public Builder addLineGraph (Point [] points, int lineGraphColor) public Builder addLineGraph (List points, int lineGraphColor) public Builder addLineGraph (Point [] points) public Builder addLineGraph (List points) public Builder setBackgroundColor (int bgColor) javni graditelj setAxesColor (int axesColor) javni graditelj setFunctionColor (int functColor) javni graditelj setPointColor (int pointColor) javni graditelj setWorldCoordinate (dvojni xMin, dvojni xMax, dvojni yMin, dvojni yMax) javni graditelj setAxes (dvojna osX, dvojna os Y ) javni graditelj setXTicks (dvojni [] xTicks) javni graditelj setXTicks (seznam xTicks) javni graditelj setYTicks (dvojni [] yTicks) javni graditelj setYTicks (seznam 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 () 

V seznamu 2 boste opazili, da je veliko metod preobremenjenih za sprejem bodisi nizov predmetov bodisi seznamov predmetov. Za primere v tem članku dajem prednost matrikam pred seznami, preprosto zato, ker je nize lažje inicializirati, vendar GraphLib podpira oboje. Vendar bo Java 9 vseboval priročne tovarniške metode za zbirke in s tem odstranil to majhno prednost za nize. Če bi bila Java 9 v času tega članka v široki uporabi, bi imela raje sezname kot polja v obeh GraphLib in poznejši primeri.

Vzorec graditelja

Če želite izvedeti več o vzorcu Builder, si oglejte drugo izdajo Effective Java avtorja Joshua Blocha ali članek JavaWorld »Preveč parametrov v metodah Java, 3. del: Vzorec Builderja« avtorja Dustina Marxa.

V Androidu se imenujejo razredi uporabniškega vmesnika pogledi, in razred Pogled v paketu android.view je osnovni gradnik komponent uporabniškega vmesnika. Pogled zaseda pravokotno območje na zaslonu in je odgovoren za risanje in obdelavo dogodkov. Z vidika dedovanja razred Pogled je razred prednikov ne samo kontrol uporabniškega vmesnika (gumbi, besedilna polja itd.), temveč tudi postavitve, ki so nevidne skupine pogledov, ki so v prvi vrsti odgovorne za razporeditev njihovih podrejenih komponent.

Razred GraphView podaljša razred Pogled in je odgovoren za prikaz informacij, vključenih v a Graf na zaslonu naprave Android. Tako razred GraphView kjer poteka vsa risba.

Uporaba GraphLib

Obstajata dva pristopa k ustvarjanju uporabniških vmesnikov za Android: postopkovni pristop (znotraj izvorne kode Java) ali deklarativni pristop (v datoteki XML). Vsak od njih je veljaven, vendar je konsenz ta, da čim bolj uporabimo deklarativni pristop. Za svoje primere sem uporabil deklarativni pristop.

Obstaja pet osnovnih korakov za uporabo GraphLib knjižnica. Preden začnete, prenesite sestavljeno izvorno kodo Java za knjižnico GraphLib.

prenesi Prenesi GraphLib.jar Pridobite prevedeno izvorno kodo Java za GraphLib. Ustvaril John I. Moore.

Korak 1. Naredite graphlib.jar na voljo vašemu projektu Android

Ustvarite nov projekt z Android Studiom in kopirajte datoteko JAR graphlib.jar do ustnice podimenik vašega projekta app imenik. V Android Studio preklopite strukturo map iz Android do Projekt. Nato v ustnice mapa (ugnezdena v app mapo), z desno miškino tipko kliknite datoteko JAR in kliknite na Dodaj kot knjižnico. To zadnje dejanje bo dodalo datoteko JAR v odsek odvisnosti aplikacije build.gradle mapa. Glejte "Kako dodati kozarec v zunanje knjižnice v Android Studio", če potrebujete pomoč pri tem koraku.

Korak 2. Ustvarite dejavnost Androida, ki bo uporabljala GraphLib

V aplikacijah za Android je dejavnosti predstavlja en zaslon z uporabniškim vmesnikom. Dejavnosti so opredeljene predvsem v dveh datotekah: datoteki XML, ki označuje postavitev uporabniškega vmesnika in komponent, in datoteki Java, ki definira funkcionalnost izvajalnega okolja, kot je obdelava dogodkov. Ko se ustvari nov projekt, Android Studio običajno ustvari privzeto aktivnost z imenom MainActivity. Uporabite to dejavnost ali ustvarite novo za svojo aplikacijo.

Korak 3. V postavitev dejavnosti dodajte GraphView

V datoteki XML za postavitev dejavnosti boste navedli GraphView predmet na približno enak način, kot prijavite gumb ali pogled besedila, le da morate za GraphView. Seznam 3 prikazuje izvleček iz datoteke postavitve, ki razglasi GraphView čemur sledi a TextView kot del navpične linearne postavitve. Po priporočeni praksi dejanske vrednosti za širino in višino GraphView so opredeljeni ločeno dimen datoteke z viri, kjer različne datoteke z viri zagotavljajo vrednosti za različne velikosti / gostote zaslona. (Opomba: V spodnjih primerih sem uporabil 325 za obe vrednosti.)

Seznam 3. Deklariranje GraphView in TextView v datoteki XML postavitve

Korak 4. Uvozite knjižnične razrede v dejavnost

Seznam 4 prikazuje seznam uvoznih stavkov za aplikacijo, če se knjižnični razredi uvažajo posamezno. Seznam uvoza je mogoče skrajšati v eno vrstico kot uvoz com.softmoore.android.graphlib. * po želji. Osebno raje vidim razširjeni seznam, kot je prikazano v seznamu 4.

Seznam 4. Uvoz knjižničnih razredov

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

Korak 5. Ustvarite objekt Graph in ga dodajte v GraphView

Seznam 5 prikazuje ustvarjanje preprostega grafnega predmeta - v tem primeru grafskega objekta, ki uporablja vse privzete vrednosti. V bistvu vsebuje le nabor x- in y-ose, kjer se vrednosti na obeh oseh gibljejo od 0 do 10. Seznam vsebuje tudi naslov zaslona in besedilo za pogled besedila pod grafom.

Seznam 5. Ustvarite objekt Graph in ga dodajte v GraphView

 Graf grafa = nov Graph.Builder () .build (); GraphView graphView = findViewById (R.id.graph_view); graphView.setGraph (graf); setTitle ("Prazen graf"); TextView textView = findViewById (R.id.graph_view_label); textView.setText ("Graf osi"); 

Slika 2 prikazuje rezultat izvajanja te aplikacije v napravi Android.

John I. Moore

Uporaba GraphLib v aplikacijah za Android

Preostanek članka se bom osredotočil na resnično uporabo knjižnice GraphLib pri razvoju aplikacij za Android. Predstavil bom sedem primerov s kratkimi opisi in izvlečki izvorne kode. Upoštevajte, da so seznami kod Java za te primere osredotočeni na uporabo Graph.Builder ustvariti ustrezen Graf predmet. Klici na findViewById (), setGraph (), setTitle ()itd., bi bili podobni tistim, ki so prikazani v seznamu 5, in niso vključeni v sezname kod.

$config[zx-auto] not found$config[zx-overlay] not found