
Náš Android tech stack pro vývoj mobilních aplikací

28. Feb 2023
AndroidObrázky a ikony jsou zásadní součástí uživatelského rozhraní vaší aplikace. Používají se hlavně k vizuálnímu vyjádření akcí. Pomáhají vytvářet celkový dojem z vaší aplikace a dělají ji jedinečnou. Jak s nimi pracovat v Jetpack Compose? Pojďme se na to podívat!
V Jetpack Compose jsou ve výchozím nastavení k dispozici 3 typy image composables. První bere jako parametr bitmapu, druhý vektor a poslední painter. Tyto funkce mají mnoho společných parametrů.
@Composable
fun Image(
//bitmap or vector or painter
contentDescription: String?,
modifier: Modifier = Modifier,
alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null
)
Tento úryvek kódu se načte a zobrazí danou bitmapu.
val bitmap = getBitmapFromYourSource()
Image(
bitmap = bitmap,
contentDescription = "Cat"
)
Tento úryvek kódu se načte a zobrazí daný vektor, např. ikonu.
To je nejzajímavější část. Bitmapa i vektor používají tento typ composables na pozadí. Existuje mnoho předdefinovaných painterů, např. ColorPainter, který kreslí definovanou barvou v mezích.
Image(
painter = ColorPainter(Color.Yellow),
contentDescription = "Yellow rectangle"
)
Pravděpodobně nemáte všechny obrázky použité v aplikaci uloženy lokálně. Pokud vaše aplikace pracuje s API, které vám odesílá adresu URL obrázku, budete ji muset načíst z internetu. Tady byste měli použít kteroukoli z dostupných knihoven.
Krátce před vydáním první stabilní verze Jetpack Compose oznámili vývojáři programu Coil image loader, že jejich knihovna plně spolupracuje s Compose. Než se objevila tato možnost, nejlepším řešením bylo použití knihovny Accompanist.
Coil má spoustu skvělých funkcí a na pozadí implementuje i rozhraní API pro paintery.
Co když chceme tento typ „rozložení“ v aplikacích, kde získáváme obrázky jako URL? Je to vážně jednoduché, stačí si zapamatovat painter a hodit ho jako parametr do Image composable.
Row(
modifier = Modifier.padding(16.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
//Important image loading part
//Remembering of painter
val painter = rememberImagePainter(data = cat.photoUrl)
Image(
modifier = Modifier
.size(100.dp)
.clip(RoundedCornerShape(16.dp)),
//Use painter in Image composable
painter = painter,
contentDescription = "Cat"
)
//Rest of compose code
}
Již dříve jsme zmínili, že Coil má spoustu skvělých funkcí, např. škálování, transformace, ukládání do cache, bitmap polling..., v podstatě všechno, co budete potřebovat. Jejich použití je snadné, stačí zavolat požadovanou funkci do Builderu. Ty používáme většinu času.
val painter = rememberImagePainter(
data = url,
builder = {
crossfade(true) //Crossfade animation between images
placeholder(R.drawable.ic_image_loading) //Used while loading
fallback(R.drawable.ic_empty) //Used if data is null
error(R.drawable.ic_empty) //Used when loading returns with error
}
)
Voilà, obrázky se teď načítají téměř bez námahy.