Programovanie

GraphLib: Open source knižnica systému Android pre grafy

Grafy a grafy údajov sú vynikajúcim nástrojom na ilustráciu vzťahov, vykreslenie trendov v oblasti údajov a sledovanie cieľov vo vašich aplikáciách pre Android. Presvedčil som sa o tom pred niekoľkými rokmi, keď môj bývalý študent získal prvé miesto v súťaži študentských mobilných aplikácií sponzorovanej združením Charleston Defence Contractors Association. Kľúčovou vlastnosťou víťaznej aplikácie „Diabetes and Me“ bola schopnosť vytvárať grafy denných hladín cukru.

Ako ďalší príklad zvážte aplikáciu na sledovanie hmotnosti, ktorá vykresľuje pokrok proti cieľovej váhe. Obrázok 1 zobrazuje, ako by takáto aplikácia mohla vyzerať na telefóne s Androidom. Na obrázku je použitý červený čiarový graf, ktorý zobrazuje priemerné mesačné hmotnosti za rok 2017. Cieľovú váhu zobrazuje ako zelenú priamku v spodnej časti. (Aj keď hodnoty údajov uvedené v čiarovom grafe sú hypotetické, pre autora tohto článku sú realistické.)

Ján I. Moore

V tomto článku ukážem svoju otvorenú knižnicu zdrojov GraphLib na základy grafických matematických funkcií v Androide. Nie je to tá istá knižnica grafov, ktorú môj študent použil pre svoju aplikáciu. V skutočnosti je to oveľa jednoduchšie a ľahšie použiteľné.

download Stiahnuť GraphLib Získajte zdrojový kód pre open source grafickú knižnicu pre Android uvedenú v tomto článku. Vytvoril John I. Moore.

Prehľad GraphLib

GraphLib pozostáva z jedného rozhrania a ôsmich tried. Tri z týchto tried sú interné v knižnici a majú iba prístup k balíku, takže aby ste mohli používať GraphLib, nebudete im musieť rozumieť. Dve zo zvyšných tried majú veľmi jednoduchú funkčnosť a zvyšok nie je ťažké vyzdvihnúť.

Ďalej popíšem rozhranie GraphLib a každú z jeho ôsmich tried. Upozorňujeme, že na vývoj a testovanie knižnice som použil funkcie Java 8, ako sú funkčné rozhrania a výrazy lambda, ale je relatívne jednoduché tieto funkcie upraviť pre staršie verzie Java.

Funkčné rozhranie GraphLibu

Ako je uvedené v zozname 1, rozhranie Funkcia má iba jednu abstraktnú metódu a je teda funkčným rozhraním. Toto rozhranie je zhruba ekvivalentné Java 8 DoubleUnaryOperator, nájdené v balení java.util.funkcia. Rozdiel je v tom Funkcia nepoužíva okrem anotácie žiadne iné funkcie Java 8 @Funkčné rozhranie. Odstránenie tejto anotácie je jedinou potrebnou zmenou na vykonanie Funkcia rozhranie kompatibilné so staršími verziami Java.

Výpis 1. Funkcia rozhrania

 balíček com.softmoore.android.graphlib; @FunctionalInterface verejné rozhranie Funkcia {public double apply (double x); } 

Poznávanie výrazov lambda

Výrazy lambda, známe tiež ako uzávery, funkčné literály alebo jednoducho lambdy, popisujú množinu funkcií definovaných v JSR (Java Specification Request) 335. Menej formálne úvodné informácie o výrazoch lambda sú uvedené v časti najnovšej verzie Java Tutorial; v článku JavaWorld „Programovanie v jazyku Java s výrazmi lambda“ a v niekoľkých článkoch Briana Goetza „State of the lambda“ a „State of the lambda: Libraries edition“.

Triedy GraphLib

Triedy Bod a Štítok sú pomerne jednoduché: Bod zapuzdruje dvojicu dvojitých hodnôt predstavujúcich bod v x, r- lietadlo a Štítok zapuzdruje dvojitú hodnotu a reťazec, kde dvojitá hodnota predstavuje bod na osi a reťazec sa používa na označenie tohto bodu. Príklad na obrázku 1 pomocou bodov popisuje čiarový graf a štítky pre os v dolnej časti, ktoré zobrazujú jednopísmenové skratky pre mesiace. Ďalej v článku uvediem ďalšie príklady ilustrujúce použitie týchto tried.

Triedy GraphFunction, GraphPointsa ScreenPoint sú nielen veľmi jednoduché, sú tiež interné v knižnici a majú iba prístup k balíkom. Ak chcete používať knižnicu, týmto triedam naozaj nemusíte rozumieť, preto ich tu stručne opíšem:

  • GraphFunction zapuzdruje funkciu (t. j. triedu, ktorá implementuje rozhranie Funkcia) a farba použitá na nakreslenie tejto funkcie.
  • GraphPoints zapuzdruje zoznam bodov spolu s farbou použitou na ich vykreslenie. Táto trieda sa používa interne na vykreslenie bodov aj na kreslenie čiarových grafov.
  • ScreenPoint zapuzdruje dvojicu celočíselných hodnôt predstavujúcich súradnice pixelov na obrazovke zariadenia so systémom Android. Táto trieda je podobná, ale jednoduchšia ako trieda Android Bod v balíku android.grafika.

Pre tieto triedy som uviedol zdrojový kód pre prípad, že by vás zaujímali podrobnosti.

Tri zvyšné triedy v knižnici GraphLib sú Graf, Graph.Buildera GraphView. Je dôležité pochopiť úlohu, ktorú každý z nich hrá v aplikácii pre Android.

Trieda Graf obsahuje informácie o farbách, bodoch, štítkoch, grafoch atď., ktoré sa majú nakresliť, ale je v podstate nezávislá od grafických detailov systému Android. Zatiaľ čo Graf má veľa polí, všetky majú predvolené hodnoty, a preto má zmysel na vytvorenie inštancií tejto triedy použiť vzor Builder. Trieda Graf obsahuje vnorenú statickú podtriedu s názvom Staviteľ, ktorý sa používa na vytvorenie Graf predmety.

Tieto dve triedy Graf a Graph.Builder idú spolu z pohľadu vývojára a mali by sa chápať v podstate ako jeden celok. V skutočnosti musíte pochopiť, ako používať vnorenú triedu Staviteľ vytvoriť Graf objekt. Vývojári v skutočnosti nerobia nič priamo s a Graf objekt po vytvorení inak, ako ho odovzdať a GraphView objekt, ktorý zobrazuje všetko na zariadení Android.

Výpis 2 sumarizuje metódy dostupné v triede Graph.Builder. Neskoršie príklady ilustrujú, ako sa pri vytváraní používa vzor Builder Graf predmety. Nateraz stačí poznamenať, že okrem predvoleného konštruktora (prvý riadok v zozname 2) a znaku build () metóda (posledný riadok v zozname 2), všetky ostatné metódy vrátia Staviteľ objekt. To umožňuje spájať hovory s metódami zostavovateľa.

Zoznam 2. Zhrnutie metód v triede Graph.Builder

 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 [] body) public Builder addPoints (Zoznam bodov) public Builder addLineGraph (Point [] body, int lineGraphColor) public Builder addLineGraph (zoznam bodov, int lineGraphColor) verejné Builder addLineGraph (Point [] body) verejné Builder addLineGraph (zoznam bodov) verejné 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 osi set, osy ) verejná stavebná sada XTicks (dvojitá [] xTicks) verejná stavebná sada XTicks (zoznam xTicks) verejná stavebná sada YTicks (dvojitá [] yTicks) verejná stavebná sada YTicks (zoznam 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 zozname 2 si všimnete, že veľa metód je preťažených, aby akceptovali buď matice objektov, alebo zoznamy objektov. V tomto článku dávam prednosť poliam pred zoznammi, pretože je to oveľa jednoduchšie inicializovať polia, ale GraphLib podporuje obidve. Java 9 však bude obsahovať bežné výrobné metódy pre zbierky, čím sa odstráni táto malá výhoda pre polia. Keby bola v čase tohto článku Java 9 rozšírená, dal by som prednosť zoznamom pred poľami v oboch GraphLib a ďalšie príklady.

Staviteľský vzor

Viac informácií o vzorci Builder nájdete v druhom vydaní knihy Effective Java od Joshua Blocha alebo v článku JavaWorld „Príliš veľa parametrov v metódach Java, časť 3: Vzor Builder“ od Dustina Marxa.

Triedy používateľského rozhrania v systéme Android sa nazývajú názorya trieda vyhliadka v balíku android.view je základným stavebným prvkom komponentov používateľského rozhrania. Pohľad zaberá na obrazovke obdĺžnikovú plochu a je zodpovedný za kreslenie a spracovanie udalostí. Z hľadiska dedičstva trieda vyhliadka je trieda predkov nielen ovládacích prvkov používateľského rozhrania (tlačidlá, textové polia atď.), ale aj rozložení, čo sú neviditeľné skupiny zobrazení, ktoré sú primárne zodpovedné za usporiadanie svojich podradených komponentov.

Trieda GraphView rozširuje triedu vyhliadka a je zodpovedný za zobrazovanie informácií zapuzdrených v a Graf na obrazovke zariadenia s Androidom. Teda triedy GraphView je miesto, kde sa všetko kreslí.

Pomocou GraphLib

Existujú dva prístupy k vytváraniu používateľských rozhraní pre Android: procedurálny prístup (v rámci zdrojového kódu Java) alebo deklaratívny prístup (v súbore XML). Buď je platný, ale existuje konsenzus v maximálnej možnej miere použiť deklaratívny prístup. Pre svoje príklady som použil deklaratívny prístup.

Existuje päť základných krokov pri používaní GraphLib knižnica. Skôr ako začnete, stiahnite si kompilovaný zdrojový kód Java pre knižnicu GraphLib.

download Stiahnuť GraphLib.jar Získajte zostavený zdrojový kód Java pre GraphLib. Vytvoril John I. Moore.

Krok 1. Sprístupnite graphlib.jar pre svoj projekt Android

Vytvorte nový projekt pomocou aplikácie Android Studio a skopírujte súbor JAR graphlib.jar do libs podadresár vášho projektu aplikácia adresár. V aplikácii Android Studio prepnite štruktúru priečinkov z Android do Projekt. Ďalej v libs priečinok (vnorený do priečinka aplikácia priečinok), kliknite pravým tlačidlom myši na súbor JAR a kliknite na ikonu Pridať ako knižnicu. Táto posledná akcia pridá súbor JAR do sekcie závislostí vašej aplikácie build.gradle spis. Ak potrebujete pomoc s týmto krokom, pozrite si časť „Ako pridať nádobu do externých knižníc v aplikácii Android Studio“.

Krok 2. Vytvorte aktivitu v systéme Android, ktorá bude používať GraphLib

V aplikáciách pre Android sa zobrazuje činnosť predstavuje jednu obrazovku s užívateľským rozhraním. Činnosti sú definované predovšetkým v dvoch súboroch: súbor XML, ktorý deklaruje rozloženie používateľského rozhrania a komponenty, a súbor Java, ktorý definuje funkčnosť za behu, ako je napríklad spracovanie udalostí. Pri vytváraní nového projektu Android Studio zvyčajne vytvorí predvolenú aktivitu s názvom Hlavná činnosť. Použite túto aktivitu alebo vytvorte pre svoju aplikáciu novú.

Krok 3. Pridajte GraphView do rozloženia pre aktivitu

V súbore XML pre rozloženie aktivity vyhlásite a GraphView objekt rovnakým spôsobom, akým deklarujete tlačidlo alebo textové zobrazenie, okrem toho, že musíte uviesť celý názov balíka GraphView. Zoznam 3 zobrazuje výňatok zo súboru rozloženia, ktorý deklaruje a GraphView nasledované a TextView ako súčasť vertikálneho lineárneho usporiadania. Podľa odporúčaného postupu budú skutočné hodnoty šírky a výšky GraphView sú definované osobitne dimen zdrojové súbory, kde rôzne zdrojové súbory poskytujú hodnoty pre rôzne veľkosti / hustoty obrazovky. (Poznámka: Pre obidve hodnoty som v príkladoch nižšie použil 325.)

Zoznam 3. Deklarácia GraphView a TextView v rozloženom XML súbore

Krok 4. Importujte triedy knižnice do aktivity

Zoznam 4 zobrazuje zoznam príkazov na import pre aplikáciu, ak sa triedy knižnice importujú jednotlivo. Zoznam importov je možné skrátiť do jedného riadku ako import com.softmoore.android.graphlib. * ak je to žiaduce. Osobne radšej vidím rozšírený zoznam, ako je uvedený v zozname 4.

Výpis 4. Importujte triedy knižnice

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

Krok 5. Vytvorte objekt Graph a pridajte ho do GraphView

Výpis 5 zobrazuje vytvorenie jednoduchého grafického objektu - v tomto prípade grafického objektu, ktorý používa všetky predvolené hodnoty. V zásade obsahuje iba súbor X- a r-axes, kde hodnoty na oboch osiach sú v rozmedzí od 0 do 10. Výpis tiež nastaví nadpis pre obrazovku a text pre textové zobrazenie pod grafom.

Výpis 5. Vytvorte objekt Graph a pridajte ho do GraphView

 Graf graf = nový Graph.Builder () .build (); GraphView graphView = findViewById (R.id.graph_view); graphView.setGraph (graf); setTitle ("Prázdny graf"); TextView textView = findViewById (R.id.graph_view_label); textView.setText ("Graf osí"); 

Obrázok 2 zobrazuje výsledok spustenia tejto aplikácie na zariadení Android.

Ján I. Moore

Používanie GraphLib v aplikáciách pre Android

V zostávajúcej časti sa budem venovať reálnemu použitiu knižnice GraphLib pri vývoji aplikácií pre Android. Uvediem sedem príkladov so stručnými popismi a výňatkami zo zdrojových kódov. Upozorňujeme, že výpisy kódov Java pre tieto príklady sú zamerané na použitie Graph.Builder vytvoriť príslušné Graf objekt. Vyzýva na findViewById (), setGraph (), setTitle ()atď., budú podobné tým, ktoré sú uvedené v zozname 5, a nie sú zahrnuté v zoznamoch kódov.

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