你如何在 Jetpack Compose 中使用 ScrollState?
How do you fling a ScrollState in Jetpack Compose?
出于与 Jetpack Compose input modifiers consuming all MotionEvents 有关的原因,我发现自己为一个 Composable 编写了自己的滚动例程,我可以访问其中的 ScrollState。
我已经想出了我需要的一切,除了投掷。我看不到如何在 ScrollState 上应用 performFling(initialVelocity)。我在文档中所能找到的只有 ScrollState.scrollTo
和 ScrollState.scrollBy
,它们对 flings 不太有用,因为滚动目标或大小未知。
我也找不到 ScrollState 侦听器,类似于旧 Android 世界中的 onScrollStateChanged(state: Int)
,它会在滚动状态更改时触发。
这是我所拥有的,以防有人能指出我正确的方向:
var lastY: Float? = null
var velocityTracker: VelocityTracker? = null
fun scroll(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
velocityTracker = VelocityTracker.obtain()
lastY = event.y
}
MotionEvent.ACTION_UP -> {
lastY = null
velocityTracker?.let {
it.computeCurrentVelocity(1000)
val initialVelocity = it.yVelocity
velocityTracker?.recycle()
coroutineScope.launch {
???? scrollState.PERFORMFLING?(initialVelocity) ????
AND THEN WHEN THE FLING IS FINISHED viewModel.scrollOffset = scrollState.value
}
}
}
else -> {
velocityTracker?.addMovement(event)
lastY?.let {
val scrollAmount = it - event.y
lastY = event.y
coroutineScope.launch {
scrollState.scrollBy(scrollAmount)
viewModel.scrollOffset = scrollState.value
}
}
}
}
}
您可以尝试使用 nestedScroll:
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
return super.onPostFling(consumed, available)
}
override suspend fun onPreFling(available: Velocity): Velocity {
return super.onPreFling(available)
}
}
}
Column(modifier = Modifier
.verticalScroll(rememberScrollState())
.nestedScroll(nestedScrollConnection)) {
}
如果这不起作用,只需搜索
对于NestedScrollConnection
,它应该会提示您如何处理 Compose 中的投掷。也许 NestedScrollConnection 就是您所需要的,因为它也提供了对滚动的支持。您可能可以放弃您的代码,而只使用 NestedScrollConnection。要查看 NestedScrollConnection 的运行情况,请查看演示:
出于与 Jetpack Compose input modifiers consuming all MotionEvents 有关的原因,我发现自己为一个 Composable 编写了自己的滚动例程,我可以访问其中的 ScrollState。
我已经想出了我需要的一切,除了投掷。我看不到如何在 ScrollState 上应用 performFling(initialVelocity)。我在文档中所能找到的只有 ScrollState.scrollTo
和 ScrollState.scrollBy
,它们对 flings 不太有用,因为滚动目标或大小未知。
我也找不到 ScrollState 侦听器,类似于旧 Android 世界中的 onScrollStateChanged(state: Int)
,它会在滚动状态更改时触发。
这是我所拥有的,以防有人能指出我正确的方向:
var lastY: Float? = null
var velocityTracker: VelocityTracker? = null
fun scroll(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
velocityTracker = VelocityTracker.obtain()
lastY = event.y
}
MotionEvent.ACTION_UP -> {
lastY = null
velocityTracker?.let {
it.computeCurrentVelocity(1000)
val initialVelocity = it.yVelocity
velocityTracker?.recycle()
coroutineScope.launch {
???? scrollState.PERFORMFLING?(initialVelocity) ????
AND THEN WHEN THE FLING IS FINISHED viewModel.scrollOffset = scrollState.value
}
}
}
else -> {
velocityTracker?.addMovement(event)
lastY?.let {
val scrollAmount = it - event.y
lastY = event.y
coroutineScope.launch {
scrollState.scrollBy(scrollAmount)
viewModel.scrollOffset = scrollState.value
}
}
}
}
}
您可以尝试使用 nestedScroll:
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
return super.onPostFling(consumed, available)
}
override suspend fun onPreFling(available: Velocity): Velocity {
return super.onPreFling(available)
}
}
}
Column(modifier = Modifier
.verticalScroll(rememberScrollState())
.nestedScroll(nestedScrollConnection)) {
}
如果这不起作用,只需搜索
对于NestedScrollConnection
,它应该会提示您如何处理 Compose 中的投掷。也许 NestedScrollConnection 就是您所需要的,因为它也提供了对滚动的支持。您可能可以放弃您的代码,而只使用 NestedScrollConnection。要查看 NestedScrollConnection 的运行情况,请查看演示: