Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

3. diel - Material Dizajn a tvorba Theme v Compose

V minulej lekcii, Úvod do Jetpack Compose , sme si predstavili framework Jetpack Compose a tiež sme spolu vytvorili prvú Hello World aplikáciu. Vysvetlili sme si základný koncept Compose a jeho výhody oproti návrhu v XML.

V dnešnom Compose tutoriále si predstavíme Material Design, ktorý nám pomôže tvoriť kvalitnú grafiku Kotlín aplikácií. Vysvetlíme si, čo je to primárna a sekundárna farba. V praktickom príklade si ukážeme, ako v Android Studiu definovať farebnú schému a ako ju použiť pre naše Compose komponenty. Pre úpravu nášho GUI pomocou konceptu Material Design použijeme Modifier, pomocou ktorého upravíme aj tvar tlačidla.

Material Design

Material Design je dizajnový jazyk vytvorený spoločnosťou Google v roku 2014. V dnešnej dobe sa bežne stretávame s dvoma verziami. Používa sa Material Design 2 alebo Material Design 3. Pre potreby nášho tutoriálu budeme používať skratky M2 a M3. M3 je vylepšením staršieho štandardu M2, ale vychádza z rovnakých princípov a základy zostávajú rovnaké. Oba jazyky pracujem s tieňmi, hĺbkou a riešia farebný, typografický aj tvarový systém.

Farebný systém

Základnou vecou pri tvorení aplikácie je zvolenie správnych farieb, ktoré budú reprezentovať našu značku. Nie je vhodné, aby sme v jednej aplikácii používali desať farieb a mali v nej napríklad desať rôzne farebných tlačidiel. To by mohlo byť pre užívateľov mätúce. Keď sa budeme držať štandardu M2 alebo M3, použijeme iba pár farieb. Celkový dojem z našej aplikácie bude tak ucelenejší.

V základe rozlišujeme primárnu a sekundárnu farbu. Primárnu farbu použijeme pri komponente, ktorý má byť viac viditeľný. Napríklad v prípade kalkulačky ju využijeme pri tlačidle rovná sa. Sekundárnu farbu použijeme na komponenty, ktoré nepotrebujeme až tak veľmi zvýrazniť. Máme k dispozícii niekoľko ďalších farebných rozlíšení, ale tie si budeme vysvetľovať postupne v ďalších dieloch.

Ako ďalšie spomeňme tzv. on farby, ktorých použitie si ukážeme ďalej v lekcii. Tieto farby nám slúžia napríklad na písanie textu na určitý komponent, ako napríklad tlačidlo.

Typografický systém

Ďalej je určite žiaduce, aby sme nepoužívali niekoľko fontov naraz a rôzne ich miešali. To má potom za výsledok opäť zlý dojem z aplikácie. Pokiaľ potrebujeme viac fontov, vyberieme iba tie, ktoré k sebe ladia. A znovu platí, čím menej rozdielnych typov písma použijeme, tým lepšie.

Na výber fontov použijeme webovú stránku priamo od Googlu, ktorá sa volá Google Fonts. Na nej nájdeme niekoľko stoviek fontov a Google nám aj pomôže vybrať k sebe tie správne.

Tvarový systém

Určite by sme chceli nejako "okoreniť" vzhľad našej aplikácie, aby nevyzerala ako stovky ďalších. K tomu nám určite pomôžu rôzne tvary našich komponentov. Vylepšíme tak dojem z našej aplikácie. Nebudú to už klasické štvorcové tvary, ktoré pôsobia ohrane. S pomocou Compose a Material Design vytvoríme zaoblené aj zastrihnuté tvary. Pre úpravu komponentov využijeme už skôr spomínaný Modifier.

Tvorba aplikácie v Material Design

Poďme si teraz ukázať všetko v praxi. Vytvoríme si nový projekt, rovnako ako v minulých lekciách. Dnešný príklad pomenujeme PrvniAplikaceMaterial:

tvorba nového projektu - Tvorba UI v Jetpack Compose

Farebné konštanty

Ako obvykle sa nám otvorí súbor MainActivity.kt. Tento súbor zatiaľ upravovať nebudeme. Najprv si ukážeme, kde môžeme meniť naše farby. Hneď nad súborom MainActivity.kt máme priečinok ui.theme\. Otvoríme ju av nej dvakrát klikneme na súbor Color.kt:

súbor Color.kt - Tvorba UI v Jetpack Compose

Tento súbor slúži na tvorbu farebných konštánt. Vďaka tomu potom nemusíme zakaždým písať hexadecimálne kódy farieb. Jeho pôvodný obsah vyzerá nasledovne:

package cz.itnetwork.prvniaplikacematerial.ui.theme

import androidx.compose.ui.graphics.Color

val Purple200 = Color(0xFFBB86FC)
val Purple500 = Color(0xFF6200EE)
val Purple700 = Color(0xFF3700B3)
val Teal200 = Color(0xFF03DAC5)

Máme tu konštanty pre štyri farby, ktoré budeme používať v Material Design. Aby sme ich mohli používať, musíme ich pridať do farebnej schémy.

Farebná schéma

Schéma nám tiež automaticky vygenerovalo Android Studio, nájdeme ho v súbore ui.theme/Theme.kt.

Aby sme celý princíp stavby grafického vzhľadu správne pochopili, popíšme si, čo robí kód vo vygenerovanom súbore:

package cz.itnetwork.prvniaplikacematerial.ui.theme

import ...

private val DarkColorPalette = darkColors(
    primary = Purple200,
    primaryVariant = Purple700,
    secondary = Teal200
)
   ...

Na začiatku je uvedený balíček našej aplikácie, nasledujú potrebné importy. Ďalej definujeme farebnú paletu pre tmavý režim. V nej určíme primárnu farbu, vrátane možnej varianty a potom vyberieme sekundárnu farbu.

Podobne vytvoríme farebnú paletu pre svetlý režim:

private val LightColorPalette = lightColors(
    primary = Purple500,
    primaryVariant = Purple700,
    secondary = Teal200

    /* Other default colors to override
    background = Color.White,
    surface = Color.White,
    onPrimary = Color.White,
    onSecondary = Color.Black,
    onBackground = Color.Black,
    onSurface = Color.Black
    */
)

V druhom odseku máme zakomentovaný kód, v ktorom je možné definovať spomínané on farby. V predvolenom nastavení bude použitá biela a čierna farba, ktoré sa vzájomne striedajú. Pokiaľ by sme to chceli zmeniť, kód odkomentujeme a definujeme si v ňom vlastné farby.

Nakoniec v súbore máme @Composable metódu:

@Composable
fun PrvniAplikaceMaterialTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    MaterialTheme(
        colors = colors,
        typography = Typography,
        shapes = Shapes,
        content = content
    )
}

Táto metóda je anotovaná anotáciou @Composable, môžeme ju teda použiť pri tvorbe rozhrania. V prvej časti zisťujeme, či má byť nastavený tmavý alebo svetlý režim a pomocou podmienky vyberieme zodpovedajúcu farebnú paletu. V druhej časti odkazujeme na definované farby, písmo a tvary nášho GUI.

Tvorba tlačidla

V aplikácii si teraz vytvoríme farebné tlačidlo. Začneme tak s využitím farieb nášho MaterialTheme. Tlačidlo definujeme v súbore MainActivity.kt. Najprv si tu vytvoríme @Composable metódu, pomenujeme ju BarevneTlacitko() a pridáme jej anotáciu @Preview:

@Preview
@Composable
fun BarevneTlacitko() {
    Button(
        onClick = { /*TODO*/ },
        colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.primary)
    ) {
        Text(
            text = "Tlačidlo",
            color = MaterialTheme.colors.onPrimary,
            modifier = Modifier.background(MaterialTheme.colors.primary)
        )
    }
}

Pomocou parametra colors sme nastavili tlačidlu farbu pozadia. Použili sme príkaz ButtonDefaults.buttonColors() av parametri sme mu nastavili primárnu farbu z MaterialTheme. Potom sme tlačidlu pridali text a jeho farbu nastavili na hodnotu, ktorá je uložená v MaterialTheme.colors.onPrimary. Pri texte sme teda použili on farbu. Na nastavenie pozadia sme použili Modifier s primárnou farbou.

V kóde máme aj farbu onPrimary, ktorá je v súbore Theme.kt zakomentovaná. V našom prípade teda Android Studio použije predvolené farby, tj bielu a čiernu. Ak by sme ich chceli explicitne nastaviť, definujeme ich práve v súbore Theme.kt.

Nastavenie farebnej schémy

Ďalej potrebujeme nastaviť konkrétny MaterialTheme nášmu tlačidlu. To docielime úplne jednoducho. Celý Button() vložíme do bloku PrvniAplikaceMaterialTheme:

@Preview
@Composable
fun BarevneTlacitko() {
    PrvniAplikaceMaterialTheme {
        Button(
            onClick = { /*TODO*/ },
            colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.primary)
        ) {
            Text(
                text = "Tlačidlo",
                color = MaterialTheme.colors.onPrimary,
                modifier = Modifier.background(MaterialTheme.colors.primary)
            )
        }
    }
}

Takto nastavený MaterialTheme bude použitý pre všetky elementy vo vnútri bloku. Zmení teda aj vzhľad komponentov vytvorených v iných @Composable metódach, pokiaľ sú súčasťou bloku. Všetky zmeny môžeme pozorovať v režime Split:

tlačidlo náhľad - Tvorba UI v Jetpack Compose

Úprava tvaru tlačidla

Na záver si ukážeme, ako zmeniť tvar tlačidla. To urobíme opäť pomocou Modifier:

Button(
        onClick = { /*TODO*/ },
        modifier = Modifier.clip(CutCornerShape(16.dp)),
        colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.primary)
    ) {
        Text(
            text = "Tlačidlo",
            color = MaterialTheme.colors.onPrimary,
            modifier = Modifier.background(MaterialTheme.colors.primary)
        )
    }

Pridali sme parameter modifier do komponentu Button(). Tlačidlu sme v ňom nastavili odstrihnutý tvar. Výsledok môžeme vidieť v Split režime:

tlačidlo orezané náhľad - Tvorba UI v Jetpack Compose

Vidíme, že Modifier využijeme aj na úpravy tvarov komponentov. Môžeme ho použiť pre ktorýkoľvek komponent v Compose, dokonca aj pre naše vlastné. Tým ale jeho využitie nekončí, ako uvidíme v ďalších lekciách.

V budúcej lekcii, Jednoduchá kalkulačka v Compose - Tvorba komponentov , začneme tvoriť kalkulačku. Pripravíme si tlačidlá pre jednotlivé početné operácie, ktoré budeme používať v našom grafickom rozhraní a ukážeme si, ako správne štruktúrovať náš projekt.


 

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é 3x (21.55 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin

 

Predchádzajúci článok
Úvod do Jetpack Compose
Všetky články v sekcii
Tvorba UI v Jetpack Compose
Preskočiť článok
(neodporúčame)
Jednoduchá kalkulačka v Compose - Tvorba komponentov
Článok pre vás napísal Marek Urbańczyk
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Kotlinu, Javě. Má také zkušenosti s C#.
Aktivity