HorizontalPager是Accompanist库中的一个组件,它具有交互式滑动的功能。在某些情况下,我们可能需要在父组件中阻止水平Pager滑动,以便用户可以与子组件进行交互。以下是一种解决方案,可以实现这一目标:
首先,我们需要在外层Pager上监听手势,以便我们可以禁用水平滑动。创建一个名为“HorizontalPagerWithDisabledSwipes”的组件来实现这一点。接下来,我们可以将内层的Pager包含在这个“HorizontalPagerWithDisabledSwipes”组件中。
import androidx.compose.foundation.gestures.scrollable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.google.accompanist.pager.*
import kotlin.math.roundToInt
@Composable
fun HorizontalPagerWithDisabledSwipes(
modifier: Modifier = Modifier,
state: PagerState = rememberPagerState(),
swipeEnabled: Boolean = true,
verticalSwipeEnabled: Boolean = true,
content: @Composable PagerScope.() -> Unit
) {
var horizontalDragActive by remember { mutableStateOf(false) }
Box(
modifier = modifier
.scrollable(
orientation = Orientation.Horizontal,
state = state,
enabled = swipeEnabled && !horizontalDragActive,
reverseDirection = true,
onScrollStarted = {
horizontalDragActive = true
},
onScrollStopped = {
horizontalDragActive = false
}
)
) {
val density = LocalDensity.current.density
val dragDeltaThreshold = 3.dp.toPx(density)
Box(
modifier = Modifier
.fillMaxSize()
.scrollable(
orientation = Orientation.Vertical,
enabled = verticalSwipeEnabled,
/* We need to conditionally consume the vertical scroll
if a horizontal drag/swipe has just completed, and if the distance
is less than the threshold */
onScroll = { _, delta ->
val deltaDp = with(LocalDensity.current) {
delta.y.toDp()
}
// Only consume the scroll delta if it is:
if (
// 1. A horizontal drag/swipe has just completed, and
horizontalDragActive &&
// 2. Delta is mostly vertical
上一篇:Accompanist库中是否有launchPermission的回调函数?
下一篇:AccompanistPageranimateScrollToPagedoesn'tscrolltonextpagecorrectly