Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
El modificador draggable es el punto de entrada de alto nivel para arrastrar gestos en una sola orientación e informa la distancia de arrastre en píxeles.
Es importante tener en cuenta que este modificador es similar a scrollable, ya que solo detecta el gesto. Debes conservar el estado y representarlo en la pantalla, por ejemplo, para mover el elemento mediante el modificador offset:
El modificador swipeable te permite arrastrar elementos que, cuando se lanzan, se suelen animar en dos o más puntos de anclaje definidos en una orientación. Un uso común es implementar un patrón de "deslizar para descartar".
Es importante tener en cuenta que este modificador no mueve el elemento; solo detecta el gesto. Debes conservar el estado y representarlo en la pantalla, por ejemplo, para mover el elemento mediante el modificador offset.
El estado deslizable es obligatorio en el modificador swipeable y se puede crear y recordar con rememberSwipeableState().
Este estado también proporciona un conjunto de métodos útiles para animar anclajes de manera programática (consulta snapTo, animateTo, performFling y performDrag), así como en las propiedades para observar el progreso de arrastre.
El gesto de deslizar se puede configurar para que tenga diferentes tipos de umbrales, como FixedThreshold(Dp) y FractionalThreshold(Float), y pueden ser diferentes para cada punto de anclaje de combinación "from-to".
Para obtener más flexibilidad, puedes configurar resistance cuando deslices los límites y también el velocityThreshold que animará el deslizamiento al siguiente estado, incluso si no se alcanza el thresholds posicional.
@OptIn(ExperimentalMaterialApi::class)@ComposableprivatefunSwipeableSample(){valwidth=96.dpvalsquareSize=48.dpvalswipeableState=rememberSwipeableState(0)valsizePx=with(LocalDensity.current){squareSize.toPx()}valanchors=mapOf(0fto0,sizePxto1)// Maps anchor points (in px) to statesBox(modifier=Modifier.width(width).swipeable(state=swipeableState,anchors=anchors,thresholds={_,_->FractionalThreshold(0.3f)},orientation=Orientation.Horizontal).background(Color.LightGray)){Box(Modifier.offset{IntOffset(swipeableState.offset.value.roundToInt(),0)}.size(squareSize).background(Color.DarkGray))}}
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-08-25 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-08-25 (UTC)"],[],[],null,["# Drag, swipe, and fling\n\nThe\n[`draggable`](/reference/kotlin/androidx/compose/foundation/gestures/package-summary#(androidx.compose.ui.Modifier).draggable(androidx.compose.foundation.gestures.DraggableState,androidx.compose.foundation.gestures.Orientation,kotlin.Boolean,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.Boolean,kotlin.coroutines.SuspendFunction2,kotlin.coroutines.SuspendFunction2,kotlin.Boolean))\nmodifier is the high-level entry point to drag gestures in a single orientation,\nand reports the drag distance in pixels.\n\nIt's important to note that this modifier is similar to `scrollable`, in that it\nonly detects the gesture. You need to hold the state and represent it on screen\nby, for example, moving the element via the\n[`offset`](/reference/kotlin/androidx/compose/foundation/layout/package-summary#(androidx.compose.ui.Modifier).offset(androidx.compose.ui.unit.Dp,%20androidx.compose.ui.unit.Dp))\nmodifier:\n\n\n```kotlin\n@Composable\nprivate fun DraggableText() {\n var offsetX by remember { mutableStateOf(0f) }\n Text(\n modifier = Modifier\n .offset { IntOffset(offsetX.roundToInt(), 0) }\n .draggable(\n orientation = Orientation.Horizontal,\n state = rememberDraggableState { delta -\u003e\n offsetX += delta\n }\n ),\n text = \"Drag me!\"\n )\n}https://github.com/android/snippets/blob/dd30aee903e8c247786c064faab1a9ca8d10b46e/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/gestures/GesturesSnippets.kt#L250-L264\n```\n\n\u003cbr /\u003e\n\nIf you need to control the whole dragging gesture, consider using the drag\ngesture detector instead, via the\n[`pointerInput`](/reference/kotlin/androidx/compose/ui/input/pointer/package-summary#(androidx.compose.ui.Modifier).pointerInput(kotlin.Any,kotlin.coroutines.SuspendFunction1))\nmodifier.\n\n\n```kotlin\n@Composable\nprivate fun DraggableTextLowLevel() {\n Box(modifier = Modifier.fillMaxSize()) {\n var offsetX by remember { mutableStateOf(0f) }\n var offsetY by remember { mutableStateOf(0f) }\n\n Box(\n Modifier\n .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }\n .background(Color.Blue)\n .size(50.dp)\n .pointerInput(Unit) {\n detectDragGestures { change, dragAmount -\u003e\n change.consume()\n offsetX += dragAmount.x\n offsetY += dragAmount.y\n }\n }\n )\n }\n}https://github.com/android/snippets/blob/dd30aee903e8c247786c064faab1a9ca8d10b46e/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/gestures/GesturesSnippets.kt#L268-L288\n```\n\n\u003cbr /\u003e\n\nSwiping\n-------\n\nThe\n[`swipeable`](/reference/kotlin/androidx/compose/material/package-summary#(androidx.compose.ui.Modifier).swipeable(androidx.compose.material.SwipeableState,kotlin.collections.Map,androidx.compose.foundation.gestures.Orientation,kotlin.Boolean,kotlin.Boolean,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.Function2,androidx.compose.material.ResistanceConfig,androidx.compose.ui.unit.Dp))\nmodifier lets you drag elements which, when released, animate towards typically\ntwo or more anchor points defined in an orientation. A common usage for this is\nto implement a 'swipe-to-dismiss' pattern.\n| **Caution:** The [`swipeable`](/reference/kotlin/androidx/compose/material/package-summary#(androidx.compose.ui.Modifier).swipeable(androidx.compose.material.SwipeableState,kotlin.collections.Map,androidx.compose.foundation.gestures.Orientation,kotlin.Boolean,kotlin.Boolean,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.Function2,androidx.compose.material.ResistanceConfig,androidx.compose.ui.unit.Dp)) APIs have been replaced by Foundation's [`anchoredDraggable`](/reference/kotlin/androidx/compose/foundation/gestures/package-summary#(androidx.compose.ui.Modifier).anchoredDraggable(androidx.compose.foundation.gestures.AnchoredDraggableState,androidx.compose.foundation.gestures.Orientation,kotlin.Boolean,kotlin.Boolean,androidx.compose.foundation.interaction.MutableInteractionSource)) APIs in Jetpack Compose 1.6.0-alpha01.\n\nIt's important to note that this modifier does not move the element, it only\ndetects the gesture. You need to hold the state and represent it on screen by,\nfor example, moving the element via the\n[`offset`](/reference/kotlin/androidx/compose/foundation/layout/package-summary#(androidx.compose.ui.Modifier).offset(androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp))\nmodifier.\n\nThe swipeable state is required in the `swipeable` modifier, and can be created\nand remembered with\n[`rememberSwipeableState()`](/reference/kotlin/androidx/compose/material/package-summary#rememberSwipeableState(kotlin.Any,androidx.compose.animation.core.AnimationSpec,kotlin.Function1)).\nThis state also provides a set of useful methods to programmatically animate to\nanchors (see\n[`snapTo`](/reference/kotlin/androidx/compose/material/SwipeableState#snapTo(kotlin.Any)),\n[`animateTo`](/reference/kotlin/androidx/compose/material/SwipeableState#animateTo(kotlin.Any,androidx.compose.animation.core.AnimationSpec)),\n[`performFling`](/reference/kotlin/androidx/compose/material/SwipeableState#performFling(kotlin.Float)),\nand\n[`performDrag`](/reference/kotlin/androidx/compose/material/SwipeableState#performDrag(kotlin.Float)))\nas well as properties to observe the dragging progress.\n\nThe swipe gesture can be configured to have different threshold types, such as\n[`FixedThreshold(Dp)`](/reference/kotlin/androidx/compose/material/FixedThreshold#FixedThreshold(androidx.compose.ui.unit.Dp))\nand\n[`FractionalThreshold(Float)`](/reference/kotlin/androidx/compose/material/FractionalThreshold#FractionalThreshold(kotlin.Float)),\nand they can be different for each anchor point from-to combination.\n\nFor more flexibility, you can configure the `resistance` when swiping past the\nbounds and, also, the `velocityThreshold` which will animate a swipe to the\nnext state, even if the positional `thresholds`have not been reached.\n\n\n```kotlin\n@OptIn(ExperimentalMaterialApi::class)\n@Composable\nprivate fun SwipeableSample() {\n val width = 96.dp\n val squareSize = 48.dp\n\n val swipeableState = rememberSwipeableState(0)\n val sizePx = with(LocalDensity.current) { squareSize.toPx() }\n val anchors = mapOf(0f to 0, sizePx to 1) // Maps anchor points (in px) to states\n\n Box(\n modifier = Modifier\n .width(width)\n .swipeable(\n state = swipeableState,\n anchors = anchors,\n thresholds = { _, _ -\u003e FractionalThreshold(0.3f) },\n orientation = Orientation.Horizontal\n )\n .background(Color.LightGray)\n ) {\n Box(\n Modifier\n .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }\n .size(squareSize)\n .background(Color.DarkGray)\n )\n }\n}https://github.com/android/snippets/blob/dd30aee903e8c247786c064faab1a9ca8d10b46e/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/gestures/GesturesSnippets.kt#L292-L320\n```\n\n\u003cbr /\u003e\n\nRecommended for you\n-------------------\n\n- Note: link text is displayed when JavaScript is off\n- [Understand gestures](/develop/ui/compose/touch-input/pointer-input/understand-gestures)\n- [Advanced animation example: Gestures {:#gesture-and-animation}](/develop/ui/compose/animation/advanced)\n- [Value-based animations](/develop/ui/compose/animation/value-based)"]]