| package com.airbnb.lottie.sample.compose.examples |
| |
| import androidx.compose.foundation.border |
| import androidx.compose.foundation.clickable |
| import androidx.compose.foundation.layout.Arrangement |
| import androidx.compose.foundation.layout.Box |
| import androidx.compose.foundation.layout.Column |
| import androidx.compose.foundation.layout.Row |
| import androidx.compose.foundation.layout.defaultMinSize |
| import androidx.compose.foundation.layout.fillMaxSize |
| import androidx.compose.foundation.layout.fillMaxWidth |
| import androidx.compose.foundation.layout.height |
| import androidx.compose.foundation.layout.padding |
| import androidx.compose.material.DropdownMenu |
| import androidx.compose.material.DropdownMenuItem |
| import androidx.compose.material.Icon |
| import androidx.compose.material.Text |
| import androidx.compose.material.icons.Icons |
| import androidx.compose.material.icons.filled.ArrowDropDown |
| import androidx.compose.material.icons.filled.ArrowDropUp |
| import androidx.compose.runtime.Composable |
| import androidx.compose.runtime.getValue |
| import androidx.compose.runtime.mutableStateOf |
| import androidx.compose.runtime.remember |
| import androidx.compose.runtime.rememberUpdatedState |
| import androidx.compose.runtime.setValue |
| import androidx.compose.ui.Alignment |
| import androidx.compose.ui.Modifier |
| import androidx.compose.ui.graphics.Color |
| import androidx.compose.ui.layout.ContentScale |
| import androidx.compose.ui.text.style.TextAlign |
| import androidx.compose.ui.unit.dp |
| import com.airbnb.lottie.compose.LottieAnimation |
| import com.airbnb.lottie.compose.LottieCompositionSpec |
| import com.airbnb.lottie.compose.rememberLottieComposition |
| import com.airbnb.lottie.sample.compose.R |
| |
| @Composable |
| fun ContentScaleExamplesPage() { |
| val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.gradient)) |
| var alignment by remember { mutableStateOf(Alignment.Center) } |
| var contentScale by remember { mutableStateOf(ContentScale.Fit) } |
| |
| UsageExamplePageScaffold { |
| Column( |
| modifier = Modifier |
| .fillMaxWidth() |
| ) { |
| OptionsRow( |
| alignment, |
| contentScale, |
| onAlignmentChanged = { alignment = it }, |
| onContentScaleChanged = { contentScale = it }, |
| ) |
| Box( |
| modifier = Modifier |
| .fillMaxSize() |
| .padding(8.dp) |
| .border(2.dp, Color.Green) |
| .padding(2.dp) |
| ) { |
| LottieAnimation( |
| composition, |
| progress = { 0f }, |
| alignment = alignment, |
| contentScale = contentScale, |
| ) |
| } |
| } |
| } |
| } |
| @Composable |
| private fun OptionsRow( |
| alignment: Alignment, |
| contentScale: ContentScale, |
| onContentScaleChanged: (ContentScale) -> Unit, |
| onAlignmentChanged: (Alignment) -> Unit, |
| ) { |
| var scaleExpanded by remember { mutableStateOf(false) } |
| var alignmentExpanded by remember { mutableStateOf(false) } |
| |
| val onContentScaleChangedState by rememberUpdatedState(onContentScaleChanged) |
| val onAlignmentChangedState by rememberUpdatedState(onAlignmentChanged) |
| |
| Row( |
| horizontalArrangement = Arrangement.SpaceAround, |
| verticalAlignment = Alignment.CenterVertically, |
| modifier = Modifier |
| .fillMaxWidth() |
| .height(64.dp) |
| ) { |
| Row( |
| modifier = Modifier |
| .clickable { |
| scaleExpanded = true |
| alignmentExpanded = false |
| } |
| .padding(horizontal = 4.dp, vertical = 16.dp) |
| ){ |
| Text( |
| ContentScales[contentScale] ?: "Unknown Content Scale", |
| textAlign = TextAlign.Center, |
| modifier = Modifier |
| .defaultMinSize(minWidth = 128.dp) |
| ) |
| Icon( |
| imageVector = if (scaleExpanded) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown, |
| contentDescription = null, |
| ) |
| DropdownMenu( |
| scaleExpanded, |
| onDismissRequest = { scaleExpanded = false }, |
| ) { |
| ContentScales.forEach { (cs, label) -> |
| DropdownMenuItem( |
| onClick = { onContentScaleChangedState(cs) }, |
| ) { |
| Text(label) |
| } |
| } |
| } |
| } |
| Row( |
| modifier = Modifier |
| .clickable { |
| alignmentExpanded = true |
| scaleExpanded = false |
| } |
| .padding(horizontal = 4.dp, vertical = 16.dp) |
| ) { |
| Text( |
| Alignments[alignment] ?: "Unknown Alignment", |
| textAlign = TextAlign.Center, |
| modifier = Modifier |
| .defaultMinSize(minWidth = 128.dp) |
| ) |
| Icon( |
| imageVector = if (alignmentExpanded) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown, |
| contentDescription = null, |
| ) |
| DropdownMenu( |
| alignmentExpanded, |
| onDismissRequest = { alignmentExpanded = false } |
| ) { |
| Alignments.forEach { (a, label) -> |
| DropdownMenuItem( |
| onClick = { onAlignmentChangedState(a) }, |
| ) { |
| Text(label) |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| private val Alignments = mapOf( |
| Alignment.TopStart to "TopStart", |
| Alignment.TopCenter to "TopCenter", |
| Alignment.TopEnd to "TopEnd", |
| Alignment.CenterStart to "CenterStart", |
| Alignment.Center to "Center", |
| Alignment.CenterEnd to "CenterEnd", |
| Alignment.BottomStart to "BottomStart", |
| Alignment.BottomCenter to "BottomCenter", |
| Alignment.BottomEnd to "BottomEnd", |
| ) |
| |
| private val ContentScales = mapOf( |
| ContentScale.Fit to "Fit", |
| ContentScale.Crop to "Crop", |
| ContentScale.Inside to "Inside", |
| ContentScale.None to "None", |
| ContentScale.FillBounds to "FillBounds", |
| ContentScale.FillHeight to "FillHeight", |
| ContentScale.FillWidth to "FillWidth", |
| ) |