Programování

GraphLib: Open source knihovna Android pro grafy

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é.)

John I. Moore

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 Android Směř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.

stáhnout Stáhnout GraphLib.jar Získejte zkompilovaný zdrojový kód Java pro GraphLib. Vytvořil John I. Moore.

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.

John I. Moore

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ů.

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