繁体   English   中英

如何对用户在 Accompanist Pager 上滚动做出反应?

[英]How to react to to user scrolling on Accompanist Pager?

Accompanist Pager 文档建议对页面更改做出如下反应:

val pagerState = rememberPagerState()

LaunchedEffect(pagerState) {
    // Collect from the pager state a snapshotFlow reading the currentPage
    snapshotFlow { pagerState.currentPage }.collect { page ->
        AnalyticsService.sendPageSelectedEvent(page)
    }
}

VerticalPager(
    count = 10,
    state = pagerState,
) { page ->
    Text(text = "Page: $page")
}

我们如何区分滚动到页面和用户手势,以及使用animateScrollingToPage() / scrollingToPage()滚动到页面? 我只想在用户滚动时执行某个操作,而不是在程序滚动上执行。

你试过了吗:

val isScrollInProgressFlow = snapshotFlow { pagerState.isScrollInProgress }

我有一个类似的问题,我使用interactionsSource解决了它。 发生自动滚动时不会发出任何交互。 但它会发出对用户操作的交互。

您还可以使用其他交互源类型。

LaunchedEffect(Unit) {
    pagerState.interactionSource.interactions
        .collect {
            if (it is DragInteraction.Start) {
                Log.d("test", "User interaction is started")
            }
        }
}

在我的例子中,我不得不取消用户拖动时的自动滚动。 简化版本如下所示:

LaunchedEffect(Unit) {

    val autoscrollJob = launch {
        while(true) {
            yield() // exit the coroutine if the job is completed
            delay(autoScrollDelay)
            animateScrollToPage(
                page = (currentPage + 1) % pageCount
            )
        }
    }

    launch {
        interactionSource.interactions
            .collect {
                if (it is DragInteraction.Start) {
                    autoscrollJob.cancel()
                }
            }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM