graf (pokročilé funkce GRID)
Last updated
Last updated
Založíme si nový projekt a pojmenujeme si LineGraph.
vytvoříme Analogový vstup. Analog je reprezontován (desetiným) číslem. které může jít i do záporných hodnot. (Poslední datový typ messeage, si ukážeme později.)
a přidáme sizeProfile
a nakonec přidáme "generický element", na kterém budeme pracovat.
Tímto jsme si vytvořili bílý obdélník jenž vyplňuje celou plochu widgetu.
Určitě budeme chtít zaznamenat hodnoty, které pak vykreslíme do widgetu jako graf. Proto si vytvoříme pole., do kterého si budeme ukládat hodnoty. (připomínám, že pole v Javascriptu(typescriptu) fungují jinak než v Javě,C(++/#) apod.)
let dataStorage = [];
Nejlepší způsob, jak získat hodnotu z inputu je event listenerem. Proto napíšem
Pozn.: kvůli bugu v GRID se nová hodnota nedá získat z callbacku (e).
tímto při každé změně uložíme novou hodnotu do pole.
Nyní je třeba začít s vykreslováním na element.
Widgety vykreslovány v Canvasu, díky tomu můžeme použít oficiální dokumentaci Canvasu. (LINK).
Veškeré vykreslování se děje v
čímž kreslíme na vrh celé "plochy" widgetu. Protože budeme hodně používat e.context, uložil jsem si ho do promněné pro jednodušší práci.
Ve zkratce nyní shrnu nejduležitější body z dokumentace Canvasu,
Prakticky veškeré úkony s ním začínáme tím, že zavoláme metodu .beginPath();
bod 0,0 se nachází v levém horním rohu
veškeré změny projeví až poté co zavoláme .stroke();
Nakreslíme si základní testovací čáru. pod námi definovaný _draw _napíšeme
a klikneme na test
Čára by vždy měla být z levého horního rohu do dolního pravého.
Pozornější si jistě všimli context.root.invalidate();
Tato metoda se volá kdykoliv se změní widget a je třeba znovu ho celý vykreslit (znova zavolá render).
Např. při změně velikosti widgetu, nebo když ho zavoláme my s tím že chceme vykreslit nově příchozí hodnoty.
když už jsme dali dohromady základy práce s canvasem, jsem si udělat graf z hodnot co ukládáme do pole.
Pro snažší práci si zabarvíme pozadí na bílo a vytvoříme si několik promněných pro snažší práci.
Samozřejmě, přídáme si element, který jsme vytvořili na žačátku do widgetu.
context.root.add(element);
nyní by při kliknuntí na test měla čára být nakreslená na bílém pozadí.
Na začátek renderu si nadefinujeme několik pomocných promněných.
začneme s
chceme nechat nějaký prostor na krajích. poté
jakožto "startovací bod" pro náš graf (vlevo nahoře). Odtud budeme začínat se vším vykreslováním.
nakonec
Ve zkratce jsme si nadefinovali výšku a šířku pro náš widget, složením těchto dvou hodnot máme souřadnice pravého dolního rohu našeho grafu. U _chartWidth _jsme si vzali šířku celého widgetu (která může být různě veliká) a odečetli jsme od ní padding (pro odstup od okraje).
Abychom zhruba věděli, jak je náš Graf ve widgetu velký, změníme několik parametrů v naší předtím vytvořené čáry.
změníme
na
klikneme na test a podíváme se, zda se všechno povedlo dle plánu.
Poté, co jsme si oveřili že vše vypadá OK, mohli bychom získat data z našeho pole, a zakreslit je do widgetu. to uděláme smyčkou(loop).
nejdříve najdeme nejvyšší hodnotu v poli, což uděláme jednoduše:
vytvoříme promněnou, kterou budeme určovat počet prvků jenž zobrazíme v grafu
let chartSize = 50;
poté napíšeme smyčku na vykreslování grafu jako takového:
To nejdůležitější je hotovo. Pokud jste ještě nedopsali to, že při změně hodnoty se má překreslit widget, nyní je správná chvíle
`
a můžeme náš widget otestovat.
widget by měl při každé změně hodnoty nakreslit nový graf, který se postupně posouvá.
Avšak, graf bez hodnot je užitečný jako bezdrátová myš bez baterek. Přidáme text a "vodící čáry'
Zároveň, můžeme přidat i to, že se vykreslí "kolečka" na vrcholech. první část kódu známe
Pokud se zamyslíme tak zjistíme, že se hodnoty do grafu vykreslují ve chvíli, kdy se změní hodnota vstupu, což je poněkud k ničemu.
Vytvoříme si interval, který bude pravidělně číst a zapisovat do grafu:
a listener smažeme, protože nechceme nadále zapisovat hodnoty pouze při změně, ale pravidelně
výsledný graf bude vypadat nějak takto
Pokud jste s grafem spokojeni. Můžete ho vesele používat kde potřebujete.
Samozřejmě je zde hromada místa k zlepšení, jako např. možnost ukazovat více čar, možnost zobrazovat i čísla pod nulu...