Skip to content

Instantly share code, notes, and snippets.

@AlShevelev
Last active July 16, 2022 11:34
Show Gist options
  • Save AlShevelev/24a9d12d078149a923b8ffc5ad0ccf2e to your computer and use it in GitHub Desktop.
Save AlShevelev/24a9d12d078149a923b8ffc5ad0ccf2e to your computer and use it in GitHub Desktop.
@Composable
internal fun CoordinatedScroll(
collapsingAreaHeightPx: MutableState<Float> = remember { mutableStateOf(0f) },
content: @Composable (Float, NestedScrollConnection) -> Unit
) {
val currentOffsetPx = remember { mutableStateOf(0f) }
val currentAbsoluteOffsetPx = remember { mutableStateOf(0f) }
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val delta = available.y
var absoluteOffset = currentAbsoluteOffsetPx.value + delta
if (absoluteOffset > 0f) {
absoluteOffset = 0f
}
currentAbsoluteOffsetPx.value = absoluteOffset
if (absoluteOffset >= -collapsingAreaHeightPx.value) {
currentOffsetPx.value = absoluteOffset
} else {
currentOffsetPx.value = -collapsingAreaHeightPx.value
}
return when {
abs(currentOffsetPx.value) == collapsingAreaHeightPx.value ->
Offset.Zero
abs(currentOffsetPx.value) == 0f -> Offset.Zero
else -> available
}
}
}
}
content(
currentOffsetPx.value,
nestedScrollConnection
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment