Ohjelmointi

GraphLib: avoimen lähdekoodin Android-kirjasto kaavioille

Kaaviot ja datakaaviot ovat upeita työkaluja suhteiden havainnollistamiseksi, datatrendien kuvaamiseksi ja tavoitteiden seuraamiseksi Android-sovelluksissasi. Näin tämän itse useita vuosia sitten, kun entinen opiskelijani voitti ensimmäisen sijan opiskelijoiden mobiilisovelluskilpailussa, jota sponsoroi Charleston Defense Contractors Association. Voitetun sovelluksen "Diabetes ja minä" keskeinen piirre oli kyky piirtää päivittäiset sokeritasot.

Toisena esimerkkinä on painonseurantaohjelma, joka kuvaa edistymistä maalipainoon nähden. Kuva 1 kuvaa, miltä tällainen sovellus saattaa näyttää Android-puhelimelta. Kuvassa käytetään punaista viivakaaviota vuoden 2017 keskimääräisten kuukausipainojen osoittamiseksi. Se osoittaa maalipainon vihreänä suorana viivana lähellä pohjaa. (Vaikka viivakaaviossa esitetyt data-arvot ovat hypoteettisia, ne ovat realistisia tämän artikkelin kirjoittajan suhteen.)

John I.Moore

Tässä artikkelissa käytän avoimen lähdekoodin kirjastoa GraphLibiä esittelemään matemaattisten funktioiden kuvaajien kuvaamisen perusteet Androidissa. Se ei ole sama graafikirjasto, jota opiskelijani käytti sovelluksessaan. Itse asiassa se on paljon yksinkertaisempi ja helpompi käyttää.

Lataa Lataa GraphLib Hanki tässä artikkelissa esitetyn avoimen lähdekoodin Android-graafikirjaston lähdekoodi. Luonut John I.Moore.

Yleiskatsaus GraphLibiin

KaavioLib koostuu yhdestä liitännästä ja kahdeksasta luokasta. Kolme näistä luokista on kirjaston sisäisiä, ja niillä on vain pakettien käyttöoikeus, joten sinun ei tarvitse ymmärtää niitä voidaksesi käyttää GraphLibiä. Kahdella jäljellä olevasta luokasta on hyvin yksinkertainen toiminnallisuus, ja loput eivät ole vaikeita poimia.

Seuraavassa kuvaan GraphLib-käyttöliittymää ja kaikkia sen kahdeksan luokkaa. Huomaa, että käytin Java 8 -ominaisuuksia, kuten toiminnallisia rajapintoja ja lambda-lausekkeita, kirjaston kehittämiseen ja testaamiseen, mutta näiden ominaisuuksien muokkaaminen aikaisemmille Java-versioille on suhteellisen helppoa.

GraphLibin toiminnallinen käyttöliittymä

Kuten luettelossa 1 on esitetty, käyttöliittymä Toiminto on vain yksi abstrakti menetelmä ja on siksi toiminnallinen rajapinta. Huomaa, että tämä käyttöliittymä vastaa suunnilleen Java 8: ta DoubleUnaryOperator, löytyy pakkauksesta java.util.toiminto. Ero on siinä Toiminto ei käytä muita Java 8 -ominaisuuksia kuin merkinnät @FunctionalInterface. Tämän merkinnän poistaminen on ainoa muutos, joka tarvitaan Toiminto käyttöliittymä yhteensopiva aiempien Java-versioiden kanssa.

Listaus 1. käyttöliittymä Toiminto

 paketti com.softmoore.android.graphlib; @FunctionalInterface julkinen käyttöliittymä Toiminto {public double apply (double x); } 

Opi lambda-ilmaisuista

Lambda-lausekkeet, jotka tunnetaan myös nimellä sulkemiset, funktiolitraalit tai yksinkertaisesti lambdas, kuvaavat joukkoa Java Specification Request (JSR) 335: ssä määriteltyjä ominaisuuksia. Vähemmän muodollisia esittelyjä lambda-lausekkeisiin on Java-opetusohjelman uusimman version osiossa; JavaWorld-artikkelissa "Java-ohjelmointi lambda-lausekkeilla" ja parissa Brian Goetzin artikkelissa "State of the lambda" ja "State of the lambda: Libraries edition".

GraphLib-luokat

Luokat Kohta ja Tarra ovat suhteellisen yksinkertaisia: Kohta kapseloi parin kaksoisarvoja, jotka edustavat pistettä x, y-taso, ja Tarra kapseloi kaksinkertaisen arvon ja merkkijonon, jossa kaksoisarvo edustaa pistettä akselilla ja merkkijonoa käytetään kyseisen pisteen merkitsemiseen. Kuvan 1 esimerkissä käytetään pisteitä viivakaavion ja alareunassa olevan akselin etikettien kuvaamiseen, joissa esitetään yhden kirjaimen lyhenteet kuukausille. Annan lisää esimerkkejä näiden luokkien käytöstä myöhemmin artikkelissa.

Luokat GraphFunction, GraphPointsja ScreenPoint eivät ole vain hyvin yksinkertaisia, ne ovat myös kirjaston sisäisiä ja niillä on vain pakettien käyttöoikeus. Sinun ei oikeastaan ​​tarvitse ymmärtää näitä luokkia voidaksesi käyttää kirjastoa, joten kuvaan ne vain lyhyesti tässä:

  • GraphFunction kapseloi toiminnon (eli luokan, joka toteuttaa rajapinnan Toiminto) ja kyseisen toiminnon piirtämiseen käytetty väri.
  • GraphPoints kapseloi luettelon pisteistä yhdessä niiden piirtämiseen käytetyn värin kanssa. Tätä luokkaa käytetään sisäisesti sekä pisteiden piirtämiseen että viivakaavioiden piirtämiseen.
  • ScreenPoint kapseloi parin kokonaislukuarvoja, jotka edustavat pikselikoordinaatteja Android-laitteen näytöllä. Tämä luokka on samanlainen kuin Android-luokka, mutta yksinkertaisempi Kohta pakkauksessa android.graphics.

Olen toimittanut näiden luokkien lähdekoodin, jos olet kiinnostunut yksityiskohdista.

GraphLib-kirjaston kolme jäljellä olevaa luokkaa ovat Kaavio, Kaavio.Rakentajaja GraphView. On tärkeää ymmärtää, mikä rooli heillä on Android-sovelluksessa.

Luokka Kaavio sisältää tietoja piirrettävistä väreistä, pisteistä, tarroista, kaavioista jne., mutta on olennaisesti riippumaton Android-grafiikan yksityiskohdista. Sillä aikaa Kaavio on paljon kenttiä, niillä kaikilla on oletusarvot, ja siksi on järkevää käyttää Builder-mallia tämän luokan esiintymien luomiseen. Luokka Kaavio sisältää sisäkkäisen staattisen alaluokan nimeltä Rakentaja, jota käytetään luomiseen Kaavio esineitä.

Kaksi luokkaa Kaavio ja Kaavio.Rakentaja menevät yhdessä, kehittäjän näkökulmasta, ja ne tulisi ymmärtää lähinnä yhtenä. Todellisuudessa sinun on vain ymmärrettävä, kuinka sisäkkäistä luokkaa käytetään Rakentaja luoda a Kaavio esine. Kehittäjät eivät todellakaan tee mitään suoraan Kaavio objekti sen jälkeen kun se on luotu muu kuin välittää se a: lle GraphView objekti, joka näyttää kaiken Android-laitteella.

Listaus 2 sisältää yhteenvedon luokassa käytettävissä olevista menetelmistä Kaavio.Rakentaja. Myöhemmissä esimerkeissä kuvataan, miten Builder-mallia käytetään luomiseen Kaavio esineitä. Toistaiseksi riittää huomata, että paitsi oletusrakentaja (luettelon 2 ensimmäinen rivi) ja rakentaa() (viimeinen rivi luettelossa 2), kaikki muut menetelmät palauttavat Rakentaja esine. Tämä antaa mahdollisuuden ketjuttaa rakentajien menetelmiin.

Listaus 2. Yhteenveto luokan menetelmistä Kaavio.Rakentaja

 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 [] points) public Builder addPoints (List points) 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) 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 (double [] xTicks) public Builder setXTicks (List xTicks) public Builder setYTicks (double [] yTicks) public Builder setYTicks (List 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 () 

Huomaa luettelossa 2, että monet menetelmät ovat ylikuormitettuja hyväksymään joko objektijoukot tai objektiluettelot. Annan parempana taulukot luetteloiden sijasta tässä artikkelissa oleviin esimerkkeihin yksinkertaisesti siksi, että taulukoiden alustaminen on paljon helpompaa, mutta KaavioLib tukee molempia. Java 9 sisältää kuitenkin mukavuustehdasmenetelmät kokoelmille, mikä poistaa tämän pienen matriisien edun. Jos Java 9 olisi ollut laajalti käytössä tämän artikkelin julkaisuhetkellä, olisin pitänyt parempana luetteloita molempien taulukoiden sijaan KaavioLib ja myöhemmät esimerkit.

Rakentaja-kuvio

Jos haluat lisätietoja Builder-mallista, katso Joshua Blochin Effective Java -mallin toinen painos tai Dustin Marxin JavaWorld-artikkeli "Liian monta parametria Java-menetelmissä, osa 3: Builder-malli".

Android-käyttöliittymäluokkia kutsutaan näkymätja luokka Näytä pakkauksessa android.view on käyttöliittymäkomponenttien perusrakenne. Näkymä on ruudun suorakulmainen alue, ja se vastaa piirustuksesta ja tapahtumien käsittelystä. Perinnöllisyyden näkökulmasta luokka Näytä on esi-isäluokka paitsi käyttöliittymän ohjaimista (painikkeet, tekstikentät jne.), mutta myös asetteluista, jotka ovat näkymättömiä näkymäryhmiä, jotka ovat ensisijaisesti vastuussa alikomponenttiensa järjestämisestä.

Luokka GraphView pidentää luokkaa Näytä ja on vastuussa a: hon kapseloitujen tietojen näyttämisestä Kaavio Android-laitteen näytöllä. Siksi luokka GraphView missä kaikki piirustus tapahtuu.

GraphLibin käyttäminen

Android-käyttöliittymien luomiseen on kaksi tapaa: menettelytapa (Java-lähdekoodissa) tai deklaratiivinen lähestymistapa (XML-tiedostossa). Kumpi tahansa on pätevä, mutta yksimielisyys on käyttää deklaratiivista lähestymistapaa niin paljon kuin mahdollista. Olen käyttänyt deklaratiivista lähestymistapaa esimerkkeihini.

Ominaisuuden käytössä on viisi perusvaihetta KaavioLib kirjasto. Ennen kuin aloitat, lataa koottu Java-lähdekoodi GraphLib-kirjastoon.

lataa Lataa GraphLib.jar Hanki käännetty Java-lähdekoodi GraphLibille. Luonut John I.Moore.

Vaihe 1. Aseta graphlib.jar saataville Android-projektillesi

Luo uusi projekti Android Studion avulla ja kopioi JAR-tiedosto graphlib.jar että libs projektisi alihakemisto sovellus hakemistoon. Vaihda kansiorakenne Android Studiossa Android että Projekti. Seuraavaksi libs kansio (sisäkkäin sovellus kansio), napsauta hiiren kakkospainikkeella JAR-tiedostoa ja napsauta Lisää kirjastona. Tämä viimeinen toiminto lisää JAR-tiedoston sovelluksesi riippuvuusosioon build.gradle tiedosto. Katso "Kuinka lisätä purkki ulkoisiin kirjastoihin Android Studiossa", jos tarvitset apua tässä vaiheessa.

Vaihe 2. Luo Android-toiminto, joka käyttää GraphLibiä

Android-sovelluksissa toiminta edustaa yhtä näyttöä, jossa on käyttöliittymä. Aktiviteetit määritellään ensisijaisesti kahdessa tiedostossa: XML-tiedosto, joka ilmoittaa käyttöliittymän asettelun ja komponentit, ja Java-tiedosto, joka määrittelee ajonaikaiset toiminnot, kuten tapahtumien käsittely. Kun uusi projekti luodaan, Android Studio luo yleensä oletusaktiviteetin nimeltä Pääaktiviteetti. Käytä tätä toimintaa tai luo uusi sovelluksellesi.

Vaihe 3. Lisää GraphView toiminnan asetteluun

Ilmoitat toiminnan asettelun XML-tiedostossa a GraphView esine samalla tavalla kuin ilmoitat painikkeen tai tekstinäkymän, paitsi että sinun on annettava koko paketin nimi GraphView. Luettelossa 3 näkyy ote asettelutiedostosta, joka ilmoittaa a GraphView jota seuraa a Tekstinäkymä osana pystysuoraa lineaarista asettelua. Noudattamalla suositeltua käytäntöä, leveyden ja korkeuden todelliset arvot GraphView määritellään erikseen dimen resurssitiedostot, joissa eri resurssitiedostot tarjoavat arvoja eri näytön kooille / tiheydelle. (Huomaa: Käytin 325: tä molempiin arvoihin alla olevissa esimerkeissä.)

Listaus 3. GraphView- ja TextView-ilmoitusten asettelu XML-tiedostossa

Vaihe 4. Tuo kirjastoluokat aktiviteettiin

Listaus 4 näyttää luettelon sovelluksen tuontilausekkeista, jos kirjastoluokkia tuodaan erikseen. Tuontiluettelo voidaan lyhentää yhdelle riville muodossa tuo com.softmoore.android.graphlib. * haluttaessa. Henkilökohtaisesti haluan nähdä laajennetun luettelon luettelon 4 mukaisesti.

Listaus 4. Tuo kirjastoluokat

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

Vaihe 5. Luo Graph-objekti ja lisää se GraphView-näkymään

Listaus 5 näyttää yksinkertaisen kaavioobjektin luomisen - tässä tapauksessa kaavioobjektin, joka käyttää kaikkia oletusarvoja. Se sisältää olennaisesti vain joukon x- ja y-aksit, joissa molempien akselien arvot vaihtelevat välillä 0-10. Luettelossa asetetaan myös otsikko näytölle ja teksti kaavion alla olevalle tekstinäkymälle.

Luettelointi 5. Luo Graph-objekti ja lisää se GraphView-näkymään

 Kaaviokaavio = new Graph.Builder () .build (); GraphView graphView = findViewById (R.id.graph_view); graphView.setGraph (kaavio); setTitle ("Tyhjä kaavio"); TextView textView = findViewById (R.id.graph_view_label); textView.setText ("Kaavio akseleista"); 

Kuvassa 2 on esitetty tämän sovelluksen suorittamisen tulos Android-laitteella.

John I.Moore

GraphLibin käyttö Android-sovelluksissa

Artikkelin loppuosassa keskityn GraphLib-kirjaston reaalimaailman käyttöön Android-sovelluskehityksessä. Esitän seitsemän esimerkkiä, joissa on lyhyet kuvaukset ja lähdekoodi-otteet. Huomaa, että näiden esimerkkien Java-koodiluettelot keskittyvät käyttämiseen Kaavio.Rakentaja luoda sopiva Kaavio esine. Puhelut findViewById (), setGraph (), setTitle ()jne., ovat samanlaisia ​​kuin luettelossa 5 esitetyt ja eivät sisälly koodiluetteloihin.