Registers a gesture handler.
@Composable
fun OneHandedGestureButtonSample() {
var label by remember { mutableStateOf("Gesturable Button") }
val onClick = remember { { label = "Clicked/Gestured" } }
var gestureIndicatorVisible by remember { mutableStateOf(false) }
val interactionSource = remember { MutableInteractionSource() }
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Button(
onClick = onClick,
interactionSource = interactionSource,
modifier =
Modifier.oneHandedGesture(
action = GestureAction.Primary,
interactionSource = interactionSource,
onShowIndicator = { gestureIndicatorVisible = true },
onGesture = onClick,
),
) {
OneHandedGestureDefaults.GestureIndicator(
gestureIndicatorVisible,
{ gestureIndicatorVisible = false },
) {
Text(label)
}
}
}
}
OneHandedGestureHorizontalPagerSample
@Composable
fun OneHandedGestureHorizontalPagerSample() {
val pagerState = rememberPagerState(pageCount = { 10 })
var pageGestureIndicatorVisible by remember { mutableStateOf(false) }
HorizontalPagerScaffold(
pagerState = pagerState,
pageIndicator = {
OneHandedGestureDefaults.HorizontalPageGestureIndicator(
pagerState = pagerState,
gestureIndicatorVisible = pageGestureIndicatorVisible,
onGestureIndicatorFinished = { pageGestureIndicatorVisible = false },
)
},
) {
HorizontalPager(
state = pagerState,
modifier =
Modifier.oneHandedGesture(
action = GestureAction.Primary,
onShowIndicator = { pageGestureIndicatorVisible = true },
) {
OneHandedGestureDefaults.scrollToNextPage(pagerState)
},
) { page ->
AnimatedPage(pageIndex = page, pagerState = pagerState) {
ScreenScaffold {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
Text(text = "Page #$page")
Spacer(modifier = Modifier.height(8.dp))
Text(text = "Swipe left and right")
}
}
}
}
}
}
@Composable
fun OneHandedGestureTransformingLazyColumnSample() {
val backDispatcherOwner = LocalOnBackPressedDispatcherOwner.current
val onClick =
remember<() -> Unit> { { backDispatcherOwner?.onBackPressedDispatcher?.onBackPressed() } }
val tlcState = rememberTransformingLazyColumnState()
var scrollGestureIndicatorVisible by remember { mutableStateOf(false) }
val interactionSource = remember { MutableInteractionSource() }
ScreenScaffold(
scrollState = tlcState,
edgeButton = {
var buttonGestureIndicatorVisible by remember { mutableStateOf(false) }
EdgeButton(
onClick = onClick,
interactionSource = interactionSource,
modifier =
if (tlcState.canScrollForward) {
Modifier
} else {
// Apply the one-handed gesture modifier only when the container cannot
// scroll further, ensuring the EdgeButton is fully visible and interactive
Modifier.oneHandedGesture(
action = GestureAction.Primary,
priority = GesturePriority.Clickable,
interactionSource = interactionSource,
onShowIndicator = { buttonGestureIndicatorVisible = true },
onGesture = onClick,
)
} then
Modifier.scrollable(
tlcState,
orientation = Orientation.Vertical,
reverseDirection = true,
overscrollEffect = rememberOverscrollEffect(),
),
) {
OneHandedGestureDefaults.GestureIndicator(
buttonGestureIndicatorVisible,
{ buttonGestureIndicatorVisible = false },
) {
Text("Close")
}
}
},
scrollIndicator = {
OneHandedGestureDefaults.ScrollGestureIndicator(
scrollGestureIndicatorVisible,
onGestureIndicatorFinished = { scrollGestureIndicatorVisible = false },
tlcState,
modifier = Modifier.align(Alignment.CenterEnd),
)
},
) { contentPadding ->
TransformingLazyColumn(
state = tlcState,
contentPadding = contentPadding,
modifier =
Modifier.fillMaxSize()
.oneHandedGesture(
action = GestureAction.Primary,
priority = GesturePriority.Scrollable,
onGesture = { OneHandedGestureDefaults.scrollDown(tlcState) },
onShowIndicator = { scrollGestureIndicatorVisible = true },
),
) {
items(10) { Text("Item $it") }
}
}
}
OneHandedGestureVerticalPagerSample
@Composable
fun OneHandedGestureVerticalPagerSample() {
val pagerState = rememberPagerState(pageCount = { 10 })
var pageGestureIndicatorVisible by remember { mutableStateOf(false) }
VerticalPagerScaffold(
pagerState = pagerState,
pageIndicator = {
OneHandedGestureDefaults.VerticalPageGestureIndicator(
pagerState = pagerState,
gestureIndicatorVisible = pageGestureIndicatorVisible,
onGestureIndicatorFinished = { pageGestureIndicatorVisible = false },
)
},
) {
VerticalPager(
state = pagerState,
modifier =
Modifier.oneHandedGesture(
action = GestureAction.Primary,
onShowIndicator = { pageGestureIndicatorVisible = true },
) {
OneHandedGestureDefaults.scrollToNextPage(pagerState)
},
) { page ->
AnimatedPage(pageIndex = page, pagerState = pagerState) {
ScreenScaffold {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
Text(text = "Page #$page")
Spacer(modifier = Modifier.height(8.dp))
Text(text = "Swipe up and down")
}
}
}
}
}
}