---
title: "OneHandedGestureScrollIndicator"
description: "A scroll indicator that transitions to indicate that a scroll gesture is available to the user."
type: "component"
lastmod: "2026-05-20T01:13:55.446679Z"
---
## API Reference

### OneHandedGestureScrollIndicator

> Source set: Android

```kotlin
@Composable
public fun OneHandedGestureScrollIndicator(
    gestureIndicatorVisible: Boolean,
    onGestureIndicatorFinished: () -> Unit,
    state: TransformingLazyColumnState,
    modifier: Modifier = Modifier,
    scrollIndicatorColors: ScrollIndicatorColors = ScrollIndicatorDefaults.colors(),
    gestureIndicatorTint: Color = MaterialTheme.colorScheme.onTertiary,
    gestureIndicatorBackgroundColor: Color = MaterialTheme.colorScheme.tertiary,
    reverseDirection: Boolean = false,
    positionAnimationSpec: AnimationSpec<Float> = ScrollIndicatorDefaults.PositionAnimationSpec,
)
```

#### Parameters

| | |
| --- | --- |
| gestureIndicatorVisible | A boolean flag that triggers the gesture indicator animation. While true, the standard scroll indicator is transformed into the gesture indicator. |
| onGestureIndicatorFinished | A lambda function to be called when the gesture indicator animation sequence finishes. Implementation of this lambda must reset `gestureIndicatorVisible` to false in order to restore the original content. |
| state | The state object of the [androidx.wear.compose.foundation.lazy.TransformingLazyColumn](/jetpack-compose/androidx.wear.compose/compose-foundation/composable-functions/TransformingLazyColumn) this indicator is coupled with. |
| modifier | The [Modifier](/jetpack-compose/androidx.compose.ui/ui/interfaces/Modifier) to be applied to the scroll indicator. |
| scrollIndicatorColors | [ScrollIndicatorColors](/jetpack-compose/androidx.wear.compose/compose-material3/classes/ScrollIndicatorColors) that will be used to resolve the indicator and track colors for this [androidx.wear.compose.material3.ScrollIndicator](/jetpack-compose/androidx.wear.compose/compose-material3/components/ScrollIndicator). |
| gestureIndicatorTint | The color which will be used for a tint of the gesture animation icon. |
| gestureIndicatorBackgroundColor | The color which will be used for a background behind the gesture animation. |
| reverseDirection | Reverses direction of ScrollIndicator if true. |
| positionAnimationSpec | [AnimationSpec](/jetpack-compose/androidx.compose.animation/animation-core/interfaces/AnimationSpec) for position animation. The Position animation is used for animating changes to the scroll size and position. To disable this animation [androidx.compose.animation.core.snap](/jetpack-compose/androidx.compose.animation/animation-core/functions/snap) AnimationSpec should be passed instead. |

## Code Examples
### OneHandedGestureTransformingLazyColumnSample
```kotlin
@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(),
                        ),
            ) {
                OneHandedGestureIndicator(
                    buttonGestureIndicatorVisible,
                    { buttonGestureIndicatorVisible = false },
                ) {
                    Text("Close")
                }
            }
        },
        scrollIndicator = {
            OneHandedGestureScrollIndicator(
                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") }
        }
    }
}
```
