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. MooreV 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
, GraphPoints
a 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 rozhranieFunkcia
) 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 AndroidBod
v balíkuandroid.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.Builder
a 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.
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. MoorePouží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.