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. MooreV 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 vmesnikFunkcija
) 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 AndroidTočka
v paketuandroid.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.
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. MooreUporaba 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.