Archive for november, 2013

Ako zobraziť PDF dokument vo Windows 8.1 aplikácii.

27. novembra 2013

Najskôr predstavím výsledok – aplikáciu, ktorá zobrazuje brožúrku o ovládaní Windows 8.1. Aplikáciu Ovládanie Windows 8.1 nájdete vo Windows Obchode http://apps.microsoft.com/windows/app/ovladanie-windows-8-1/9664c57f-bc54-42bf-9647-5a88cc071a52

V aplikácii bola použitá funkcionalita z namespace Windows.Data.Pdf, ktorá umožní rendrovať obrázok z vybranej časti PDF dokumentu. PDF dokument pripojte k aplikácii napríklad do adresára Assets, pričom parameter BuildAction nastavte na Content. Aplikácia bola urobená na báze šablóny Split App.

Do XAML kódu vložte obrázok do prvku ScrollViewer aby bolo možné horizontálne rolovanie ak používateľ zúži aplikáciu napríklad až na na 500 pixelov, prípadne vertikálne rolovanie väčších dokumentov.


<ScrollViewer


x:Name=”itemDetail”


AutomationProperties.AutomationId=”ItemDetailScrollViewer”


DataContext=”{Binding SelectedItem, ElementName=itemListView}”


HorizontalScrollBarVisibility=”Auto” VerticalScrollBarVisibility=”Disabled”


ScrollViewer.HorizontalScrollMode=”Auto” ScrollViewer.VerticalScrollMode=”Disabled”


ScrollViewer.ZoomMode=”Disabled” Loaded=”itemDetail_Loaded”>


<Image
x:Name=”Image1″ AutomationProperties.Name=”A placeholder image” Source=”Assets/MediumGray.png” Stretch=”None” HorizontalAlignment=”Left” VerticalAlignment=”Top” SizeChanged=”Image1_SizeChanged”
/>


</ScrollViewer>

 

Majte na pamäti, že obrázok sa na rôznych displejoch zobrazuje s rôznou mierkou. Preto treba jeho veľkosť aktuálne prepočítať podľa mierky Scale

Rendrovanie dokumetu, v tomto prípade jednej strany zariadi procedúra

private
PdfDocument _pdfDocument;

private
string PDFFILENAME = “Assets\\brozura.pdf”;

private
bool bLoaded = false;

uint nVyskaObrazku=300;

 

private
async
Task RenderPDFPage(string pdfFileName, uint prvaStrana )

{


double dSirkaOkna, dVyskaOkna, dScale, dSirkaPdf, dZoom;


try

{


StorageFile pdfFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(pdfFileName);

_pdfDocument = await
PdfDocument.LoadFromFileAsync(pdfFile); ;

 


if (_pdfDocument != null && _pdfDocument.PageCount > 0)

{


var pdfPage = _pdfDocument.GetPage((uint)prvaStrana);

 


if (pdfPage != null)

{


// generovanie bitmapy strany pdf dokumentu


StorageFolder tempFolder = ApplicationData.Current.TemporaryFolder;


StorageFile jpgFile = await tempFolder.CreateFileAsync(Guid.NewGuid().ToString() + “.png”, CreationCollisionOption.ReplaceExisting);

 


if (jpgFile != null)

{


DisplayInformation displayInformation = DisplayInformation.GetForCurrentView();


ResolutionScale scale = displayInformation.ResolutionScale;


double scaleValue = (int)scale /100.0;

 


IRandomAccessStream randomStream = await jpgFile.OpenAsync(FileAccessMode.ReadWrite);


PdfPageRenderOptions pdfPageRenderOptions = new
PdfPageRenderOptions();

 

dSirkaOkna = Window.Current.Bounds.Width – 350;

dVyskaOkna = (Window.Current.Bounds.Height – 230) / scaleValue;

 

 


//tbOznam.Text = dVyskaOkna.ToString();

 

pdfPageRenderOptions.DestinationHeight = (uint)dVyskaOkna;

 


await pdfPage.RenderToStreamAsync(randomStream, pdfPageRenderOptions);


await randomStream.FlushAsync();

randomStream.Dispose();

pdfPage.Dispose();


await DisplayImageFileAsync(jpgFile);

}

}

}

}


catch (Exception err)

{

tbOznam.Text = “Error: “ + err.Message;

}

}

 

 

 

Reklamy

Ako bola vytvorená aplikácie Vyvojárske blogy

13. novembra 2013

Pre sledovanie príspevkov z tohto blogu môžete používať aj Windows 8.1 aplikáciu Vývojárske blogy. Aplikáciu nájdete vo Windows obchode http://apps.microsoft.com/windows/app/vyvojarske-blogy/eb3864a5-faa3-4fe6-a318-ca91669e6865. Zatiaľ prezentuje údaje z dvoch blogov, tohto a blogu http://blogs.msdn.com/b/vyvojarisk postupne bude rozšírená o ďalšie zdroje.

Fungovanie používateľského rozhrania aplikácie je zrejmé z obrázkov

Vytvorenie projektu

Intuitívne vás asi napadne použiť projekt typu Split App. Na hlavnej stránke ItemsPage budú dlaždice jednotlivých blogov. Na stránke SplitPage budú najnovšie príspevky používateľom vybraného blogu. Takýto typ projektu je vhodný vtedy ak potrebujete koncentrovať údaje z veľa blogov. Ak koncentrujete údaje len z niekoľkých tematických blogov, výhodnejší bude projekt typu Grid App, do ktorého neskôr pridáte aj stránku typu Split Page. Na hlavnej stránke budú nie dlaždice blogov, ale najnovšie príspevky opticky rozdelené podľa blogov. Takýto projekt má oveľa vyššiu informačnú hodnotu. Vytvorte teda projekt typu Grid App.

V prvej fáze budete vytvárať “wireframe” model, teda surové zobrazenie údajov bez obrázkov, formátovania textov a akýchkoľvek dizajnových záležitostí. Tieto doplníte po odskúšaní funkcionality všetkých stránok

Načítanie údajov z blogu

Prvou fázou príkladu, bude získavanie údajov z dátového zdroja, ktorým je v tomto prípade blog. Väčšina blogových portálov umožňuje získavať metadáta a aj úplné znenie príspevkov vo formátoch RSS aj Atom. Budú nás zaujímať atribúty názov, autor, dátum a text blogových príspevkov. WindowsRT API obsahuje sadu tried v Windows.Web.Syndication, ktoré vám získavanie a spracovávanie údajov z RSS zdrojov výrazne zjednodušia.

Budeme upravovať súbor SampleDataSource, ktorý je po vytvorení projektu napojený na statický zdroj údajov v súbore SampleData.json. Najskôr upravte atribúty v triede SampleDataItem. Premenujte ju na BlogClanok. Predmetom záujmu aplikácie budú jednak atribúty týkajúce sa názvu článku, mena autora, dátumu publikovania článku a taktiež aj text článku a URL adresa originálneho článku.

public class BlogClanok

{

public BlogClanok(String title, String autor, String content,

DateTime pubdate)

{

this.Title = title;

this.Author = autor;

this.Content = content;

this.PubDate = pubdate;

}

 

 

public string Title { get; set; }

public string Author { get; set; }

public string Content { get; set; }

public DateTime PubDate { get; set; }

public Uri Link { get; set; }

 

 

public override string ToString()

{

return this.Title;

}

}

 

Teraz môžete vytvoriť atribúty pre triedu SampleDataGroup. V originálnej šablóne je táto trieda použitá na zapuzdrenie objektov do kategórii, v našom príklade bude zapuzdrovať články jednotlivých blogov. Premenujte ju na BlogData.

public class BlogData

{

public BlogData(String title, String description, DateTime pubdate)

{

this.Title = title;

this.Description = description;

this.PubDate = pubdate;

this.Items = new ObservableCollection<BlogClanok>();

}

 

 

 

public string Title { get; set; }

public string Description { get; set; }

public DateTime PubDate { get; set; }

 

public ObservableCollection<BlogClanok> Items { get; private set; }

 

public override string ToString()

{

return this.Title;

}

}

 

Napokon upravte triedu SampleDataSource ktorá bude zapuzdrovať články sústredené z viacerých RSS zdrojov, čiže viacerých blogov. Táto trieda bude plniť úlohu zdroja údajov pre prezentačné rozhranie, ktoré bude články zobrazovať.

Atribút Groups typu ObservableCollection, teda kolekcia objektov bude zapuzdrovať jednotlivé články.

private ObservableCollection<BlogData> _groups = new

ObservableCollection<BlogData>();

 

public ObservableCollection<BlogData> Groups

{

get { return this._groups; }

}

 

Úlohou metódy GetSampleDataAsync () je asynchrónne načítanie údajov z viacerých zdrojov (feed1, feed2…). Pre jednoduchosť zatiaľ budete využívať len jeden RSS zdroj. Pôvodne po vytvorení šablóny táto metóda načítavala statické údaje zo súboru SampleData.json

private async Task GetSampleDataAsync()

{

if (this._groups.Count != 0) return;

Task<SampleDataGroup> feed1 =

GetFeedAsync(“https://novywindows.wordpress.com/feed&#8221;);

this.Feeds.Add(await feed1);

}

 

Metóda GetFeedAsync má ako parameter URL adresu RSS zdroja. Metóda dokáže spracovať údaje podľa špecifikácií RSS aj Atom. Všimnite si dvojnásobnú kontrolu každého atribútu či existuje, teda či jeho hodnota sa nerovná NULL a či text má aspoň jeden znak. Metóda využíva objekt SyndicationClient. Najskôr sa načítajú atribúty týkajúce sa blogu a následne v cykle typu foreach sa načítajú jednotlivé články. Načítané údaje týkajúce sa blogu sa budú ukladať do inštancií triedy BlogData, údaje o článkoch do inštancií triedy BlogClanky.

private async Task<BlogData> GetFeedAsync(string feedUriString)

{

SyndicationClient client

= new SyndicationClient();

Uri feedUri = new Uri(feedUriString);

 

try

{

SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);

 

BlogData blogData = new BlogData(“”, “”, DateTime.Now);

 

if (feed.Title != null && feed.Title.Text != null)

{

blogData.Title = feed.Title.Text;

}

if (feed.Subtitle != null && feed.Subtitle.Text != null)

{

feedData.Description = feed.Subtitle.Text;

}

if (feed.Items != null && feed.Items.Count > 0)

{

blogData.PubDate = feed.Items[0].PublishedDate.DateTime;

 

foreach (SyndicationItem item in feed.Items)

{

BlogClanok blogClanok = new BlogClanok(“”, “”, “”, DateTime.Now);

if (item.Title != null && item.Title.Text != null)

{

blogClanok.Title = item.Title.Text;

}

if (item.PublishedDate != null)

{

blogClanok.PubDate = item.PublishedDate.DateTime;

}

if (item.Authors != null && item.Authors.Count > 0)

{

blogClanok.Author = item.Authors[0].Name.ToString();

}

// Spracovanie rozdielov medzi RSS a Atom.

if (feed.SourceFormat == SyndicationFormat.Atom10)

{

if (item.Content != null && item.Content.Text != null)

{

blogClanok.Content = item.Content.Text;

}

if (item.Id != null)

{

blogClanok.Link = new Uri(item.Id);

}

}

else if (feed.SourceFormat == SyndicationFormat.Rss20)

{

if (item.Summary != null && item.Summary.Text != null)

{

blogClanok.Content = item.Summary.Text;

}

if (item.Links != null && item.Links.Count > 0)

{

blogClanok.Link = item.Links[0].Uri;

}

}

blogData.Items.Add(blogClanok);

}

}

return blogData;

}

catch (Exception)

{

return null;

}

}

 

Metóda GetGroupAsync vráti zdroj, ktorý obsahuje článok s konkrétnym názvom. Vystačíte s originálnou procedúrou, stačí zmeniť len unikátny identifikátor na Title. Metóda GetItemAsync vráti vybraný článok

Zobrazenie článkov viacerých blogov

V tomto štádiu môžete aplikáciu spustiť. Zobrazia sa dlaždice s názvami článkov blogu bez obrázkov, nakoľko ste zatiaľ nemenili šablónu zobrazenia prvku GridView.

Odporúčame vyskúšať prostriedky Visual Studia pre ladenie a nechať si vypísať načítané údaje. V súbore App.xaml.cs v metóde OnLaunched umiestnite zarážku na riadok

await sampleDataSource.GetFeedsAsync();

a spustite aplikáciu. Keď sa vykonávanie kódu na vybranom riadku preruší, klávesou F10 ho nechajte vykonať. Týmto krokom by sa mali načítať údaje. Následne ich môžete nechať vypísať. Ak na vybraný článok aplikujete položku kontextového menu HTML Visualizer, mal by sa vám zobraziť článok aj s prípadnými obrázkami

Ak sa vám zobrazili požadované údaje a správne sformátovaný článok, máte etapu načítania údajov úspešne za sebou a môžete pristúpiť k návrhu používateľského rozhrania pre zobrazenie blogových článkov.

Ak načítavate príspevky z viacerých webových zdrojov pri inicializácii aplikácie, je vysoko pravdepodobné, že vaša aplikácia neprejde schvaľovacím procesom z dôvodu dlhej doby nábehu.

Jedným z riešení môže byť nechať zobraziť stránku GroupedItemsPage prázdnu bez údajov a v metóde Loaded začať načítavať údaje z viacerých zdrojov až keď je stránka zobrazená. Používateľovi sa potom bude javiť nábeh aplikácie tak, že budú na obrazovke pribúdať jednotlivé skupiny príspevkov tak, ako sa budú načítavať.

Zobrazenie článkov vybraného blogu

Články vybraného blogu sa štandardne zobrazujú na stránke GroupedDetailPage.xaml. Pokiaľ nezmeníte šablónu zobrazí sa vľavo prázdne miesto, ktoré je v šablóne vyhradené pre obrázok a popis vybranej kategórie.

V tomto type aplikácie sa to nehodí, stačí názov vybraného blogu v záhlaví aplikácie. Ilustračný obrázok priradený staticky ku každému blogu by len zaberal priestor. Namiesto neho môžete zobraziť viac článkov. Odstráňte preto sekciu <GridView.Header>. Dizajnu zobrazovania názvov článkov sa budete venovať neskôr.

Všimnite si, že až na koncentrovanejšie zobrazenie článkov sme zatiaľ pri tomto zobrazení neposkytli žiadnu pridanú hodnotu. Pre zobrazovanie článkov vybraného blogu bude možno lepšia šablóna SplitView. Klikaním na obdĺžnikové dlaždice s názvami článkov v ľavej časti stránky sa bude meniť článok aktuálne zobrazovaný v pravej časti. Takéto zobrazenie má lepšiu informatívnu hodnotu aj operatívnosť ako klasický zoznam článkov.

Pre tento účel je potrebné pridať do projektu stránku Split Page. Môžete tak urobiť cez kontextové menu Add – New Item – SplitPage.

Poradím vám užitočný trik, ako prácne nevytvárať používateľské rozhranie stránky SplitPage a jej napojenie na zdroj údajov.. Vytvorte novú aplikáciu typu Split App. Z tohto projektu prekopírujte súbory SplitPage.xaml a SplitPage.xaml.cs. V obidvoch súboroch zmeňte namespace podľa názvu vašej aplikácie.

Na stránke GroupedItemsPage.xaml.cs zmeňte navigáciu pri kliknutí na názov blogu aby smerovala nie na GroupDetailPage.xaml, ale na novo pridanú stránku SplitPage.xaml

void Header_Click(object sender, RoutedEventArgs e)

{

var group = (sender as FrameworkElement).DataContext;

this.Frame.Navigate(typeof(SplitPage), ((BlogData)group).Title);

}

 

V úvode state o používateľskom rozhraní sme síce deklarovali, že prvej fáze budeme vytvárať iba “wireframe” model, teda surové zobrazenie údajov bez obrázkov, či formátovania textu, no v žiadnom prípade sa pri zobrazení textu blogového príspevku neuspokojíme s textovým výpisom zdrojového HTML kódu stránky. Namiesto textu zobrazovaného pomocou prvku TextBlock použijeme prvok WebView.

<WebView x:Name=”contentView” Grid.Row=”2″ Grid.ColumnSpan=”2″ Margin=”0,20,0,0″ />

 

V metóde ItemListView_SelectionChanged je potrebné sprostredkovať zmeny výberu článku. Prvku WebView musíte priradiť URI (Uniform Resource Identifier) aktuálne vybraného článku, ktorý sa má zobraziť.

void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (this.UsingLogicalPageNavigation()) this.InvalidateVisualState();

Selector list = sender as Selector;

BlogClanok selectedItem = list.SelectedItem as BlogClanok;

if (selectedItem != null)

{

this.contentView.NavigateToString(selectedItem.Content);

}

else

{

this.contentView.NavigateToString(“”);

}

}

 

Po spustení aplikácie sa budú vybrané články zobrazovať v okne, správne naformátované aj s prípadnými obrázkami.

Zobrazenie článkov vybraného blogu

Články vybraného blogu sa zobrazujú na stránke ItemDetailPage.xaml. Vaša úloha je jednoduchá, zobraziť článok v okne WebView.

Do XAML kódu na stránke ItemDetailPage.xaml pridajte jeden riadok

<WebView x:Name=”webView” Grid.Row=”1″ Margin=”40,0,20,2″/>

 

Na do kódu v súbore ItemDetailPage.xaml.cs je potrebné priradiť prvku WebView URL adresu blogového príspevku

private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)

{

var item = await SampleDataSource.GetItemAsync((String)e.NavigationParameter);

this.DefaultViewModel[“Item”] = item;

 

webView.Navigate((Uri)item.Link);

}

 

Finalizácia dizajnu

V tejto fáze máte odladený “wireframe” plne funkčnej aplikácie a nastáva čas na dotvorenie dizajnu podľa zámeru zadávateľa, prípadne tvorcov aplikácie

Dátový model pre aplikácie Grid App a Split App

9. novembra 2013

Šablóny projektu Grid App a Split App obsahujú zložku DataModel. Ako vyplýva z názvu, obsahuje triedy tvoriace dátový model a metódy ktoré generujú údaje pri behu aplikácie a aj pri jej návrhu. Po vytvorení projektu sú všetky triedy tvoriace dátový model aplikácie v súbore SampleDataSource.cs / vb / cpp. Statické údaje sú v súbore SampleData.json.

JSON(JavaScript Object Notation) je štruktúra, ktorá je dobre čitateľná pre človeka aj počítač. Je to textový formát, ktorý je nezávislý od jazyka. Používa voľné konvencie jazykov rodiny C, no v zásade je jazykovo nezávislý a podporuje ho väčšina programovacích jazykov. Údaje vo formáte JSON môžu obsahovať atribúty typu String, Boolean, Array, Object, Number a Null

Ukážkové údaje obsahujú statické dáta vo forme textových reťazcov. Vo výpise je skrátená ukážka:

{“Groups”:[

{

“UniqueId”: “Group-1”,

“Title”: “Group Title: 1”,

“Subtitle”: “Group subtitle: 1”,

“ImagePath”: “Assets/DarkGray.png”,

“Description” : “Group Description: Lorem ipsum dolor “,

“Items”:

[

{

“UniqueId”: “Group-1-Item-1”,

“Title”: “Item Title: 1”,

“Subtitle”: “Item Subtitle: 1”,

“ImagePath”: “Assets/LightGray.png”,

“Description” : “Item Description: Pellentesque porta, .”,

“Content” : “Curabitur class aliquam vestibulum nam curae”

},

{

“UniqueId”: “Group-1-Item-2”,

“Title”: “Item Title: 2”,

“Subtitle”: “Item Subtitle: 2”,

“ImagePath”: “Assets/DarkGray.png”,

“Description” : “Item Description: Pellentesque “,

“Content” : “Curabitur class aliquam vestibulum”

},


Vašou úlohou podľa zamerania aplikácie je:

  • v prípade statickej aplikácie zmeniť štruktúru údajov podľa potrieb aplikácie a nahradiť vzorové údaje reálnymi. Statické údaje si aplikácia “nesie so sebou”. Takto je možné prezentovať údaje ktoré sa časom nemenia, napríklad vtipy, citáty, kuchárske recepty a podobne
  • v prípade dynamickej aplikácie, ktorá pracuje s aktuálnymi údajmi z webu je potrebné pripojiť aplikáciu na zdroj údajov. Tento model použijete ak bude aplikácia prezentovať správy o počasí, blogové príspevky, tweety a podobne

V prípade použitia dynamických údajov z webu, musí byť statický dátový model nahradený dynamickým, inak povedané dátový model obsahuje len definície štruktúr údajov a ich prípadné konverzie. Samotné údaje si aplikácia po každom spustení načíta z internetu, napríklad vo formáte JSON, RSS, XML, či v špeciálnom formáte definovanom pre konkrétnu aplikáciu. Prechod na dynamický zdroj údajov si vyžaduje len pridanie asynchrónnej metódy na ich načítanie a prípadnú zmenu atribútov tried, ktoré tvoria dátový model.

Aplikácie vytvorená podľa šablón Grid App s Split App predpokladajú že jednotlivé položky údajov budú hierarchicky usporiadané v skupinách, pričom skupiny a položky sú na úrovni dátového modelu vnútorne prepojené.

Pri návrhu používateľského rozhrania je potrebné zabezpečiť, aby názvy atribútov dátového modelu korešpondovali s objektami pre ich zobrazenie.

Triedy dátového modelu

Súbor SampleDataSource po vytvorení projektu podľa šablón Grid App s Split App obsahuje dve triedy:

SampleDataItem

public class SampleDataItem

{

public SampleDataItem(String uniqueId, String title, String subtitle,

String imagePath, String description, String content)

{

this.UniqueId = uniqueId;

this.Title = title;

this.Subtitle = subtitle;

this.Description = description;

this.ImagePath = imagePath;

this.Content = content;

}

 

public string UniqueId { get; private set; }

public string Title { get; private set; }

public string Subtitle { get; private set; }

public string Description { get; private set; }

public string ImagePath { get; private set; }

public string Content { get; private set; }

 

public override string ToString()

{

return this.Title;

}

}

 

SampleDataGroup

public class SampleDataGroup

{

public SampleDataGroup(String uniqueId, String title, String subtitle,

String imagePath, String description)

{

this.UniqueId = uniqueId;

this.Title = title;

this.Subtitle = subtitle;

this.Description = description;

this.ImagePath = imagePath;

this.Items = new ObservableCollection<SampleDataItem>();

}

 

public string UniqueId { get; private set; }

public string Title { get; private set; }

public string Subtitle { get; private set; }

public string Description { get; private set; }

public string ImagePath { get; private set; }

public ObservableCollection<SampleDataItem> Items { get; private set; }

 

public override string ToString()

{

return this.Title;

}

}

 

Poznámka: V porovnaní so šablónami Grid a Split aplikácií pre Windows 8 bola dátová štruktúra podstatne zjednodušená a sprehľadnená. Dátový model pre Windows 8 obsahoval štyri triedy: SampleDataCommon, SampleDataItem, SampleDataGroup a SampleDataSource. Triedy SampleDataGroup a SampleDataSource boli odvodené od bázovej triedy SampleDataCommon. Rozširovali triedu SampleDataCommon pridaním ďalších vlastností, ktoré mala len skupina, a v druhom prípade len objekty skupiny.

Trieda SampleDataSource vytvára kolekciu skupín položiek buď s pevne daným statickým obsahom, alebo dynamickými údajmi. Ak sa Inicializuje s údajmi zástupných symbolov a nie s živými prevádzkovými údajmi tak bude poskytovať údaje nielen pri spustení, ale aj počas návrhu.

Ak sa pripájate k dynamickému zdroju údajov a webe, ktoré možno nie sú v okamihu návrhu k dispozícii, alebo sa nenačítajú dosť rýchlo, môžete použiť nasledujúcu programovú konštrukciu, ktorá poskytne v dobe návrhu vzorové údaje, aby ste videli ich grafickú interpretáciu.

public SampleDataSource()

{

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)

{

//načítanie reálnych údajov

}

else

{

//vzorové údaje zobrazené počas návrhu

}

}

 

Údaje sú umiestnené v objektoch typu ObservableCollection

private ObservableCollection<SampleDataGroup> _groups =

new ObservableCollection<SampleDataGroup>();

 

public ObservableCollection<SampleDataGroup> Groups

{

get { return this._groups; }

}

Využitie senzora osvetlenia

4. novembra 2013

Ak tablet disponuje senzorom merajúcim intenzitu osvetlenia, ktoré implicitne využíva na automatickú reguláciu jasu displeja, dá sa využiť aj aplikáciách. Napríklad môžu reagovať na to že používateľ vyšiel z miestnosti von na slnečné svetlo, alebo opačne a prispôsobiť tomu farebný motív aplikácie, prípadne vhodne zvýšiť jas, alebo kontrast medzi pozadím a písmom, podobne ako to robia trebárs GPS navigácie po zotmení. Ako najjednoduchšia aplikácia sa ponúka luxmeter, teda merač intenzity osvetlenia. Dá sa použiť napríklad pri sledovaní ergonometrie pracovného prostredia, či má žiak, alebo študent v izbe dosť svetla na čítanie a podobne. Princíp aplikácie je triviálny – stačí periodicky snímať údaje zo snímača a zobraziť ich v číselnej, prípadne aj analógovej podobe. Windows 8.1 RT API poskytuje hodnotu priamo v luxoch

Fungovanie senzora merajúcim intenzitu osvetlenia ukážem na triviálnom príklade merača osvetlenia – luxmetra. Do kódu vložíme referenciu na menný priestor

using Windows.Devices.Sensors;

using Windows.UI.Core;

 

V kóde, napríklad v konštruktore MainPage sa najskôr pripojíme na senzor intenzity osvetlenia

private LightSensor _lightsensor;

 

public MainPage()

{


_sensor = LightSensor.GetDefault();

}

 

V obsluhe udalosti Loaded nastavíme periodicitu snímania údajov zo senzora osvetlenia a obsluhu kľúčovej udalosti – zmeny nameranej intenzity osvetlenia. Je potrebné ošetriť ak zariadenie príslušný senzor nemá. Čiže ak si používateľ aplikáciu nainštaluje na klasickom notebooku, bez senzoru, zobrazí sa mu upozornenie o tejto skutočnosti a zvyšok funkcionality bude zablokovaný.

private void pageRoot_Loaded(object sender, RoutedEventArgs e)

{

if (_sensor != null)

{

uint minInt = _sensor.MinimumReportInterval;

_sensor.ReportInterval = minInt > 100 ? minI : 100;

_sensor.ReadingChanged += new TypedEventHandler<LightSensor,

LightSensorReadingChangedEventArgs>(ReadingChanged);

}

else

{

tbErr.Text = “No light sensor found”;

}

}

 

Hodnota zo senzora sa číta v procedúre ReadingChanged vždy vtedy, keď dôjde k zmene hodnoty. V obsluhe udalosti zmeny osvetlenia nameranú hodnotu vypíšeme, prípadne ju vhodne graficky znázorníme.

async private void ReadingChanged(object sender,

LightSensorReadingChangedEventArgs e)

{

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>

{

LightSensorReading reading = e.Reading;

int nLux = Convert.ToInt32(reading.IlluminanceInLux);

tbLight.Text = String.Format(“{0,5:0.00}”, nLux) + ” lx”;

});

}

 

Používateľské rozhranie jednoduchého luxmetra. Aby nedochádzalo k ovplyvňovaniu merania jasom displeja, bolo použité čierne pozadie. Aplikáciu nájdete vo Windows obchode pod názvom Digital Luxmeter. Momentálne je aplikácia v procese schvaľovania

Praktické využitie senzora merajúcim intenzitu osvetlenia ukážeme na príklade aplikácie typu optické počítadlo. Každý z vás videl už tzv. “optickú rampu”, čiže zariadenie počítajúce ľudí pri vstupe do priestoru, predmety na páse, kolá ktoré vykoná sólo auto na autodráhe… proste variácií je veľké množstvo. Princíp je jednoduchý – objekty budú iniciovať počítanie tým, že budú prechádzať medzi zdrojom svetla a senzorom intenzity osvetlenia vhodne umiestneného tabletu.

Hodnota zo senzora sa číta v procedúre ReadingChanged vždy vtedy, keď dôjde k zmene hodnoty. Stavový automat inkrementuje počítadlo po prechode snímača zo svetla do tmy a opäť do svetla.

Počítadlo objektov využívajúce snímač osvetlenia. Aplikáciu nájdete vo Windows obchode pod názvom Optical Counter

Vyskúšajte si to, je to hodne inšpiratívny princíp

http://apps.microsoft.com/windows/en-gb/app/optical-counter/f8c81467-fec6-474d-a034-3dd2a62875f4

Princíp je možné ďalej rozširovať, napríklad o automatické zhotovenie fotografie, ak niekto v miestnosti rozsvieti, prípadne ako dočasný optický alarm pre vystavený exemplár, ktorý bude chrániť tablet nenápadne umiestnený vedľa predmetu, pričom opodstatnenosť tabletu sa automaticky odôvodní tým, že je na ňom popis exponátu.

Ochrana osobných údajov pre Windows 8 aplikácie

3. novembra 2013

Požiadavky na fungovanie aplikácie

Niektoré aplikácie pre správne fungovanie vyžadujú pripojenie k internetu pre načítanie aktuálneho obsahu. Niektoré aplikácie vyžadujú pre plnú funkcionalitu tablet, alebo konvertibilné zariadenie vybavené senzormi.

Ochrana osobných údajov

Aplikácia v aktuálnej verzii nezbiera od používateľa a neukladá žiadne údaje.

Podpora

Uvítam akékoľvek otázky, pripomienky alebo požiadavky ohľadne aplikácie. Prosím, neváhajte ma kontaktovať na adrese llacko@outlook.com

Ak sa rozhodnem zmeniť zásady ochrany osobných údajov, zverejním zmeny na tejto stránke tak, že ste vždy informovaní o tom, aké informácie sa zhromažďujú, ako sa využívajú a za akých okolností môžu byť zverejňované.