Nová aplikace pro mobily - Věštby

Dnes mi na Windows Phone Store vyšla jedna "blbovinka" - Věštby. Věštby (Oracles) z data narození vypočítají šťastné číslo a podrobnosti o vašem minulém životě.

Věštby

Odkazy k projektu:

 

Věštby jsou klasickou XAML aplikací (bez použití MonoGame) o jedné scrollovací obrazovce (ve ScrollViewer). V další verzi byl obsah rozdělen do více těchto obrazovek, mazi kterými se posouvá horizontálně (jednotlivé ScrollViewery jsou položkami v komponentě Panorama). Pro výběr data narození byla použita komponenta DatePicker ze sady Windows Phone Toolkit. Aplikace má českou a anglickou lokalizaci.

Dlaždice

Jednotlivé informace se zobrazují na dlaždicích, které jsou vytvořeny jako vlastní komponenta (UserControl). Jejich velikost se určuje automaticky a je odvozena od šířky displeje. Velikost (šířku a výšku) hlavního gridu dlaždice (grdTile) nastavuje následující kód, který určí i velikost fontu pro prostřední TextBlock txbData a šířku mezery mezi nimi (Margin). Dlaždice tak při zobrazení na výšku přesně vyplní celou šířku displeje (4x Small, 2x Medium nebo 1x Wide). Později, při přidání komponenty Panorama, byla ještě před výpočtem od šířky displeje odečtena režije, kterou zabírají její okraje (50px).

public void CalcResize()
{
    double mezera = App.Current.Host.Content.ActualWidth * 0.03;
    double sirkaS = (App.Current.Host.Content.ActualWidth - 7 * mezera) / 4.0;   // Šířka malé dlaždice (4 na řádek)
    double fontSize = sirkaS * 0.44 * DataSize;
    switch (size)
    {
        case TileSize.Small:
            grdTile.Width = sirkaS;
            grdTile.Height = grdTile.Width;
            txbData.FontSize = fontSize;
            break;
        case TileSize.Medium:
            grdTile.Width = 2 * sirkaS + mezera;
            grdTile.Height = grdTile.Width;
            txbData.FontSize = 2*fontSize;
            break;
        case TileSize.Wide:
            grdTile.Width = 4 * sirkaS + 3 * mezera;
            grdTile.Height = 2 * sirkaS + mezera;
            txbData.FontSize = 2*fontSize;
            break;
        default:
            break;
    }
    grdTile.Margin = new Thickness(mezera / 2.0);
}
 
public enum TileSize { Small, Medium, Wide }

Texty, které dlaždice mají zobrazovat, jim jsou vkládány přes veřejné vlastnosti. Místo textů se však vkládají pouze klíče pro lokalizované Resources a ty komponenta při nastavování překládá do jejich finálního znění. 

private string title;
public string Title
{
    get { return title; }
    set { 
        title = value; 
        txbTitle.Text = AppResources.ResourceManager.GetString(value); 
    }
}

Barva dlaždic je odvozena od zvoleného barevného tématu, přičemž oproti základní je ztmavena o 20%. 

Color color = (Color)Application.Current.Resources["PhoneAccentColor"];
color.R = (byte)(color.R * 0.8);
color.G = (byte)(color.G * 0.8);
color.B = (byte)(color.B * 0.8);
grdTile.Background = new SolidColorBrush(color);

Aplikační menu

Dolní menu (ApplicationBar) je vytvořeno klasickým způsobem přímo ze C# (kvůli lokalizaci). Ikony do něho se dají najít např. zde. Pro otevírání URL v prohlížeči používám následující metodu. 

public static void OpenUrl(string url)
{
    var wbt = new WebBrowserTask();
    wbt.Uri = new Uri(url);
    wbt.Show();
}

Sdílení na sociálních sítích

Sdílení informací do sociálních sítí je pak funkce poskytovaná přímo od OS, takže stačí použít následující kód. 

ShareLinkTask shareLinkTask = new ShareLinkTask();
shareLinkTask.Title = AppResources.AppTileTitle;
shareLinkTask.LinkUri = new Uri("http://oracles.mission-game.com", UriKind.Absolute);
shareLinkTask.Message = String.Format("Text příspěvku...", parametry);
shareLinkTask.Show();

Ukládání informací

A pro uložení a načtení nějakého textu (v tomto případě posledního zadaného data narození) pak poslouží následující metody. 

void SaveString(string key, string data)
{
    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    if (settings.Contains(key))
        settings[key] = data;
    else
        settings.Add(key, data);
    settings.Save();
}
 
string LoadString(string key)
{
    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    if (settings.Contains(key))
        return (string)settings[key];
    return String.Empty;
}

Lokalizace

Lokalizace textů v aplikaci pak probíhá stejně jako v ostatních .NET projektech přes AppResources.resx a jeho kódem jazyka přejmenované mutace. Výjimkou je pouze název aplikace, který se má zobrazovat v přehledu aplikací (AppTitle) a text, jež bude uveden na dlaždici aplikace na úvodní obrazovce (AppTileTitle). Ty se zadávají přímo do nastavení aplikace pro Store (WMAppManifest.xml) a není tam prostor pro více jazykových mutací. Návodů, jak na to, je sice na internetu mnoho (např. zde nebo toto video od 25 minuty) a všechny říkají v podstatě to samé. Nejtěžší je ovšem smířit se s tím, že se to musí dělat skutečně takto neskutečně komplikovaně. Postup je tedy zhruba následující:

  1. Zde si stáhnete připravený projekt v C++ pro Visual Studio.
  2. Ten otevřete ve Visual Studiu a v Solution exploreru se doklikáte k souboru AppResLib.rc.
  3. Otevře se Resource Viewer, kde se je třeba doklikat ke String Table.
  4. Zde je tabulka se dvěma řádky pro AppTitle a AppTileTitle. První sloupec obsahuje ID a tyto dva názvy. Druhý Value s kódem (bude potřeba později). Třetí je text (Caption) s překlady příslušné položky názvu - pouze ty je třeba zadat, oba ve stejném jazyce.
  5. Projekt zkompilujte. Ve složce Debug (nebo Release, záleží na nastavení) vznikne knihovna AppResLib.dll.
  6. Tu je třeba přidat (Add - Existing Item...) do projektu, jehož název má být lokalizován a nastavit jí Build Action na Content.
  7. Soubor této knihovny přejmenujte na název odpovídající kódu jazyka, který je jím lokalizován (viz zde). Např. pro Češtinu (cs-CZ) to je "AppResLib.dll.0405.mui", pro výchozí Angličtinu (en-US) to je "AppResLib.dll.0409.mui".
  8. Tento postup (body 4-7) je třeba zopakovat pro každý z podporovaných jazyků.
  9. Knihovnu s překladem do výchozího (default/neutral) jazyka je třeba přidat a nechat ještě také pod jejím původním názvem AppResLib.dll (vyžadoval to WP Store při nahrávání XAPu).
  10. Do názvu aplikace (Display Name) pak zadejte text "@AppResLib.dll,-100" a do Tile Title text "@AppResLib.dll,-101". Ta čísla jsou právě kódy (value) určující, který řádek v lokalizační knihovně se má použít. Pokud tam jsou uvedeny jiné kódy, nebo jste ty stávající změnili, je třeba je stejně uvést i zde.

Reklama 

Takto jednoduchou aplikaci jsem samozřejmě nechal pro stažení zdarma, ale přidal jsem do ní reklamní banner (AdControl). Tomu je třeba zadat pouze správné rozměryApplicationIdAdUnitId. Vše vygenerujete ve Windows Phone Store po registraci názvu aplikace. Aby banner fungoval, je třeba nastavit poměrně dost požadavků na capability, které aplikace sama ani vůbec nepotřebuje. Konkrétně jde o tyto:

  • NETWORKING
  • PHONEDIALER
  • IDENTITY_USER
  • WEBBROWSERCOMPONENT
  • MEDIALIB_AUDIO
  • MEDIALIB_PHOTO
  • MEDIALIB_PLAYBACK

Pokud nejsou povoleny, reklama se nezobrazí, ale nic nezasekne. Je ale možné u AdControl zachytávat událost ErrorOccurred, v níž se z parametru e dá vyčíst, které capability je ještě třeba povolit. Nakonec to pak už končilo "jen" chybou "No ad available", neboli, že MS nebyl schopen reklamu dodat (nebo chybí připojení na síť). V tom případě tedy zobrazím alespoň vlastní reklamu na Mission game. Tu tvoří Grid, jehož Background je ImageBrush, kterému se jako zdroj dosazuje BitmapImage načtený z jednoho z náhodně vybraných obrázků z Mission game. Tento ImageBrush má transformaci CompositeTransform, jejíž TranslateY je animováno StoryboardDoubleAnimationUsingKeyFrames pro posun odshora dolů a zase zpátky. Nad obrázkem je také TextBlock s cyklicky měněnými text, jemuž je podobnou metodou měněn jeho ScaleXScaleY od 0 do 1 a obráceně.

Původní verze

Věštby jsou remake stejnojmenné aplikace, kterou jsem vytvořil v roce 1997 ještě na ZŠ. Podle hesla "čím větší blbost, tím větší úspěch" byla tenkrát celkem rozšířená, tak proč to nezkusit znovu...

Věštby (1997)

 

 

 

 

on 05 březen 2014