From 07d987733108db806f6fecfc90341cc34e1859b6 Mon Sep 17 00:00:00 2001 From: Yuya <140081005+oikvpqya@users.noreply.github.com> Date: Wed, 6 Dec 2023 09:59:00 +0900 Subject: [PATCH 1/2] Update thumb movement range by thumb size, in app scrollbars Change-Id: I4438debd5037965a837758e0c78b110ab8197da5 --- .../component/scrollbar/Scrollbar.kt | 33 ++++++++++++------- .../component/scrollbar/ThumbExt.kt | 3 +- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt b/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt index 5041eff7b..1e5850f30 100644 --- a/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt +++ b/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt @@ -91,6 +91,12 @@ class ScrollbarState { */ val thumbMovedPercent get() = unpackFloat2(packedValue) + + /** + * Returns the max distance the thumb can travel as a percentage of total track size + */ + val thumbTrackSizePercent + get() = 1f - unpackFloat1(packedValue) } /** @@ -310,27 +316,30 @@ fun Scrollbar( b = minThumbSize.toPx(), ) - val thumbTravelPercent = when { - interactionThumbTravelPercent.isNaN() -> state.thumbMovedPercent - else -> interactionThumbTravelPercent + val trackSizePx = when (state.thumbTrackSizePercent) { + 0f -> track.size + else -> (track.size - thumbSizePx) / state.thumbTrackSizePercent } - val thumbMovedPx = min( - a = track.size * thumbTravelPercent, - b = track.size - thumbSizePx, + val thumbTravelPercent = max( + a = min( + a = when { + interactionThumbTravelPercent.isNaN() -> state.thumbMovedPercent + else -> interactionThumbTravelPercent + }, + b = state.thumbTrackSizePercent, + ), + b = 0f, ) - val scrollbarThumbMovedPx = max( - a = thumbMovedPx.roundToInt(), - b = 0, - ) + val thumbMovedPx = trackSizePx * thumbTravelPercent val y = when (orientation) { Horizontal -> 0 - Vertical -> scrollbarThumbMovedPx + Vertical -> thumbMovedPx.roundToInt() } val x = when (orientation) { - Horizontal -> scrollbarThumbMovedPx + Horizontal -> thumbMovedPx.roundToInt() Vertical -> 0 } diff --git a/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/ThumbExt.kt b/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/ThumbExt.kt index 847580361..a267ec2ec 100644 --- a/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/ThumbExt.kt +++ b/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/ThumbExt.kt @@ -26,6 +26,7 @@ import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue +import kotlin.math.roundToInt /** * Remembers a function to react to [Scrollbar] thumb position displacements for a [LazyListState] @@ -79,7 +80,7 @@ private inline fun rememberDraggableScroller( LaunchedEffect(percentage) { if (percentage.isNaN()) return@LaunchedEffect - val indexToFind = (itemCount * percentage).toInt() + val indexToFind = (itemCount * percentage).roundToInt() scroll(indexToFind) } return remember { From e8f4537e7c526a4a10e7e9cb9d1f31910c013179 Mon Sep 17 00:00:00 2001 From: Yuya <140081005+oikvpqya@users.noreply.github.com> Date: Fri, 8 Dec 2023 09:11:28 +0900 Subject: [PATCH 2/2] Update thumbTrackSizePercent calculation for readability Change-Id: I7ef067a950b4b5911b8c2e6a8c1f72c3e95d938d --- .../core/designsystem/component/scrollbar/Scrollbar.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt b/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt index 1e5850f30..8c85e5be5 100644 --- a/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt +++ b/core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar/Scrollbar.kt @@ -96,7 +96,7 @@ class ScrollbarState { * Returns the max distance the thumb can travel as a percentage of total track size */ val thumbTrackSizePercent - get() = 1f - unpackFloat1(packedValue) + get() = 1f - thumbSizePercent } /**