首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在以编程方式滚动的“延迟列表”中无法解释的抓取行为

在以编程方式滚动的“延迟列表”中无法解释的抓取行为
EN

Stack Overflow用户
提问于 2022-08-28 19:35:10
回答 1查看 55关注 0票数 0

我在试图解决a case时偶然发现了这个问题。总之,病人需要完全控制卷轴的“速度”。现在,Android的默认设置使项目始终跟随用户的手指滚动,但显然,患者的一个未共享的条件/要求导致他们希望用户滚动得比实际滚动的项目更远。因此,我建议,正如David in his solution最初建议的那样,禁用用户对惰性列表的直接控制,并通过观察触摸检测回调中的事件来手动滚动它,比如pointerInput(...)修饰符提供的事件。因此,执行:

代码语言:javascript
复制
@Composable
fun LazyStack(sdd: Int = 1) { // Scroll-Distance-Divisor
    val lazyStackState = rememberLazyListState()
    val lazyStackScope = rememberCoroutineScope()
    LazyColumn(
        modifier = Modifier.pointerInput(Unit) {
            detectVerticalDragGestures { _, dragAmount ->
                lazyStackScope.launch {
                    lazyStackState.scrollBy(-dragAmount / sdd)
                }
            }
        },
        state = lazyStackState,
        userScrollEnabled = false
    ) {
        items((0..500).map { LoremIpsum(randomInt(5)) }) {
            Text(text = it.values.joinToString(" "))
        }
    }
}

现在,治疗确实起作用了,除了..。显然是微小的副作用。

你看,这个列表在大部分情况下都是完美的滚动。例如,如果我将sdd参数作为2传递,滚动距离将减少到其原始值的一半。但是,副作用是“抓拍”。

显然,当滚动在列表中时,在列表的两边都有某些“点”,当用户使用它们的输入指针(手指、鼠标或任何其他指针都在积极地“保存”列表)时,列表就会“抓取”。现在,这是一个点,如果你向任何一个方向交叉,列表就会被截取,而且很明显,每一次的值都是完全相同的。

上面的列表使用Lorem作为约定,但也许编号列表有助于诊断问题。

因此,症状概要如下:

列表中似乎有特定的“点”,在整个列表/屏幕中以不一致的间隔/位置出现,这往往会使列表在许多像素中迅速滚动。一旦被发现,这些穴位就会持续存在,除非重新组合,否则可以用来重新产生症状。当连续记录scrollBy方法返回的值时,"snap“的值显然不会返回为大量浮点数。这使得常规诊断技术无法追踪这一问题,这就是为什么我们,诊断人员在这里。

你有病史你有症状。让鉴别诊断开始。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-30 15:45:07

抓取行为是由于在可组合的范围内错误地使用randomInt(5)造成的。列表生成应该在视图模型中,然后在滚动过程中没有重新生成列表,并且一切都很完美。

而且,使用detectVerticalDragGestures并不像我最初提出的使用modfiier.scrollable(...)的建议那样顺利,但也许这是我想要的效果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73521674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档