首页 > 解决方案 > 如何在开始滚动之前为 LazyColumn/ViewPager 设置阈值?

问题描述

我正在使用基于/的 Jetpack compose的实验性查看器。LazyColumnRow

我要做的是设置一些阈值,即在手指开始滚动到下一页之前我需要移动多少。默认行为是,只要我移动手指,它就会开始滚动,但我希望在发生任何视觉滚动之前有一个更大的阈值来确定我需要移动多少手指。我查看了FlingBehaviour参数,但我不知道如何使用它来完成我想要的。(或者至少增加一些“阻力”在页面之间翻转,所以它不是那么敏感)

你有什么想法吗?

标签: kotlinandroid-viewpagerandroid-jetpack-compose

解决方案


此阈值由flingBehavior参数控制。

PagerDefaults.flingBehavior(pagerState)提供分页工作,目前只有动画是可配置的,所以你不能只提供自己的行为来代替。但是你可以像这样包装它:

private class FlingBehaviourMultiplier(
    private val multiplier: Float,
    private val baseFlingBehavior: FlingBehavior
) : FlingBehavior {
    override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
        return with(baseFlingBehavior) {
            performFling(initialVelocity * multiplier)
        }
    }
}

@Composable
fun rememberFlingBehaviorMultiplier(
    multiplier: Float,
    baseFlingBehavior: FlingBehavior
): FlingBehavior = remember(multiplier, baseFlingBehavior) {
    FlingBehaviourMultiplier(multiplier, baseFlingBehavior)
}

用法:

val pagerState = rememberPagerState()
HorizontalPager(
    count = 10,
    state = pagerState,
    flingBehavior = rememberFlingBehaviorMultiplier(
        multiplier = 0.5f,
        baseFlingBehavior = PagerDefaults.flingBehavior(pagerState)
    ),
    modifier = Modifier
) { page ->
}

推荐阅读