Programmēšana

GraphLib: Atvērtā koda Android bibliotēka grafikiem

Diagrammas un datu diagrammas ir brīnišķīgi rīki attiecību ilustrēšanai, datu tendenču attēlošanai un mērķu izsekošanai Android lietotnēs. Es to redzēju pats pirms vairākiem gadiem, kad mans bijušais students ieguva pirmo vietu studentu mobilo lietotņu konkursā, kuru sponsorēja Čārlstonas Aizsardzības darbuzņēmēju asociācija. Galvenā uzvarējušās lietotnes "Diabēts un es" iezīme bija spēja attēlot ikdienas cukura līmeni.

Kā vēl vienu piemēru ņemiet vērā svara izsekošanas lietojumprogrammu, kas attēlo progresu attiecībā pret mērķa svaru. 1. attēlā parādīts, kā šāda lietojumprogramma varētu izskatīties Android tālrunī. Attēlā tiek izmantota sarkanā līnijas diagramma, lai parādītu vidējos mēneša svarus 2017. gadam. Tas parāda mērķa svaru kā zaļu taisnu līniju netālu no apakšas. (Lai gan līniju diagrammā norādītās datu vērtības ir hipotētiskas, tās ir reālas attiecībā uz šī raksta autoru.)

Džons I. Mūrs

Šajā rakstā es izmantošu savu atvērtā pirmkoda bibliotēku GraphLib, lai parādītu Android matemātisko funkciju grafiku pamatus. Tā nav tā pati diagrammu bibliotēka, kuru mans students izmantoja savai lietojumprogrammai. Patiesībā tas ir daudz vienkāršāk un vieglāk lietojams.

lejupielādēt Lejupielādēt GraphLib Iegūstiet šajā rakstā ievadītās atvērtā pirmkoda Android grafiku bibliotēkas avota kodu. Izveidoja Džons I. Mūrs.

Pārskats par GraphLib

GraphLib sastāv no viena interfeisa un astoņām klasēm. Trīs no šīm klasēm atrodas bibliotēkas iekšienē, un tām ir piekļuve tikai pakotnēm, tāpēc, lai izmantotu GraphLib, jums tās nevajadzēs saprast. Divām no atlikušajām klasēm ir ļoti vienkārša funkcionalitāte, un pārējās nav grūti uzņemt.

Zemāk es aprakstīšu GraphLib saskarni un katru no tās astoņām klasēm. Ņemiet vērā, ka bibliotēkas izstrādei un testēšanai es izmantoju Java 8 funkcijas, piemēram, funkcionālās saskarnes un lambda izteiksmes, taču modificēt šīs funkcijas iepriekšējām Java versijām ir samērā vienkārši.

GraphLib funkcionālais interfeiss

Kā parādīts 1. saraksta saskarnē Funkcija ir tikai viena abstrakta metode, un tāpēc tā ir funkcionāla saskarne. Ņemiet vērā, ka šī saskarne ir aptuveni līdzvērtīga Java 8 DoubleUnaryOperator, atrodams iepakojumā java.util.function. Atšķirība ir tā Funkcija neizmanto citas Java 8 funkcijas, izņemot anotāciju @ Funkcionālā saskarne. Šīs anotācijas noņemšana ir vienīgās izmaiņas, kas nepieciešamas, lai veiktu Funkcija saskarne ir saderīga ar iepriekšējām Java versijām.

Saraksta 1. saskarnes funkcija

 pakete com.softmoore.android.graphlib; @FunctionalInterface publiskā saskarne Funkcija {public double apply (double x); } 

Uzziniet par lambda izteicieniem

Lambda izteiksmes, kas pazīstamas arī kā slēgšanas, funkciju literāļi vai vienkārši lambdas, apraksta funkciju kopu, kas definēta Java specifikācijas pieprasījumā (JSR) 335. Mazāk formāli lambda izteicienu ievadi ir sniegti Java apmācības jaunākās versijas sadaļā; JavaWorld rakstā "Java programmēšana ar lambda izteiksmēm" un pāris Braiena Geca rakstos "State of the lambda" un "State of the lambda: Libraries edition".

GraphLib klases

Klases Punkts un Etiķete ir salīdzinoši vienkārši: Punkts iekapsulē dubultu vērtību pāri, kas apzīmē punktu x, y- lidmašīna un Etiķete iekapsulē dubultu vērtību un virkni, kur dubultā vērtība apzīmē punktu uz ass, un virkne tiek izmantota šī punkta apzīmēšanai. 1. attēlā sniegtajā piemērā punkti tiek izmantoti, lai aprakstītu līnijas diagrammu un apakšējās ass etiķetes, parādot viena burta saīsinājumus mēnešiem. Es sniegšu vairāk piemēru, kas ilustrē šo nodarbību izmantošanu vēlāk rakstā.

Klases GraphFunction, GraphPoints, un Ekrāna punkts ir ne tikai ļoti vienkārši, tie ir arī bibliotēkas iekšējie un tiem ir tikai piekļuve pakotnēm. Lai izmantotu bibliotēku, jums patiesībā nav jāsaprot šīs klases, tāpēc šeit tās īsi aprakstīšu:

  • GraphFunction iekapsulē funkciju (t.i., klasi, kas ievieš saskarni Funkcija) un krāsu, ko izmanto šīs funkcijas zīmēšanai.
  • GraphPoints iekapsulē punktu sarakstu kopā ar krāsu, ko izmanto to uzzīmēšanai. Šo klasi iekšēji izmanto gan punktu zīmēšanai, gan līniju diagrammu zīmēšanai.
  • Ekrāna punkts iekapsulē veselu skaitļu vērtību pāri, kas attēlo pikseļu koordinātas Android ierīces ekrānā. Šī klase ir līdzīga, bet vienkāršāka nekā Android klase Punkts iepakojumā android.graphics.

Es norādīju šo klašu pirmkodu, ja jūs interesē sīkāka informācija.

Trīs atlikušās klases GraphLib bibliotēkā ir Grafiks, Grafiks. Celtnieks, un GraphView. Ir svarīgi saprast lomu, ko katrs no viņiem spēlē Android lietojumprogrammā.

Klase Grafiks satur informāciju par zīmējamām krāsām, punktiem, etiķetēm, grafikiem utt., bet būtībā nav atkarīga no Android grafikas detaļām. Kamēr Grafiks ir daudz lauku, tiem visiem ir noklusējuma vērtības, un tāpēc ir lietderīgi izmantot Builder modeli, lai izveidotu šīs klases eksemplārus. Klase Grafiks satur ligzdotu statisko apakšklasi ar nosaukumu Celtnieks, ko izmanto, lai izveidotu Grafiks objektiem.

Abas klases Grafiks un Grafiks. Celtnieks no izstrādātāja viedokļa iet kopā, un tas būtībā jāsaprot kā viens. Patiesībā jums ir jāsaprot tikai tas, kā izmantot ligzdoto klasi Celtnieks izveidot Grafiks objekts. Izstrādātāji patiesībā neko nedara tieši ar Grafiks objekts pēc tam, kad tas ir izveidots, nevis nodot to a GraphView objekts, kas visu attēlo Android ierīcē.

2. saraksts apkopo klasē pieejamās metodes Grafiks. Celtnieks. Vēlākos piemēros būs parādīts, kā veidotāju izmantot, lai izveidotu Grafiks objektiem. Pagaidām ir pietiekami atzīmēt, ka, izņemot noklusējuma konstruktoru (2. saraksta pirmā rinda) un būvēt() metodi (2. saraksta pēdējā rinda), visas pārējās metodes atgriež Celtnieks objekts. Tas ļauj izveidot ķēdes ar celtnieku metodēm.

Saraksts 2. Metožu kopsavilkums klasē Grafiks. Celtnieks

 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 [] punkti) public Builder addPoints (punktu saraksti) public Builder addLineGraph (Point [] punkti, int lineGraphColor) public Builder addLineGraph (List points, int lineGraphColor) public Builder addLineGraph (Point [] punkti) public Builder addLineGraph (saraksts punkti) 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 (saraksts 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. sarakstā atzīmēsiet, ka daudzas no metodēm ir pārslogotas, lai pieņemtu objektu masīvus vai objektu sarakstus. Šajā rakstā es priekšroku dodu masīviem, nevis sarakstiem, tikai tāpēc, ka masīvus ir daudz vieglāk inicializēt, bet GraphLib atbalsta abus. Tomēr Java 9 būs ērtas rūpnīcas metodes kolekcijām, tādējādi novēršot šo nelielo masīvu priekšrocību. Ja šī raksta laikā Java 9 būtu plaši izmantota, es labprātāk būtu izvēlējies sarakstus, nevis abos masīvus GraphLib un turpmākie piemēri.

Builder modelis

Lai uzzinātu vairāk par Builder modeli, skatiet Joshua Bloch efektīvā Java otro izdevumu vai Dustin Marx JavaWorld rakstu "Pārāk daudz parametru Java metodēs, 3. daļa: Builder modelis".

Tiek sauktas lietotāja saskarnes klases Android ierīcēs skati, un klase Skats iepakojumā android.view ir lietotāja interfeisa komponentu pamatelements. Skats aizņem taisnstūra laukumu ekrānā un ir atbildīgs par zīmēšanu un notikumu apstrādi. No mantojuma viedokļa klase Skats ir senču klase ne tikai lietotāja saskarnes vadīklas (pogas, teksta lauki utt.), bet arī izkārtojumi, kas ir neredzamas skatu grupas, kas galvenokārt ir atbildīgas par savu bērnu sastāvdaļu sakārtošanu.

Klase GraphView pagarina klasi Skats un ir atbildīgs par a Grafiks Android ierīces ekrānā. Tādējādi klase GraphView ir vieta, kur notiek visa zīmēšana.

Izmantojot GraphLib

Lietotāju saskarņu izveidei Android ir divas pieejas: procesuāla pieeja (Java avota kodā) vai deklaratīvā pieeja (XML failā). Jebkurš no tiem ir derīgs, taču vienprātība ir pēc iespējas vairāk izmantot deklaratīvo pieeju. Saviem piemēriem esmu izmantojis deklaratīvu pieeju.

Programmas izmantošanai ir pieci galvenie soļi GraphLib bibliotēka. Pirms sākat, lejupielādējiet apkopoto Java avota kodu GraphLib bibliotēkai.

lejupielādēt Lejupielādēt GraphLib.jar Iegūstiet apkopoto Java avota kodu GraphLib. Izveidoja Džons I. Mūrs.

1. solis: padariet graphlib.jar pieejamu savam Android projektam

Izmantojot Android Studio, izveidojiet jaunu projektu un nokopējiet JAR failu graphlib.jar uz libs jūsu projekta apakšdirektorijs lietotne direktorijā. Android studijā pārslēdziet mapes struktūru no Android uz Projekts. Tālāk libs mape (ligzdota lietotne mapi), ar peles labo pogu noklikšķiniet uz JAR faila un noklikšķiniet uz Pievienot kā bibliotēku. Ar šo pēdējo darbību JAR fails tiks pievienots jūsu lietotnes sadaļā Atkarības build.gradle failu. Ja jums nepieciešama palīdzība šajā darbībā, skatiet sadaļu "Kā pievienot burku ārējās bibliotēkās Android Studio".

2. solis. Izveidojiet Android darbību, kas izmantos GraphLib

Android lietojumprogrammās aktivitāte apzīmē vienu ekrānu ar lietotāja saskarni. Darbības galvenokārt tiek definētas divos failos: XML failā, kas deklarē lietotāja saskarnes izkārtojumu un komponentus, un Java failā, kas nosaka izpildlaika funkcionalitāti, piemēram, notikumu apstrādi. Kad tiek izveidots jauns projekts, Android Studio parasti izveido noklusējuma darbību ar nosaukumu MainActivity. Izmantojiet šo darbību vai izveidojiet jaunu savai lietojumprogrammai.

3. darbība. Darbības izkārtojumam pievienojiet GraphView

Darbības izkārtojuma XML failā jūs paziņosiet a GraphView objektu tādā pašā veidā, kā jūs deklarējat pogu vai teksta skatu, izņemot to, ka jums ir jānorāda pilns paketes nosaukums GraphView. 3. sarakstā ir redzams izkārtojuma faila fragments, kas deklarē a GraphView kam seko a Teksta skats kā daļa no vertikālā lineārā izkārtojuma. Ievērojot ieteicamo praksi, faktiskās platuma un augstuma vērtības GraphView ir definēti atsevišķi izmērs resursu faili, kur dažādi resursu faili sniedz vērtības dažādiem ekrāna izmēriem / blīvumiem. (Piezīme. Tālāk sniegtajos piemēros abām vērtībām izmantoju 325.)

Saraksts 3. GraphView un TextView deklarēšana izkārtojuma XML failā

4. solis. Importējiet bibliotēkas nodarbības aktivitātē

4. sarakstā tiek parādīts lietojumprogrammas importēšanas priekšrakstu saraksts, ja bibliotēkas klases tiek importētas atsevišķi. Importa sarakstu var saīsināt vienā rindā kā importēt com.softmoore.android.graphlib. * ja vēlaties. Personīgi es gribētu redzēt izvērsto sarakstu, kā parādīts 4. sarakstā.

Saraksts 4. Importējiet bibliotēkas klases

 importēt com.softmoore.android.graphlib.Function; importēt com.softmoore.android.graphlib.Graph; importēt com.softmoore.android.graphlib.GraphView; importēt com.softmoore.android.graphlib.Label; importēt com.softmoore.android.graphlib.Point; 

5. solis. Izveidojiet Graph objektu un pievienojiet to GraphView

5. saraksts parāda vienkārša grafa objekta izveidošanu - šajā gadījumā diagrammas objektu, kas izmanto visas noklusējuma vērtības. Būtībā tas satur tikai x- un y-axes, kur abu asu vērtības svārstās no 0 līdz 10. Sarakstā ir iestatīts arī ekrāna nosaukums un teksta skata teksts zem diagrammas.

Saraksts 5. Izveidojiet objektu Graph un pievienojiet to GraphView

 Grafika diagramma = new Graph.Builder () .build (); GraphView graphView = findViewById (R.id.graph_view); graphView.setGraph (grafiks); setTitle ("Empty Graph"); TextView textView = findViewById (R.id.graph_view_label); textView.setText ("Asu grafiks"); 

2. attēlā parādīts šīs lietojumprogrammas palaišanas rezultāts Android ierīcē.

Džons I. Mūrs

GraphLib izmantošana Android lietojumprogrammās

Raksta atlikušajā daļā es pievērsīšos GraphLib bibliotēkas reālai izmantošanai Android lietojumprogrammu izstrādē. Es sniegšu septiņus piemērus ar īsiem aprakstiem un pirmkodu fragmentiem. Ņemiet vērā, ka šo piemēru Java kodu saraksts ir vērsts uz to izmantošanu Grafiks. Celtnieks lai izveidotu atbilstošu Grafiks objekts. Zvani uz findViewById (), setGraph (), setTitle ()utt., būtu līdzīgi tiem, kas parādīti 5. sarakstā, un nav iekļauti kodu sarakstos.

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