Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

21. diel - Grafika pomocou SkiaSharp v Xamarin.Forms - Úvod

V minulej lekcii, Aplikácie na počasie v Xamarin.Forms - Spracovanie upraveného , sme dokončili Xamarin.Forms aplikáciu pre predpoveď počasia.

V dnešnom Xamarin tutoriále si ukážeme, ako do mobilné aplikácie vkladať grafické prvky. Budeme pracovať s obrázkami as animáciami pomocou knižnice SkiaSharp. Vytvoríme si jednoduchú mobilnú hru, v ktorej budeme hráčom zobrazovať rôzne obrázky. Hráči potom vyberú jednu správnu odpoveď. Výsledná aplikácia bude vyzerať takto:

hotová aplikácia - Tvorba mobilných aplikácií v Xamarin a C # .NET

Inštalácia SkiaSharp

Vytvoríme nový projekt, ktorý pomenujeme SkiaSharpGame. Pre inštaláciu knižnice SkiaSharp klikneme v okne roztoku Explorer pravým tlačidlom na Solution a vyberieme možnosť Manage nugety Packages for Solutions.

Nájdeme knižnice SkiaSharp a SkiaSharp.Views.Forms, ktoré nainštalujeme do projektu SkiaSharpGame:

inštalácia SkiaSharp - Tvorba mobilných aplikácií v Xamarin a C # .NET

Implementácia SKCanvasView

Teraz môžeme použiť všetko, čo nám táto knižnica ponúka. Presunieme sa do MainPage.xaml.

MainPage.xaml

Aby sme SkiaSharp mohli použiť, musíme do definície elementu <ContentPage> vložiť riadok s xmls:skia, viď nižšie:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
    x:Class="SkiaSharpGame.MainPage">
...

<AbsoluteLayout>

<AbsoluteLayout> sme doteraz príliš nepoužívali. Podobne ako <Grid> alebo <StackLayout> nám umožňuje vkladať rôzne prvky na absolútnu, či relatívnu pozíciu. Vzhľadom k rôznym veľkostiam mobilných zariadení sa s absolútnou pozíciou príliš často nestretneme. Pre vloženie prvku na požadovanú relatívnu pozíciu využijeme LayoutBounds:

...
<AbsoluteLayout>
        <skia:SKCanvasView
            AbsoluteLayout.LayoutBounds="0,0,1,1"
            AbsoluteLayout.LayoutFlags="All"
            x:Name="Cnv"
            PaintSurface="Cnv_PaintSurface" />
</AbsoluteLayout>

Prvé dve cifry v LayoutBounds určujú xy súradnice prvku a ďalšie dve šírku a výšku (všetko relatívne, šírka 0.25 by znamenala štvrtinu šírky displeja). Tu chceme, aby nám plátno (canvas) pokrylo celú obrazovku. Prvok nazveme Cnv.

PaintSurface

V PaintSurface vygenerujeme odkaz na metódu Cnv_PaintSurface, ktorá zaistí vykreslenie všetky grafiky. Vygenerujeme ju tak, že umiestnime kurzor do úvodzoviek za PaintSurface a stlačíme klávesy Ctrl + Space. Z ponúkaného zoznamu vyberieme Cnv_PaintSurface. Automaticky sa vloží názov metódy Cnv_PaintSurface a vlastné metóda Cnv_PaintSurface() sa vygeneruje v súbore MainPage.xaml.cs.

Doterajší kód v súbore MainPage.xaml vyzerá takto:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
    x:Class="SkiaSharpGame.MainPage">
    <AbsoluteLayout>
        <skia:SKCanvasView
            AbsoluteLayout.LayoutBounds="0,0,1,1"
            AbsoluteLayout.LayoutFlags="All"
            x:Name="Cnv"
            PaintSurface="Cnv_PaintSurface" />
    </AbsoluteLayout>
</ContentPage>

Práca s SKCanvasView

Teraz si vysvetlíme, na čo náš canvas vlastne slúži a ako sa s ním pracuje. SKCanvasView je veľmi podobný PictureBox z Windows Forms. Jedná sa o plátno, na ktoré môžeme kresliť obrázky, geometrické tvary, text a podobne. Presunieme sa do súboru MainPage.xaml.cs.

Cnv_PaintSurface()

V súbore MainPage.xaml.cs nájdeme vygenerovanú metódu Cnv_PaintSurface(), ktorá umožní vykresliť všetku grafiku. V metóde si najprv vyskúšame nakresliť rámček okolo celej obrazovky a potom pozadie rámčeka vyplníme.

Príprava plátna

Najprv si pripravíme plátno:

private void Cnv_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
{
    //kreslení na plátno Cnv
    SKImageInfo info = e.Info;
    SKCanvas canvas = e.Surface.Canvas;
    canvas.Clear();
}

Pridáme using SkiaSharp.

Info nám poskytuje informácie o plátne. Uložíme ho do premennej info typu SKImageInfo. V premennej info máme napr. Šírku a výšku plátna. Keďže sme plátno vykreslili cez celú obrazovku, tak to je zároveň šírka a výška displeja.

Do premennej canvas typu SKCanvas sme uložili samotné plátno, na ktoré budeme všetko vykresľovať. Kedykoľvek sa metóda Cnv_PaintSurface() zavolá, plátno sa obnoví pomocou metódy Clear().

Vykreslenie rámčeku

V metóde Cnv_PaintSurface(), na inštanciu canvas, zavoláme metódu DrawRect(), pomocou ktorej vykreslíme rámček:

private void Cnv_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
{
    ...
    canvas.DrawRect(0, 0, info.Width, info.Height, new SKPaint
    {
        Color = SKColors.Black,
        Style = SKPaintStyle.Stroke,
        StrokeWidth = 20
    });
}

Počiatočný bod rámčeka je na pozícii 0,0. Šírka a výška sa rovná šírke a výške displeja.

Posledným parametrom metódy je objekt typu SKPaint. S objektom SKPaint sa stretneme u väčšiny grafických telies. Pomocou objektu SKPaint nastavíme farbu čiary, vykreslenie obrysové línie a hrúbku čiary.

Vykreslenie pozadia rámčeka

Metódu DrawRect() teraz upravíme tak, aby vykreslila vyplnený obdĺžnik, pretože pekné pozadie dodá aplikácii jej osobitý štýl. Z estetického hľadiska je vhodné držať sa okrem odtieňov šedi jednej, maximálne dvoch rôznych farieb, ktoré budú sprevádzať celú aplikáciu.

Zvoľme si napríklad modré pozadie. Dôležité je, aby sme najprv vykreslili pozadia a až potom rámček. V opačnom prípade by pozadí rámček prekrylo.

private void Cnv_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
{
    ...
    canvas.DrawRect(0, 0, info.Width, info.Height, new SKPaint
    {
        Color = new SKColor(147, 158, 254),
        Style = SKPaintStyle.Fill
    });
}

Všimnime si zadávanie farby. Môžeme si vybrať ako z predvolených farieb (napr. SKColors.Black), tak si zvoliť farbu vlastné pomocou RGB (napr. new SKColor(147, 158, 254)). Hodnoty určujú zložky farby v poradí červená, zelená, modrá v rozsahu 0 - 255. Ak by sme zvolili (0, 0, 0), získame čiernu farbu. Hodnota (0, 255, 0) nám vráti čisto zelenú a (255, 255, 255) bielu farbu. Výhoda zápisu farby pomocou RGB je, že farbu môžeme meniť aj v priebehu aplikácie (myRed, myGreen, myBlue), kde premenné môžu meniť hodnotu v závislosti na užívateľovi.

Vykreslenie tlačidiel

SkiaSharp nám umožňuje používať rôzne prvky, napríklad tlačidla. Do spodnej časti obrazovky vložíme tri tlačidlá s hodnotami "A", "B" a "C", ktorými hráč bude vyberať správnu odpoveď.

Štýl tlačidiel

Naše tlačidla sa budú líšiť iba textom a pozíciou. Vytvoríme si pre nich jednotný štýl. V súbore App.xaml, v <Application.Resources>, vytvoríme nový štýl, kde si nastavíme farbu a veľkosť písma tlačidiel:

...
     <Application.Resources>
        <Style
            x:Key="ButtonStyle"
            TargetType="{x:Type Button}">
            <Setter
                Property="TextColor"
                Value="Black" />
            <Setter
                Property="FontSize"
                Value="60" />
        </Style>
    </Application.Resources>
...
Vykreslenie tlačidiel

V súbore MainPage.xaml vytvoríme tri tlačidlá, ktoré budú používať vyššie nami vytvorený ButtonStyle:

<AbsoluteLayout>
        <skia:SKCanvasView
            ... />
        <Button
            Style="{StaticResource ButtonStyle}"
            AbsoluteLayout.LayoutBounds="0.1,0.9,0.25,0.15"
            AbsoluteLayout.LayoutFlags="All"
            Text="A"
            x:Name="BtnA"
            Clicked="BtnA_Clicked"></Button>
        <Button
            Style="{StaticResource ButtonStyle}"
            AbsoluteLayout.LayoutBounds="0.5,0.9,0.25,0.15"
            AbsoluteLayout.LayoutFlags="All"
            Text="B"
            x:Name="BtnB"
            Clicked="BtnB_Clicked"></Button>
        <Button
            Style="{StaticResource ButtonStyle}"
            AbsoluteLayout.LayoutBounds="0.9,0.9,0.25,0.15"
            AbsoluteLayout.LayoutFlags="All"
            Text="C"
            x:Name="BtnC"
            Clicked="BtnC_Clicked"></Button>
    </AbsoluteLayout>

Ku všetkým tlačidlám priradíme náš ButtonStyle. Ďalej nastavíme súradnice a veľkosť tlačidiel tak, aby sa tlačidlá neprekrývali. Do Text vložíme hodnotu pre zobrazenie tlačidla a do Name názov prvku.

Nakoniec opäť vygenerujeme metódy BtnA_Clicked(), BtnB_Clicked() a BtnC_Clicked() tak, že umiestnime kurzor do úvodzoviek za Clicked a stlačíme klávesy Ctrl + Space. Zo zoznamu vyberieme správnu metódu a potvrdíme. Metóda sa opäť vygeneruje v súbore MainPage.xaml.cs.

Kód pre tlačidlá v <Button>, v súbore MainPage.xaml, musíme napísať až pod <skia:SKCanvasView>, pretože inak by canvas tlačidla prekryl.

Testovanie

Po spustení aplikácie uvidíme nasledujúce obrazovku:

Screenshot aplikácie - Tvorba mobilných aplikácií v Xamarin a C # .NET

Základ hry máme, nabudúce budeme pokračovať:-)

V budúcej lekcii, Grafika v Xamarin.Forms - Úvod do vektorovej grafiky , sa zoznámime so štetcami, pomocou ktorých možno vytvárať farebné prechody, as vykresľovaním základných geometrických tvarov.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 7x (10.4 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Aplikácie na počasie v Xamarin.Forms - Spracovanie upraveného
Všetky články v sekcii
Tvorba mobilných aplikácií v Xamarin a C # .NET
Preskočiť článok
(neodporúčame)
Grafika v Xamarin.Forms - Úvod do vektorovej grafiky
Článok pre vás napísal Vojtěch Linhart
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity