Skip to content

Commit 559604a

Browse files
committed
improve animations
1 parent 711c400 commit 559604a

File tree

2 files changed

+81
-103
lines changed

2 files changed

+81
-103
lines changed

core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/selection/ScaleModeSelector.kt

+52-80
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@
1717

1818
package ru.tech.imageresizershrinker.core.ui.widget.controls.selection
1919

20+
import androidx.compose.animation.AnimatedVisibility
21+
import androidx.compose.animation.expandVertically
22+
import androidx.compose.animation.fadeIn
23+
import androidx.compose.animation.fadeOut
24+
import androidx.compose.animation.shrinkVertically
2025
import androidx.compose.foundation.layout.Arrangement
2126
import androidx.compose.foundation.layout.Column
22-
import androidx.compose.foundation.layout.FlowRow
2327
import androidx.compose.foundation.layout.PaddingValues
2428
import androidx.compose.foundation.layout.Row
2529
import androidx.compose.foundation.layout.RowScope
@@ -86,7 +90,6 @@ fun ScaleModeSelector(
8690
backgroundColor: Color = Color.Unspecified,
8791
shape: Shape = RoundedCornerShape(24.dp),
8892
enableItemsCardBackground: Boolean = true,
89-
showAsColumns: Boolean = false,
9093
titlePadding: PaddingValues = PaddingValues(top = 8.dp),
9194
titleArrangement: Arrangement.Horizontal = Arrangement.Center,
9295
entries: List<ImageScaleMode> = ImageScaleMode.defaultEntries(),
@@ -171,90 +174,55 @@ fun ScaleModeSelector(
171174
} else Modifier.padding(8.dp)
172175
)
173176

174-
if (showAsColumns) {
175-
FlowRow(
176-
verticalArrangement = Arrangement.spacedBy(
177-
space = 8.dp,
178-
alignment = Alignment.CenterVertically
179-
),
180-
horizontalArrangement = Arrangement.spacedBy(
181-
space = 8.dp,
182-
alignment = Alignment.CenterHorizontally
177+
val state = rememberLazyStaggeredGridState()
178+
LazyHorizontalStaggeredGrid(
179+
verticalArrangement = Arrangement.spacedBy(
180+
space = 8.dp,
181+
alignment = Alignment.CenterVertically
182+
),
183+
state = state,
184+
horizontalItemSpacing = 8.dp,
185+
rows = StaggeredGridCells.Adaptive(30.dp),
186+
modifier = Modifier
187+
.heightIn(max = if (enableItemsCardBackground) 160.dp else 140.dp)
188+
.then(chipsModifier)
189+
.fadingEdges(
190+
scrollableState = state,
191+
isVertical = false,
192+
spanCount = 3
183193
),
184-
modifier = chipsModifier
185-
) {
186-
entries.forEach {
187-
val selected by remember(value, it) {
188-
derivedStateOf {
189-
value::class.isInstance(it)
190-
}
194+
contentPadding = PaddingValues(2.dp)
195+
) {
196+
items(entries) {
197+
val selected by remember(value, it) {
198+
derivedStateOf {
199+
value::class.isInstance(it)
191200
}
192-
EnhancedChip(
193-
onClick = {
194-
onValueChange(it.copy(value.scaleColorSpace))
195-
},
196-
selected = selected,
197-
label = {
198-
Text(text = stringResource(it.title))
199-
},
200-
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 6.dp),
201-
selectedColor = MaterialTheme.colorScheme.outlineVariant(
202-
0.2f,
203-
MaterialTheme.colorScheme.tertiary
204-
),
205-
selectedContentColor = MaterialTheme.colorScheme.onTertiary,
206-
unselectedContentColor = MaterialTheme.colorScheme.onSurface
207-
)
208201
}
209-
}
210-
} else {
211-
val state = rememberLazyStaggeredGridState()
212-
LazyHorizontalStaggeredGrid(
213-
verticalArrangement = Arrangement.spacedBy(
214-
space = 8.dp,
215-
alignment = Alignment.CenterVertically
216-
),
217-
state = state,
218-
horizontalItemSpacing = 8.dp,
219-
rows = StaggeredGridCells.Adaptive(30.dp),
220-
modifier = Modifier
221-
.heightIn(max = if (enableItemsCardBackground) 160.dp else 140.dp)
222-
.then(chipsModifier)
223-
.fadingEdges(
224-
scrollableState = state,
225-
isVertical = false,
226-
spanCount = 3
202+
EnhancedChip(
203+
onClick = {
204+
onValueChange(it.copy(value.scaleColorSpace))
205+
},
206+
selected = selected,
207+
label = {
208+
Text(text = stringResource(id = it.title))
209+
},
210+
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 6.dp),
211+
selectedColor = MaterialTheme.colorScheme.outlineVariant(
212+
0.2f,
213+
MaterialTheme.colorScheme.tertiary
227214
),
228-
contentPadding = PaddingValues(2.dp)
229-
) {
230-
items(entries) {
231-
val selected by remember(value, it) {
232-
derivedStateOf {
233-
value::class.isInstance(it)
234-
}
235-
}
236-
EnhancedChip(
237-
onClick = {
238-
onValueChange(it.copy(value.scaleColorSpace))
239-
},
240-
selected = selected,
241-
label = {
242-
Text(text = stringResource(id = it.title))
243-
},
244-
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 6.dp),
245-
selectedColor = MaterialTheme.colorScheme.outlineVariant(
246-
0.2f,
247-
MaterialTheme.colorScheme.tertiary
248-
),
249-
selectedContentColor = MaterialTheme.colorScheme.onTertiary,
250-
unselectedContentColor = MaterialTheme.colorScheme.onSurface
251-
)
252-
}
215+
selectedContentColor = MaterialTheme.colorScheme.onTertiary,
216+
unselectedContentColor = MaterialTheme.colorScheme.onSurface
217+
)
253218
}
254219
}
255220

256-
if (isColorSpaceSelectionVisible) {
257-
Spacer(modifier = Modifier.height(4.dp))
221+
AnimatedVisibility(
222+
visible = isColorSpaceSelectionVisible,
223+
enter = fadeIn() + expandVertically(),
224+
exit = fadeOut() + shrinkVertically()
225+
) {
258226
val items = remember {
259227
ScaleColorSpace.entries
260228
}
@@ -276,10 +244,14 @@ fun ScaleModeSelector(
276244
shape = ContainerShapeDefaults.bottomShape,
277245
modifier = Modifier
278246
.fillMaxWidth()
247+
.padding(top = 4.dp)
279248
.padding(horizontal = 8.dp),
280249
selectedItemColor = MaterialTheme.colorScheme.secondary
281250
)
282-
Spacer(modifier = Modifier.height(8.dp))
251+
}
252+
253+
AnimatedVisibility(isColorSpaceSelectionVisible || enableItemsCardBackground) {
254+
Spacer(Modifier.height(8.dp))
283255
}
284256
}
285257

core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/value/ValueText.kt

+29-23
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import androidx.compose.ui.text.style.TextAlign
3838
import androidx.compose.ui.unit.dp
3939
import androidx.compose.ui.unit.sp
4040
import ru.tech.imageresizershrinker.core.domain.utils.trimTrailingZero
41+
import ru.tech.imageresizershrinker.core.ui.utils.provider.LocalContainerColor
42+
import ru.tech.imageresizershrinker.core.ui.utils.provider.ProvideContainerDefaults
4143
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.hapticsClickable
4244
import ru.tech.imageresizershrinker.core.ui.widget.modifier.container
4345
import ru.tech.imageresizershrinker.core.ui.widget.modifier.shapeByInteraction
@@ -70,30 +72,34 @@ fun ValueText(
7072
pressedShape = ButtonDefaults.pressedShape,
7173
interactionSource = interactionSource
7274
)
73-
AnimatedContent(
74-
targetState = text,
75-
transitionSpec = { fadeIn(tween(100)) togetherWith fadeOut(tween(100)) },
76-
modifier = modifier
77-
.container(
78-
shape = shape,
79-
color = backgroundColor,
80-
resultPadding = 0.dp,
81-
autoShadowElevation = if (enabled) 0.7.dp else 0.dp
82-
)
75+
ProvideContainerDefaults(
76+
color = LocalContainerColor.current
8377
) {
84-
AutoSizeText(
85-
text = it,
86-
color = LocalContentColor.current.copy(0.5f),
87-
textAlign = TextAlign.Center,
88-
modifier = Modifier
89-
.hapticsClickable(
90-
enabled = enabled,
91-
onClick = onClick,
92-
interactionSource = interactionSource,
93-
indication = LocalIndication.current
78+
AnimatedContent(
79+
targetState = text,
80+
transitionSpec = { fadeIn(tween(100)) togetherWith fadeOut(tween(100)) },
81+
modifier = modifier
82+
.container(
83+
shape = shape,
84+
color = backgroundColor,
85+
resultPadding = 0.dp,
86+
autoShadowElevation = if (enabled) 0.7.dp else 0.dp
9487
)
95-
.padding(horizontal = 16.dp, vertical = 6.dp),
96-
lineHeight = 18.sp
97-
)
88+
) {
89+
AutoSizeText(
90+
text = it,
91+
color = LocalContentColor.current.copy(0.5f),
92+
textAlign = TextAlign.Center,
93+
modifier = Modifier
94+
.hapticsClickable(
95+
enabled = enabled,
96+
onClick = onClick,
97+
interactionSource = interactionSource,
98+
indication = LocalIndication.current
99+
)
100+
.padding(horizontal = 16.dp, vertical = 6.dp),
101+
lineHeight = 18.sp
102+
)
103+
}
98104
}
99105
}

0 commit comments

Comments
 (0)