Vytváření Známky Aplikace # # NCLua na DTV
V sekci Tipy NCL / Měsíc dnes, ukážu vám, jak vytvořit příznaky, jako jsou vytvořeny pomocí stan značky v HTML.
Předpoklady
Pro připojení k tomuto článku, budete potřebovat základní znalost NCL, Moon a NCLua (jako událost moduly a plátno). Můžete použít Eclipse se plugin NCLEclipse . Doporučujeme použít nejnovější verzi Ginga Virtuální Set Top Box .
Tutoriál o tom, jak struktuře vývojové prostředí je k dispozici zde .
Spuštění
Nejprve vytvořte adresář pro aplikaci. Pak vytvořte soubory main.ncl, main.lua a marquee.lua rotinas.lua. Nebudu vysvětlovat kód NCL, protože to přináší nic mimo základy. Takže můžete vidět všechny níže uvedený kód. Kód je komentoval pro lepší pochopení. Je pouze nutné změnit src médií video1 pro jméno video soubor, který bude umístěn v adresáři aplikace.
<? Xml version = "1.0" encoding = "iso-8859-1"?> <ncl id="main" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head> <regionBase> <region id="rgLua" width="100%" height="24%" left="0" top="76%" zIndex="1" /> <region id="rgVideo" width="100%" height="100%" zIndex="0" /> </ RegionBase> <descriptorBase> <descriptor id="dLua" region="rgLua" focusIndex="luaIdx" /> <descriptor id="dVideo" region="rgVideo" /> </ DescriptorBase> <! - Když media končí, další začíná -> <connectorBase> <causalConnector id="onEndStart"> <simpleCondition role="onEnd" /> <simpleAction role="start" /> </ CausalConnector> </ ConnectorBase> </ Head> <body> <port id="pVideo" component="video1"/> <port id="pLua" component="lua"/> <! - Nastaví ovládání zaostření na uzel Moon -> <media id="settings" type="application/x-ginga-settings"> <property name="service.currentKeyMaster" value="luaIdx"/> </ Media> <! - Video pod Creative Commons licencí získaných v http://creativecommons.org/video -> <media id="video1" src="media/video.avi" descriptor="dVideo" /> <media id="lua" src="main.lua" descriptor="dLua" /> <! - Video1 Po dokončení restartování stejný -> <link XConnector = "onEndStart"> <bind component="video1" role="onEnd" /> <bind component="video1" role="start" /> </ Link> </ Body> </ NCL>
Vytvoření třídy Marquee
Pojďme provádění kodexu následující Lua objektově-orientovaný přístup. Existují různé způsoby práce s OO způsobem, který bude používat Měsíc je mezi nejjednodušší a nejsnadnější k pochopení, a nedovolit dědictví nebo další pokročilejší funkce. Pouze zdroj se používá pro atributy, metody a konstruktory.
Pak otevřete soubor marquee.lua. Začněme tím, že přidá modul rutin (jejichž soubor je stále prázdná) se níže uvedený kód:
vyžadují, "rutinní"
Třídy v Lua nejsou nic víc než tabulek. Takže musíme definovat tabulku pro kontrolu naší třídy, které obsahují atributy stejného, jako je vidět níže. Všechny atributy jsou diskutovány.
--- Třídy vykazují příznaky v aplikacích, DTV - jako stan HTML - @ author Manuel Campos da Silva Filho - http://manoelcampos.com - @ licence http://creativecommons.org/licenses / by-nc-sa/2.5/br / Marquee = (- Text na displeji text = "", - Vertikální poloha stan top = 0, - Horizontální Marquee left = 0, - šířka označení V mnoha znaků charWidth = 50, - Typ písma mají být použity fontface = 'Věra' - Velikost písma = 36 písmo - Barva písma FontColor = "blue" - je-li pravda, naznačuje, že Přihlaste se budou přesunuty - zprava doleva. - Pokud se rovná false, bude se pohyboval. moveToLeft = true, - Nastaví rychlost animace sign. - Ty by měly informovat interval - v milisekund, se kterým podepsal, musí být aktualizovány. interval = 200 - Čas v sekundách, že stan bude na displeji. - Je-li jim přiděleno číslo, menší nebo roven nule - znak je viditelný po celou dobu. sekund = -1, - Pokud je nastaveno na true, automaticky překreslí obrazovka - zobrazení znamení, - drawText při volání metody. - s falešnými, metoda plátno: flush () by měla být - jen když developer chce obrazovka překreslí, - zobrazení podepsat. autoFlush = true - Ukazuje, zda animace označení je aktivní. @ Viz zrušit aktivní = true, - hromadí uplynulý čas (v milisekundách) - mezi každém hovoru animovat metody. TimeElapsed = 0)
Pojďme si definovat funkce pro vymazání plochy obsazené znamení, pomocí níže uvedený kód. Funkce je poměrně jednoduché, kreslení obdélníku na pokrytí plochy značky.
--- Vymazání plochy značky Marquee funkce: jasné () - Nastaví písmo z plátna. Ačkoli ne byly získány žádné text na obrazovce, - Jak používat funkci plátno: measureText objevovat oblasti označení, - Pokud se žádný zdroj byl definován dříve, - Chyba se generuje volání funkce uvedené. plátno: attrFont (self.fontFace, self.fontSize) - Vytvořit transparentní pozadí plátno: attrColor (255, 255, 255, 0) - Získat šířku a výšku textu předána jako parametr. místní TW, th = plátno: measureText ("A"), - Nakreslete obdélník pokrýt oblasti označení, - Zúčtování obsah plátno: drawRect ("zaplnit", self.left, self.top, self.charWidth * TW, th) konec
Podívejme se nyní definovat funkci pro zastavení animace označení, pomocí níže uvedený kód. Fungovat pouze změny umožňují atribut na hodnotu false (pro indikaci, že budeme vytvářet pro animovat metody by mělo být označení nesmí být větší radost) a čisté plochy značky, volat jasné metody.
--- Stop animace označení Marquee funkce: zrušit () self.active = false self: jasné () konec
Nyní definovat metodu drawText, který bude čerpat text na obrazovce. Tato metoda je jednoduchá, stačí pomocí plátno třídy. Text se zobrazí automaticky v případě, že autoFlush atribut roven true (toto je implicitní hodnota). Viz drawText metoda kód:
--- Display text na obrazovce. To samé je pouze vyvozeny, - Pokud je atribut je pravda autoFlush - @ Param txt řetězec, který bude zobrazen Marquee funkce: drawText (txt) self: jasné () plátno: attrFont (self.fontFace, self.fontSize) Plátno: attrColor (self.fontColor) plátno: drawText (self.left, self.top, txt) pak-li self.autoFlush Plátno: flush () konec konec
Pojďme definovat třídy konstruktor. Ale dříve, než to, že potřebujeme vytvořit funkci v rámci modulu rotinas.lua, který bude odpovědný za vytvoření kopie tabulky Marquee, které představují instance třídy. To znamená, že instance není nic víc než jiné tabulky, která obsahuje vše, co tabulka Marquee. Next, Otevřít soubor rotinas.lua a vložte následující řádky:
místní tisk, tisk = párů, páry Modul "rutiny"
V prvním řádku obchody globální funkce, které budou použity v rámci modulu, jako místní funkce. To je nutné proto definovat soubor Lua jako modul, to už nemá přístup ke globální proměnné a funkce. Druhý řádek obsahuje soubor rotinas.lua jako modul jméno vzory.
Nyní přidat funkci kód klonovat tabulky:
--- Clone tabulky - @ Param Tabulka tb být klonován - @ Return Vrátí nové tabulce cloneTable funkce (tb) místní klon = () - Vytvoří prázdný stůl - Cycles přes prvky v tabulce TB, znovuvytvoření stejný klon v tabulce, - To je vrácena funkcí pro k, v ve dvojicích (TB) klon [k] = v konec návrat klon konec
Návrat nyní do souboru marquee.lua a definujeme třídu konstruktoru Marquee, pomocí níže uvedený kód.
--- Konstruktor třídy - @ Param text Text, který bude zobrazen - @ Param top svislé poloze označení - @ Param vlevo Horizontální Marquee - @ Param charWidth šířka znamení množství znaků - @ Return Vrací instanci Marquee Marquee funkce: nový (text, nahoře, vlevo, charWidth) - Vytvoří instance (kopie) ze třídy (tabulka) Marquee místní obj = util.cloneTable (self) obj.text = text nebo Marquee.text obj.top = top nebo Marque.top obj.left = doleva nebo Marque.left obj.charWidth = charWidth nebo Marque.charWidth - Vrátí panel nastavit návrat obj konec
Jak bylo vidět, kód je poměrně jednoduchý. Parametry text, nahoře, vlevo, charWidth jsou zařazeny do příslušné oblasti instance. Pokud žádný z těchto atributů je vynecháno, používá výchozí hodnota definovaná ve třídě Marquee.
Nyní nám definovat hlavní funkci, kterou plnil všechny "kouzlo", aby text být přesunuta. Viz níže uvedený kód:
--- Provede animace označení Marquee funkce: animovat () - Místní funkce animovat text. Všechny kód je v tomto - Funkce, která se provádí opakovaně, podle Intervalores - Určitý časový interval atributu. - Pro takový harmonogram realizace je funkce časovače modul - Akce, které by měl dostat funkci bez parametrů pro spuštění - Po dobu stanovenou v prvním parametru. - Jak oživit funkce je ve třídě Marquee - A operátor se používá:, - Tam je implicitní parametr self, který představuje - Object (tabulka), které nazývá metoda animovat. - Takže, není možné předat funkci animovat třída Marquee - Pro event.timer, protože to vyžaduje funkce, která nemá parametry. animateLocal místní function () pak-li self.active Místní parcialText = "" - Jen přesunout text, pokud má více než 3 znaky if (# self.text> 3) pak - Zobrazí se pouze celkový charakter odkazy - Šířka (ve znacích), označení parcialText string.sub = (self.text, 1, self.charWidth) pak-li self.moveToLeft - Změny text simulovat účinek pohybu, - Řezání první znak - Přidáním na konec, takže text pohyb doleva. self.text = string.sub (self.text, 2) .. string.sub (self.text, 1, 1) jiný - Změny text simulovat účinek pohybu, - Řezání poslední znak - A přidání na začátku, takže text pohybovat vpravo. self.text = string.sub (self.text, # self.text) .. string.sub (self.text, 1, # self.text-1) konec jiný parcialText = self.text konec self: drawText (parcialText) - Rozvrh pro výkon funkce animateLocal po - Interval (v milisekundách), jsou definovány v self.interval event.timer (self.interval, animateLocal) konec - Pokud sekund je větší než nula, označení má - Nastavení času, aby zůstali na displeji if (self.seconds> 0) Then - Hrabat uplynulý čas. Pokud je větší, než čas - Display, zastaví stan. self.timeElapsed = self.timeElapsed + self.interval if (self.timeElapsed/1000> = self.seconds), pak self: zrušit () konec konec konec animateLocal () konec
Tato funkce je složitější, právě pomocí funkce event.timer. Vzhledem k tomu, text může být přesunut zprava doleva (je-li atribut moveToLeft je pravda, implicitní hodnota), nebo naopak, potřebujeme, aby se metoda animovat třídy Marquee běží na časový interval. To je důvod, proč bychom použít funkci event.timer, jejíž první parametr nastavuje časový interval, který se očekává spuštění funkce hlášených v druhém parametru.
Vzhledem k tomu, funkce přešel na event.timer nemůže mít žádné parametry, můžeme to udělat metodu Marquee animovat třídy, protože to, jak byla definována pomocí dvojtečky (Marquee funkce: animovat ()), má implicitní parametr nazvaný self, který představuje instance (tabulka), který volal metodu, která umožňuje přístup k jeho atributy a metody.
Takže obejít tento "problém" vytvořil místní názvem funkce animateLocal, která obsahuje všechny kód je odpovědný za zpracování textu. Vzhledem k tomu, funkce je funkce animateLocal vnitřní stan: animovat, ona má přístup ke všem parametrům přešel na metodu třídy animovat Marquee. Tento koncept je známý jako Měsíc clousure . Tak, v animovat metodu, tzv. místní funkce animateLocal (která nemá žádné parametry) a tento je předán metodě události časovače třídy.
Jak je vidět v posledním řádku funkce animateLocal, musí jí být volán rekurzivně, po uplynutí doby nastavené v atributu intervalu, a to prostřednictvím výzvy event.timer.
Trik k tomu, že označení být přesunuta je jen manipulace s řetězci. Chcete-li text doleva, řezané na hlavní postavu a přidá na konec řetězce. Chcete-li přesunout doprava, jen snížit poslední znak a přidat na začátek řetězce.
Marquee Naše třída je připravena. Teď už jen stačí vytvořit kód souboru main.lua.
Vytvoření Lua soubor aplikace
Nyní potřebujeme obsahovat pouze kód souboru main.lua. Takže tento soubor otevřít. Začněme marquee.lua včetně souboru, pomocí níže uvedený kód:
dofile (marquee.lua)
Jelikož tento soubor není modul (to je společný soubor, který obsahuje pouze měsíc v definici třídy Marquee), musíme použít místo dofile vyžadují.
Pojďme si přidat dvě označení v žalobě, pak jít do první. Uvidíte níže uvedený kód, který je velmi jednoduchý.
místní text = "Marquee Digitální Žádosti o NCLua SBTVD." - Vytvoří stan (text, nahoře, vlevo, charWidth) = místní let1 Marquee: nový (text, 0, 10, 50) let1: animovat () Všimněte si, že proměnná byla definována s textem k zobrazení, a volání konstruktoru třídy (Marquee: nový) k vytvoření instance let1. Poté, metoda se nazývá animovat a připraven. Přihlaste se bude pohybovat na dobu neurčitou, pravý-k-vlevo (výchozí chování).
Použití mezery před a za text byl úmyslný. Spustit aplikaci, pak odstraňte tyto mezery, aby oznámení rozdíl. Bez mezer, kdo čtení přesně neví, kdy se text končí, protože když jeden okraj zmizí, jiné se objevuje již na druhé straně. S prostorem, text na druhé straně trvá déle, než se objeví.
Nyní na druhou výzvu, pomocí níže uvedený kód:
text = "Manuel Campos - http://manoelcampos.com" Místní let2 = Marquee: nový (text, 50, 10, 50) let2.moveToLeft = false - Po 20 sekundách se znamením pro let2.seconds = 20 let2: animovat ()
Všimněte si, že teď, po tom, co nazýváme konstruktor, změnil některé vlastnosti latreiro. S moveToLeft rovná false, znamení se přestěhoval zleva doprava. S více než 20 sekund, označení zmizí po 20 sekundách.
Závěr
Objektově-orientovaný přístup usnadňuje organizaci a opětovné použití kódu, což umožňuje vytváření více instancí třídy a je kód velmi čitelný. Nakonec, hlavní kód aplikace je poměrně malý.
Líbil článek? Přispět: komentář, hodnotit jej, retweet.
Všechny HTML dokumenty vytvořené s LuaDoc , je k dispozici v adresáři doc.
Licence
based on 3 ratingsSouvisející příspěvky:
- Vytvoření Instalační for Applications. NET Compact Framework bezplatné nástroje
- Pozastavení a sumarizovat video aplikace # # NCL na DTV
- NCLua SOAP: Přístup WebServices aplikací pro digitální TV
- Vydáno NCLuaSOAP # 0.5.6.4: Podpora params Array a struct
- RSS Reader v NCLua digitální TV
Související příspěvky ti přináší ještě další Související změny Plugin .





Ahoj Manuel, snažím se spustit tuto aplikaci z Eclipse s ssh spojení s VM. Video nehraje, a já začínám tuto chybu: Chyba v nechráněné volání Lua API (rotinas.lua: 10: pokus index globální 'Marquee' (nulové hodnoty)). Věděli jste, co může být špatně?
Manuel, Jsem nový NCL a LUA v mém studiu a našel jsem vaše stránky a mám zájem o příspěvky, ale tenhle zejména nalezen pochyb.
Mám krabici Proview dodávány s houpačkami. Když spustím aplikaci v 720x480 rozlišení přijímá parametry velocidadde zatímco já reolução zvýšení rychlosti klesá. V textu 1920X1080 HD jede pomalu tady, bez přijetí jakéhokoli parametru rychlosti. Víš, že mi vysvětlit, proč se to stane a vy budete muset upravit, aby si to rychleji?
Obridago
Bohužel nemůžu říct, co se stane. Pravděpodobně, s rostoucí rozlišení, musí oznámení spotřebují mnohem zpracování v reálném čase. Vzhledem k tomu, STB, má nevelkou, hardware, mělo by to dělat animace je pomalý.
Valmiro řeč. Omlouváme se za zpoždění. Nedávno jsem změnil blogu komentoval systému a nebyl přijímání oznámení o nové komentáře. Ale vy jste převedl všechny soubory na VM? Kontakty v http://manoelcampos.com/contato
Profesor Manuel Campos, blahopřeji mu a staveniště, začínám v této oblasti a
těší spousta obsahu .. Mnoho let života a zdraví. Jsem fanoušek lidí jako jste vy, šíření znalostí!
Ramon Adams
Analýza a vývoj systémů - IFBA