Grafy a datové grafy jsou skvělé nástroje pro ilustraci vztahů, zobrazení trendů dat a sledování cílů ve vašich aplikacích pro Android. Přesvědčil jsem se o tom před několika lety, když můj bývalý student získal první místo v soutěži studentských mobilních aplikací sponzorované asociací Charleston Defence Contractors Association. Klíčovým rysem vítězné aplikace „Diabetes and Me“ byla schopnost zaznamenávat denní hladinu cukru.
Jako další příklad zvažte aplikaci pro sledování hmotnosti, která vykresluje postup proti hmotnosti cíle. Obrázek 1 ukazuje, jak může taková aplikace vypadat na telefonu Android. Obrázek používá červený spojnicový graf k zobrazení průměrných měsíčních vah pro rok 2017. Ukazuje váhu cíle jako zelenou přímku blízko dna. (Přestože hodnoty dat zobrazené v spojnicovém grafu jsou hypotetické, pro autora tohoto článku jsou realistické.)

V tomto článku použiji svoji knihovnu open source GraphLib k předvedení základů grafických matematických funkcí v systému Android. Není to stejná knihovna grafů, kterou můj student použil pro svou aplikaci. Ve skutečnosti je to mnohem jednodušší a jednodušší na používání.
stáhnout Stáhnout GraphLib Získejte zdrojový kód pro open source grafickou knihovnu Android uvedenou v tomto článku. Vytvořil John I. Moore.Přehled GraphLib
GraphLib
skládá se z jednoho rozhraní a osmi tříd. Tři z těchto tříd jsou interní v knihovně a mají pouze přístup k balíčku, takže jim nebudete muset rozumět, abyste mohli GraphLib používat. Dvě ze zbývajících tříd mají velmi jednoduchou funkčnost a zbytek není těžké vyzvednout.
Níže popíšu rozhraní GraphLib a každou z jeho osmi tříd. Všimněte si, že k vývoji a testování knihovny jsem použil funkce Java 8, jako jsou funkční rozhraní a výrazy lambda, ale je relativně jednoduché tyto funkce upravit pro dřívější verze Java.
Funkční rozhraní GraphLib
Jak je uvedeno v seznamu 1, rozhraní Funkce
má pouze jednu abstraktní metodu a je tedy funkčním rozhraním. Toto rozhraní je zhruba ekvivalentní prostředí Java 8 DoubleUnaryOperator
, nalezeno v balíčku java.util.funkce
. Rozdíl je v tom Funkce
nepoužívá kromě anotace žádné jiné funkce Java 8 @Funkčnírozhraní
. Odstranění této anotace je jedinou změnou nutnou k provedení Funkce
rozhraní kompatibilní se staršími verzemi Javy.
Výpis 1. Funkce rozhraní
balíček com.softmoore.android.graphlib; @FunctionalInterface veřejné rozhraní Funkce {public double apply (double x); }
Učení o výrazech lambda
Výrazy lambda, známé také jako uzávěry, funkční literály nebo jednoduše lambdas, popisují sadu funkcí definovaných v JSR (Java Specification Request) 335. Méně formální úvod do výrazů lambda je uveden v části nejnovější verze Java Tutorial; v článku JavaWorld „Programování v jazyce Java s výrazy lambda“ a v několika článcích Briana Goetze „State of the lambda“ a „State of the lambda: Libraries edition“.
Třídy GraphLib
Třídy Směřovat
a Označení
jsou relativně jednoduché: Směřovat
zapouzdřuje dvojici dvojitých hodnot představujících bod v x, y- letadlo a Označení
zapouzdřuje dvojitou hodnotu a řetězec, kde dvojitá hodnota představuje bod na ose a řetězec se používá k označení tohoto bodu. Příklad na obrázku 1 používá body k popisu spojnicového grafu a popisků pro osu dole, zobrazujících jednopísmenné zkratky pro měsíce. Dále v článku uvedu další příklady ilustrující použití těchto tříd.
Třídy GraphFunction
, GraphPoints
, a ScreenPoint
jsou nejen velmi jednoduché, jsou také interní v knihovně a mají pouze přístup k balíčku. Abyste mohli knihovnu používat, těmto třídám opravdu nerozumíte, proto je zde krátce popíšu:
GraphFunction
zapouzdřuje funkci (tj. třídu, která implementuje rozhraníFunkce
) a barva použitá k nakreslení této funkce.GraphPoints
zapouzdřuje seznam bodů spolu s barvou použitou k jejich vykreslení. Tato třída se používá interně pro vykreslování bodů a kreslení čarových grafů.ScreenPoint
zapouzdřuje dvojici celočíselných hodnot představujících souřadnice pixelů na obrazovce zařízení Android. Tato třída je podobná, ale jednodušší než třída AndroidSměřovat
v baleníandroid.graphics
.
Poskytl jsem zdrojový kód pro tyto třídy, pokud vás zajímají podrobnosti.
Tři zbývající třídy v knihovně GraphLib jsou Graf
, Graph.Builder
, a GraphView
. Je důležité pochopit roli, kterou každý z nich hraje v aplikaci pro Android.
Třída Graf
obsahuje informace o barvách, bodech, štítcích, grafech atd., které mají být nakresleny, ale je v zásadě nezávislý na grafických detailech systému Android. Zatímco Graf
má mnoho polí, všechna mají výchozí hodnoty, a proto má smysl použít k vytvoření instancí této třídy vzor Builder. Třída Graf
obsahuje vnořenou statickou podtřídu s názvem Stavitel
, který se používá k vytvoření Graf
předměty.
Tyto dvě třídy Graf
a Graph.Builder
jít společně, z pohledu vývojáře, a měl by být chápán v zásadě jako jeden. Ve skutečnosti musíte pochopit, jak používat vnořenou třídu Stavitel
vytvořit Graf
objekt. Vývojáři ve skutečnosti přímo nedělají nic Graf
objekt poté, co byl vytvořen jinak, než jej předat do GraphView
objekt, který zobrazuje vše na zařízení Android.
Výpis 2 shrnuje metody dostupné ve třídě Graph.Builder
. Pozdější příklady ilustrují, jak použít k vytvoření vzor Builder Graf
předměty. Prozatím stačí poznamenat, že kromě výchozího konstruktoru (první řádek v seznamu 2) a stavět()
metoda (poslední řádek v seznamu 2), všechny ostatní metody vracejí Stavitel
objekt. To umožňuje zřetězit volání metod tvůrce.
Výpis 2. Shrnutí metod ve třídě 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 (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 osa setAxes (double osa ) 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 ()
Ve Výpisu 2 si všimnete, že mnoho metod je přetíženo, aby přijímalo buď pole objektů, nebo seznamy objektů. Dávám přednost polím před seznamy pro příklady v tomto článku, jednoduše proto, že je mnohem snazší inicializovat pole, ale GraphLib
podporuje obojí. Java 9 však bude obsahovat pohodlné tovární metody pro kolekce, čímž odstraní tuto malou výhodu pro pole. Pokud by v době tohoto článku byla Java 9 široce používána, upřednostňoval bych seznamy před poli v obou GraphLib
a pozdější příklady.
Tvůrce vzor
Chcete-li se dozvědět více o vzorci Builder, podívejte se na druhé vydání knihy Effective Java od Joshua Blocha nebo v článku JavaWorld „Příliš mnoho parametrů v metodách Java, část 3: Vzor Builder“ od Dustina Marxe.
Třídy uživatelského rozhraní v systému Android se nazývají pohledya třída Pohled
v balení android.view
je základní stavební kámen pro komponenty uživatelského rozhraní. Pohled zabírá obdélníkovou oblast na obrazovce a je zodpovědný za kreslení a zpracování událostí. Z hlediska dědictví třída Pohled
je třída předků nejen ovládacích prvků uživatelského rozhraní (tlačítka, textová pole atd.), ale také rozložení, což jsou neviditelné skupiny pohledů, které jsou primárně odpovědné za uspořádání svých podřízených komponent.
Třída GraphView
rozšiřuje třídu Pohled
a je odpovědný za zobrazování informací zapouzdřených v a Graf
na obrazovce zařízení Android. Tedy třída GraphView
je místo, kde probíhá veškeré kreslení.
Pomocí GraphLib
Existují dva přístupy k vytváření uživatelských rozhraní pro Android: procedurální přístup (v rámci zdrojového kódu Java) nebo deklarativní přístup (v souboru XML). Buď jeden je platný, ale konsenzem je co nejvíce používat deklarativní přístup. Pro své příklady jsem použil deklarativní přístup.
Existuje pět základních kroků k použití GraphLib
knihovna. Než začnete, stáhněte si kompilovaný zdrojový kód Java pro knihovnu GraphLib.
Krok 1. Zpřístupněte graphlib.jar pro svůj projekt Android
Vytvořte nový projekt pomocí Android Studio a zkopírujte soubor JAR graphlib.jar
do libs
podadresář vašeho projektu aplikace
adresář. V Android Studio přepněte strukturu složek z Android na Projekt. Dále v libs
složka (vnořená do složky aplikace
složku), klepněte pravým tlačítkem myši na soubor JAR a klepněte na Přidat jako knihovnu. Tato poslední akce přidá soubor JAR do sekce závislostí vaší aplikace build.gradle
soubor. Pokud potřebujete s tímto krokem pomoci, přečtěte si část „Jak přidat nádobu do externích knihoven ve službě Android Studio“.
Krok 2. Vytvořte aktivitu pro Android, která bude používat GraphLib
V aplikacích pro Android aktivita představuje jednu obrazovku s uživatelským rozhraním. Aktivity jsou definovány primárně ve dvou souborech: soubor XML, který deklaruje rozložení a komponenty uživatelského rozhraní, a soubor Java, který definuje běhové funkce, jako je zpracování událostí. Když je vytvořen nový projekt, Android Studio obvykle vytvoří výchozí aktivitu s názvem Hlavní aktivita
. Použijte tuto aktivitu nebo vytvořte novou pro svou aplikaci.
Krok 3. Přidejte GraphView do rozložení pro aktivitu
V souboru XML pro rozložení aktivity prohlásíte a GraphView
objekt v podstatě stejným způsobem, jakým deklarujete tlačítko nebo textové zobrazení, kromě toho, že musíte zadat celý název balíčku pro GraphView
. Výpis 3 zobrazuje výňatek ze souboru rozložení, který deklaruje a GraphView
následuje a Textový pohled
jako součást vertikálního lineárního rozvržení. Podle doporučeného postupu budou skutečné hodnoty šířky a výšky GraphView
jsou definovány samostatně dimen
zdrojové soubory, kde různé zdrojové soubory poskytují hodnoty pro různé velikosti / hustoty obrazovky. (Poznámka: V obou příkladech jsem pro obě hodnoty použil 325.)
Výpis 3. Deklarace GraphView a TextView v rozloženém souboru XML
Krok 4. Importujte třídy knihovny do aktivity
Výpis 4 zobrazuje seznam příkazů pro import aplikace, pokud jsou třídy knihovny importovány jednotlivě. Seznam importů lze zkrátit na jeden řádek jako import com.softmoore.android.graphlib. *
pokud je to požadováno. Osobně dávám přednost zobrazení rozšířeného seznamu, jak je uvedeno v seznamu 4.
Výpis 4. Import tříd knihoven
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. Vytvořte objekt Graph a přidejte jej do GraphView
Výpis 5 ukazuje vytvoření jednoduchého objektu grafu - v tomto případě objektu grafu, který používá všechny výchozí hodnoty. V zásadě obsahuje pouze soubor X- a y-axes, kde hodnoty na obou osách se pohybují od 0 do 10. Výpis také nastaví nadpis obrazovky a text pro textové zobrazení pod grafem.
Výpis 5. Vytvořte objekt Graph a přidejte jej do GraphView
Graf graf = nový Graph.Builder () .build (); GraphView graphView = findViewById (R.id.graph_view); graphView.setGraph (graf); setTitle ("Prázdný graf"); TextView textView = findViewById (R.id.graph_view_label); textView.setText ("Graf os");
Obrázek 2 ukazuje výsledek spuštění této aplikace na zařízení Android.

Používání GraphLib v aplikacích pro Android
Ve zbývající části článku se zaměřím na reálné použití knihovny GraphLib ve vývoji aplikací pro Android. Představím sedm příkladů se stručnými popisy a výňatky ze zdrojových kódů. Upozorňujeme, že výpisy kódů Java pro tyto příklady jsou zaměřeny na použití Graph.Builder
vytvořit odpovídající Graf
objekt. Vyzývá uživatele findViewById ()
, setGraph ()
, setTitle ()
atd. by byly podobné těm, které jsou uvedeny v seznamu 5, a nejsou zahrnuty v seznamech kódů.