Lekce 3 - Material Design a tvorba Theme v Compose
V minulé lekci, Základní pozicovaní a náhledy GUI v Compose, jsme se naučili pozicovat komponenty vertikálně i horizontálně a vytvořit náhled rozhraní.
V dnešním Compose tutoriálu si představíme
Material Design, který nám pomůže tvořit kvalitní grafiku
Kotlin aplikací. Vysvětlíme si, co je to primární
a sekundární barva. V praktickém příkladu si ukážeme, jak v
Android Studiu definovat barevné schéma a
jak jej použít pro naše Compose komponenty. Pro úpravu našeho GUI pomocí
konceptu Material Design použijeme Modifier, pomocí něhož
upravíme také tvar tlačítka.
Material Design
Material Design je designový jazyk vytvořený společností Google v roce 2014. V dnešní době se běžně setkáváme se dvěma verzemi. Používá se Material Design 2 nebo Material Design 3. Pro potřeby našeho tutoriálu budeme používat zkratky M2 a M3. M3 je vylepšením staršího standardu M2, ale vychází ze stejných principů a základy zůstávají stejné. Oba jazyky pracuji se stíny, hloubkou a řeší barevný, typografický i tvarový systém.
Barevný systém
Základní věcí při tvoření aplikace je zvolení správných barev, které budou reprezentovat naší značku. Není vhodné, abychom v jedné aplikaci používali deset barev a měli v ní například deset různě barevných tlačítek. To by mohlo být pro uživatele matoucí. Když se budeme držet standardu M2 či M3, použijeme pouze pár barev. Celkový dojem z naší aplikace bude tak ucelenější.
V základu rozlišujeme primární a sekundární barvu. Primární barvu použijeme u komponenty, která má být více viditelná. Například v případě kalkulačky ji využijeme u tlačítka rovná se. Sekundární barvu použijeme na komponenty, které nepotřebujeme až tak moc zvýraznit. Máme k dispozici několik dalších barevných rozlišení, ale ty si budeme vysvětlovat postupně v dalších dílech.
Jako další zmiňme tzv. on barvy, jejichž
použití si ukážeme dále v lekci. Tyto barvy nám slouží například pro
psaní textu na určitou komponentu, jako třeba
tlačítko.
Typografický systém
Dále je určitě žádoucí, abychom nepoužívali několik fontů najednou a různě je míchali. To má pak za výsledek opět špatný dojem z aplikace. Pokud potřebujeme více fontů, vybereme pouze ty, které k sobě ladí. A znovu platí, čím méně rozdílných typů písma použijeme, tím lépe.
K výběru fontů použijeme webovou stránku přímo od Googlu, která se jmenuje Google Fonts. Na ní najdeme několik stovek fontů a Google nám i pomůže vybrat k sobě ty správné.
Tvarový systém
Určitě bychom chtěli nějak "okořenit" vzhled naší aplikace, aby
nevypadala jako stovky dalších. K tomu nám určitě pomůžou různé tvary
našich komponent. Vylepšíme tak dojem z naší aplikace. Nebudou to už
klasické čtvercové tvary, které působí ohraně. S pomocí Compose a
Material Design vytvoříme zaoblené i zastřižené tvary. Pro úpravu
komponent využijeme už dříve zmíněný Modifier.
Tvorba aplikace v Material Design
Pojďme si nyní ukázat vše v praxi. Vytvoříme si nový projekt, stejně
jako v minulých lekcích. Dnešní příklad pojmenujeme
PrvniAplikaceMaterial:

Barevné konstanty
Jako obvykle se nám otevře soubor MainActivity.kt. Tento
soubor zatím upravovat nebudeme. Nejprve si ukážeme, kde můžeme měnit
naše barvy. Hned nad souborem MainActivity.kt máme složku
ui.theme\. Otevřeme ji a v ní dvakrát klikneme na soubor
Color.kt:

Tento soubor slouží k tvorbě barevných konstant. Díky tomu pak nemusíme pokaždé psát hexadecimální kódy barev. Jeho původní obsah vypadá následovně:
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 zde konstanty pro čtyři barvy, které budeme používat v Material Design. Abychom je mohli používat, musíme je přidat do barevného schématu.
Barevné schéma
Schéma nám také automaticky vygenerovalo Android Studio, najdeme ho v
souboru ui.theme/Theme.kt.
Abychom celý princip stavby grafického vzhledu správně pochopili, popišme si, co dělá kód ve vygenerovaném souboru:
package cz.itnetwork.prvniaplikacematerial.ui.theme import ... private val DarkColorPalette = darkColors( primary = Purple200, primaryVariant = Purple700, secondary = Teal200 ) ...
Na začátku je uveden balíček naší aplikace, následují potřebné importy. Dále definujeme barevnou paletu pro tmavý režim. V ní určíme primární barvu, včetně možné varianty a poté vybereme sekundární barvu.
Obdobně vytvoříme barevnou paletu pro světlý 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 */ )
Ve druhém odstavci máme zakomentovaný kód, v němž lze definovat
zmíněné on barvy. Ve výchozím nastavení bude použita bílá
a černá barva, které se vzájemně střídají. Pokud bychom to chtěli
změnit, kód odkomentujeme a definujeme si v něm vlastní barvy.
Nakonec v souboru máme @Composable metodu:
@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 ) }
Tato metoda je anotována anotací @Composable, můžeme ji tedy
použít při tvorbě rozhraní. V první části zjišťujeme, zda má být
nastaven tmavý či světlý režim a pomocí podmínky vybereme odpovídající
barevnou paletu. V druhé části odkazujeme na definované barvy, písmo a
tvary našeho GUI.
Tvorba tlačítka
V aplikaci si nyní vytvoříme barevné tlačítko. Začneme tak s
využitím barev našeho MaterialTheme. Tlačítko definujeme v
souboru MainActivity.kt. Nejprve si zde vytvoříme
@Composable metodu, pojmenujeme ji BarevneTlacitko() a
přidáme jí anotaci @Preview:
@Preview @Composable fun BarevneTlacitko() { Button( onClick = { /*TODO*/ }, colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.primary) ) { Text( text = "Tlačítko", color = MaterialTheme.colors.onPrimary, modifier = Modifier.background(MaterialTheme.colors.primary) ) } }
Pomocí parametru colors jsme nastavili tlačítku barvu
pozadí. Použili jsme příkaz ButtonDefaults.buttonColors() a v
parametru jsme mu nastavili primární barvu z MaterialTheme. Poté
jsme tlačítku přidali text a jeho barvu nastavili na hodnotu, která je
uložená v MaterialTheme.colors.onPrimary. U textu jsme tedy
použili on barvu. Pro nastavení pozadí jsme použili
Modifier s primární barvou.
V kódu máme také barvu onPrimary, která je v
souboru Theme.kt zakomentovaná. V našem případě tedy Android
Studio použije výchozí barvy, tj. bílou a černou. Pokud bychom je chtěli
explicitně nastavit, definujeme je právě v souboru Theme.kt.
Nastavení barevného schématu
Dále potřebujeme nastavit konkrétní MaterialTheme našemu
tlačítku. Toho docílíme úplně jednoduše. 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čítko", color = MaterialTheme.colors.onPrimary, modifier = Modifier.background(MaterialTheme.colors.primary) ) } } }
Takto nastavený MaterialTheme bude použit pro všechny
elementy uvnitř bloku. Změní tedy i vzhled komponent vytvořených v jiných
@Composable metodách, pokud jsou součástí bloku. Všechny
změny můžeme pozorovat v režimu Split:

Úprava tvaru tlačítka
Na závěr si ukážeme, jak změnit tvar tlačítka. To uděláme opět
pomocí Modifier:
Button(
onClick = { /*TODO*/ },
modifier = Modifier.clip(CutCornerShape(16.dp)),
colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.primary)
) {
Text(
text = "Tlačítko",
color = MaterialTheme.colors.onPrimary,
modifier = Modifier.background(MaterialTheme.colors.primary)
)
}
Přidali jsme parametr modifier do komponenty
Button(). Tlačítku jsme v něm nastavili ustřižený tvar.
Výsledek můžeme vidět ve Split režimu:

Vidíme, že Modifier využijeme také pro úpravy
tvarů komponent. Můžeme jej použít pro kteroukoliv komponentu v
Compose, dokonce i pro naše vlastní. Tím ale jeho využití nekončí, jak
uvidíme v dalších lekcích.
V příští lekci, Jednoduchá kalkulačka v Compose - Tvorba komponent, začneme tvořit kalkulačku. Připravíme si tlačítka pro jednotlivé početní operace, která budeme používat v našem grafickém rozhraní a ukážeme si, jak správně strukturovat náš projekt.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 6x (21.55 MB)
Aplikace je včetně zdrojových kódů v jazyce Kotlin
