Fixed sticky header background

This commit is contained in:
Sad Ellie 2022-08-17 22:44:57 +03:00
parent 92ac089b2b
commit d1038eb4b2
3 changed files with 74 additions and 28 deletions

View File

@ -19,6 +19,7 @@
package com.sadellie.unitto.screens.common package com.sadellie.unitto.screens.common
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -32,17 +33,24 @@ import androidx.compose.ui.unit.dp
* *
* @param text Group label. * @param text Group label.
* @param modifier Modifier that will be applied to Text composable. * @param modifier Modifier that will be applied to Text composable.
* @param paddingValues Paddings that will be applied to a modifier.
*/ */
@Composable @Composable
fun Header( fun Header(
text: String, text: String,
modifier: Modifier = Modifier modifier: Modifier = Modifier,
paddingValues: PaddingValues = PaddingValues(
start = 16.dp,
end = 16.dp,
top = 24.dp,
bottom = 12.dp
)
) { ) {
Text( Text(
modifier = modifier modifier = modifier
.background(MaterialTheme.colorScheme.background) .background(MaterialTheme.colorScheme.background)
.fillMaxWidth() .padding(paddingValues)
.padding(start = 16.dp, end = 16.dp, top = 24.dp, bottom = 12.dp), .fillMaxWidth(),
text = text, text = text,
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.primary color = MaterialTheme.colorScheme.primary

View File

@ -18,26 +18,35 @@
package com.sadellie.unitto.screens.second package com.sadellie.unitto.screens.second
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.LinearOutSlowInEasing
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.sadellie.unitto.R import com.sadellie.unitto.R
import com.sadellie.unitto.data.units.AbstractUnit import com.sadellie.unitto.data.units.AbstractUnit
import com.sadellie.unitto.data.units.UnitGroup import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.screens.Formatter import com.sadellie.unitto.screens.Formatter
import com.sadellie.unitto.screens.second.components.ChipsRow
import com.sadellie.unitto.screens.common.Header import com.sadellie.unitto.screens.common.Header
import com.sadellie.unitto.screens.second.components.ChipsRow
import com.sadellie.unitto.screens.second.components.SearchBar import com.sadellie.unitto.screens.second.components.SearchBar
import com.sadellie.unitto.screens.second.components.SearchPlaceholder import com.sadellie.unitto.screens.second.components.SearchPlaceholder
import com.sadellie.unitto.screens.second.components.UnitListItem import com.sadellie.unitto.screens.second.components.UnitListItem
@ -73,10 +82,26 @@ private fun BasicUnitListScreen(
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val chipsRowLazyListState = rememberLazyListState() val chipsRowLazyListState = rememberLazyListState()
val elevatedColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp)
val chipsBackground = animateColorAsState(
if (scrollBehavior.state.overlappedFraction > 0.01f) {
elevatedColor
} else {
MaterialTheme.colorScheme.surface
},
animationSpec = tween(
durationMillis = 500,
easing = LinearOutSlowInEasing
)
)
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { topBar = {
Column(
Modifier.background(chipsBackground.value)
) {
SearchBar( SearchBar(
title = title, title = title,
value = uiState.searchQuery, value = uiState.searchQuery,
@ -93,21 +118,30 @@ private fun BasicUnitListScreen(
focusManager = focusManager, focusManager = focusManager,
scrollBehavior = scrollBehavior scrollBehavior = scrollBehavior
) )
}
) { paddingValues ->
LazyColumn(Modifier.padding(paddingValues)) {
stickyHeader {
chipsRow( chipsRow(
viewModel.uiState.chosenUnitGroup, viewModel.uiState.chosenUnitGroup,
chipsRowLazyListState chipsRowLazyListState
) )
} }
}
) { paddingValues ->
LazyColumn(Modifier.padding(paddingValues)) {
if (uiState.unitsToShow.isEmpty()) { if (uiState.unitsToShow.isEmpty()) {
item { SearchPlaceholder(navigateToSettingsActtion) } item { SearchPlaceholder(navigateToSettingsActtion) }
return@LazyColumn return@LazyColumn
} }
uiState.unitsToShow.forEach { (unitGroup, listOfUnits) -> uiState.unitsToShow.forEach { (unitGroup, listOfUnits) ->
item { Header(text = stringResource(unitGroup.res)) } item {
Header(
text = stringResource(unitGroup.res),
paddingValues = PaddingValues(
start = 16.dp,
end = 16.dp,
top = 8.dp,
bottom = 12.dp
)
)
}
items(items = listOfUnits, key = { it.unitId }) { unit -> items(items = listOfUnits, key = { it.unitId }) { unit ->
unitsListItem(unit) { unitsListItem(unit) {
selectAction(it) selectAction(it)
@ -213,7 +247,11 @@ fun RightSideScreen(
isSelected = currentUnit == unit, isSelected = currentUnit == unit,
selectAction = selectUnitAction, selectAction = selectUnitAction,
favoriteAction = { viewModel.favoriteUnit(it) }, favoriteAction = { viewModel.favoriteUnit(it) },
convertValue = { Formatter.format(unitFrom.convert(unit, inputValue, 3).toPlainString()) } convertValue = {
Formatter.format(
unitFrom.convert(unit, inputValue, 3).toPlainString()
)
}
) )
}, },
noBrokenCurrencies = false, noBrokenCurrencies = false,

View File

@ -69,7 +69,7 @@ fun ChipsRow(
) { ) {
LazyRow( LazyRow(
modifier = Modifier modifier = Modifier
.background(MaterialTheme.colorScheme.background) .padding(bottom = 4.dp)
.fillMaxWidth(), .fillMaxWidth(),
state = lazyListState, state = lazyListState,
contentPadding = PaddingValues(8.dp), contentPadding = PaddingValues(8.dp),