Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
Expand All @@ -50,14 +51,14 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.lerp
import androidx.compose.ui.unit.sp
Expand Down Expand Up @@ -102,8 +103,8 @@ fun SnackDetail(
val scroll = rememberScrollState(0)
Header()
Body(related, scroll)
Title(snack, scroll.value)
Image(snack.imageUrl, scroll.value)
Title(snack) { scroll.value }
Image(snack.imageUrl) { scroll.value }
Up(upPress)
CartBottomBar(modifier = Modifier.align(Alignment.BottomCenter))
}
Expand Down Expand Up @@ -237,16 +238,20 @@ private fun Body(
}

@Composable
private fun Title(snack: Snack, scroll: Int) {
private fun Title(snack: Snack, scrollProvider: () -> Int) {
val maxOffset = with(LocalDensity.current) { MaxTitleOffset.toPx() }
val minOffset = with(LocalDensity.current) { MinTitleOffset.toPx() }
val offset = (maxOffset - scroll).coerceAtLeast(minOffset)

Column(
verticalArrangement = Arrangement.Bottom,
modifier = Modifier
.heightIn(min = TitleHeight)
.statusBarsPadding()
.graphicsLayer { translationY = offset }
.offset {
val scroll = scrollProvider()
val offset = (maxOffset - scroll).coerceAtLeast(minOffset)
IntOffset(x = 0, y = offset.toInt())
}
.background(color = JetsnackTheme.colors.uiBackground)
) {
Spacer(Modifier.height(16.dp))
Expand Down Expand Up @@ -279,13 +284,15 @@ private fun Title(snack: Snack, scroll: Int) {
@Composable
private fun Image(
imageUrl: String,
scroll: Int
scrollProvider: () -> Int
) {
val collapseRange = with(LocalDensity.current) { (MaxTitleOffset - MinTitleOffset).toPx() }
val collapseFraction = (scroll / collapseRange).coerceIn(0f, 1f)
val collapseFractionProvider = {
(scrollProvider() / collapseRange).coerceIn(0f, 1f)
}

CollapsingImageLayout(
collapseFraction = collapseFraction,
collapseFractionProvider = collapseFractionProvider,
modifier = HzPadding.then(Modifier.statusBarsPadding())
) {
SnackImage(
Expand All @@ -298,7 +305,7 @@ private fun Image(

@Composable
private fun CollapsingImageLayout(
collapseFraction: Float,
collapseFractionProvider: () -> Float,
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
Expand All @@ -308,6 +315,8 @@ private fun CollapsingImageLayout(
) { measurables, constraints ->
check(measurables.size == 1)

val collapseFraction = collapseFractionProvider()

val imageMaxSize = min(ExpandedImageSize.roundToPx(), constraints.maxWidth)
val imageMinSize = max(CollapsedImageSize.roundToPx(), constraints.minWidth)
val imageWidth = lerp(imageMaxSize, imageMinSize, collapseFraction)
Expand Down