Long Press es un gesto de pulsación larga en el que el dedo permanece en la pantalla durante un tiempo determinado (normalmente 0,5–1 segundo) sin moverse. A diferencia de Tap, Long Press no se reconoce en el momento del toque, sino después de que expire el temporizador de retardo. El gesto se utiliza para invocar un menú contextual, previsualizar contenido, seleccionar varios objetos y activar acciones adicionales. Se implementa en iOS mediante UILongPressGestureRecognizer, y en Android mediante setOnLongClickListener o GestureDetector.
Puntos clave
Long Press (pulsación larga, toque prolongado) es un gesto de interfaz multitáctil en el que el usuario toca la pantalla y mantiene el dedo inmóvil durante un tiempo determinado. El sistema no reacciona de inmediato: espera un tiempo de espera (normalmente 500 ms) y solo después de que expire lo reconoce como Long Press. Si el dedo se levanta antes, el gesto se interpreta como un Tap normal.
El gesto es un bloque de construcción fundamental de las interfaces móviles modernas. Apple lo utiliza para invocar menús contextuales en aplicaciones (Messages, Safari, Files). Google incorporó Long Press en la selección de texto, la reorganización de iconos en la pantalla de inicio y la invocación de menús contextuales en Android. En las interfaces web, la pulsación larga a menudo emula el clic derecho del ratón en dispositivos móviles, donde no hay un botón físico derecho.
Históricamente, Long Press surgió como una alternativa al menú contextual (clic derecho) para pantallas táctiles. Las primeras implementaciones aparecieron en dispositivos con pantallas resistivas (Palm, Windows Mobile a principios de los 2000), pero el gesto se estandarizó solo con la llegada del iPhone y Android. Las guías de interfaz humana de ambas plataformas describen Long Press como una acción secundaria — no un reemplazo de Tap, sino una extensión de la funcionalidad.
Long Press y Tap son dos gestos diferentes con semántica diferente. Tap es una pulsación instantánea: el dedo toca la pantalla y se levanta en 100–300 ms. Tap siempre es una acción principal: abrir una aplicación, presionar un botón, seguir un enlace. Long Press es una acción secundaria: abrir un menú contextual, empezar a editar, mostrar información adicional.
| Parámetro | Tap | Long Press |
|---|---|---|
| Tiempo de pulsación | 100–300 ms | 500–1000 ms |
| Tipo de acción | Principal (primary) | Secundaria (secondary) |
| Ejemplos | Abrir enlace, presionar botón | Menú contextual, edición |
| Retroalimentación | Visual (resaltado) | Táctil (Haptic Feedback) |
| API de iOS | UITapGestureRecognizer | UILongPressGestureRecognizer |
| API de Android | setOnClickListener | setOnLongClickListener |
Regla clave: nunca uses Long Press como la única forma de realizar una acción. Los usuarios esperan que Tap realice la acción principal y que Long Press abra opciones adicionales. Violar este principio (por ejemplo, requerir una pulsación larga para abrir un enlace) genera una experiencia de usuario negativa y reduce la accesibilidad.
UILongPressGestureRecognizer es el reconocedor de gestos estándar en el SDK de iOS para manejar la pulsación larga. Hereda de UIGestureRecognizer y admite la configuración de la duración mínima, el movimiento permitido del dedo y el número de toques. El reconocedor pasa al estado UIGestureRecognizerStateBegan después de que expire el temporizador, luego a UIGestureRecognizerStateChanged cuando el dedo se mueve, y UIGestureRecognizerStateEnded al levantar el dedo.
// UILongPressGestureRecognizer con configuración de duración mínima
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Tiempo mínimo de pulsación: 0.5 segundos
longPressRecognizer.minimumPressDuration = 0.5
// Movimiento permitido del dedo: 10 puntos
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Creación de un menú contextual
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Parámetros de configuración: minimumPressDuration — tiempo en segundos antes de la activación (por defecto 0.5, para accesibilidad se recomienda 0.65+); allowableMovement — movimiento máximo del dedo en puntos (por defecto 10, aumentarlo ayuda con manos temblorosas). iOS admite numberOfTouchesRequired para gestos multitáctiles (por ejemplo, pulsación larga con dos dedos). El reconocedor también se integra con UIContextMenuInteraction — cuando se agrega un menú contextual a una UIView mediante UIContextMenuConfiguration, Long Press invoca automáticamente el menú contextual sin implementación manual del gesto.
setOnLongClickListener es un método de View en el SDK de Android que establece un listener de pulsación larga. Cuando un usuario mantiene presionada una View durante más de 500 ms, el sistema llama a onLongClick(). El método devuelve un booleano — true significa que el evento fue manejado y no debe propagarse más, false significa que el evento puede ser manejado por otros listeners. Para un manejo más complejo (movimiento del dedo después de iniciar Long Press), se usa GestureDetector con OnGestureListener.
// Ejemplo de setOnLongClickListener con retroalimentación táctil
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Respuesta háptica para confirmar el inicio del gesto
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Mostrar menú contextual en la posición del elemento
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Evento manejado
}GestureDetector proporciona un control más preciso sobre el gesto. A diferencia de setOnLongClickListener, GestureDetector notifica sobre el inicio (onLongPress), el movimiento (onScroll) y la liberación. Esto permite escenarios complejos — por ejemplo, iniciar un arrastre después de una pulsación larga (Drag-and-Drop). OnGestureListener requiere implementar seis métodos: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press se utiliza en decenas de escenarios de interfaces móviles. La aplicación más común es el menú contextual: pulsación larga en un contacto muestra opciones de comunicación (llamar, mensaje, correo), en un archivo — opciones (copiar, mover, eliminar), en texto — selección y portapapeles. El lanzador de Android usa la pulsación larga en un icono para mover aplicaciones y agregar widgets.
Selección de texto es un ejemplo clásico de Long Press en ambas plataformas. En iOS, pulsar prolongadamente sobre texto activa una lupa para posicionar el cursor; sobre una palabra — la selecciona con marcadores. En Android, la pulsación larga selecciona la palabra completa y muestra una barra de acciones (copiar, cortar, pegar). Ambas plataformas usan el arrastre posterior de los marcadores para expandir la selección.
Vista previa — en iOS, pulsar prolongadamente un enlace en Safari o un mensaje en Mail abre una vista previa del contenido (peek). En Android, un comportamiento similar se implementa mediante Long Press en una notificación (expande la notificación con botones de acción). Las aplicaciones de fotos usan la pulsación larga en una miniatura para una vista previa rápida de la imagen.
Drag-and-Drop a menudo se inicia con Long Press. El usuario mantiene presionado el elemento, el sistema cambia al modo de arrastre y el movimiento del dedo desplaza el elemento por la pantalla. Android admite este escenario mediante View.startDragAndDrop() después de Long Press. iOS usa UIDragInteraction, donde la interacción de arrastre requiere una pulsación larga para comenzar.
Las guías de interfaz humana de ambas plataformas ofrecen recomendaciones claras: Long Press siempre debe ser una acción secundaria. Nunca hagas de la pulsación larga la única forma de realizar una función crítica. Los usuarios primero prueban Tap — si Tap no funciona como esperan, se frustran. Añade indicaciones visuales: los menús contextuales pueden indicarse con un icono de tres puntos, y los elementos que admiten Long Press, con una pista visual al tocar.
La retroalimentación táctil es obligatoria para Long Press. Cuando se reconoce el gesto, el dispositivo debe confirmarlo con una respuesta háptica: en iOS es UIImpactFeedbackGenerator con un impulso ligero, en Android — HapticFeedbackConstants.LONG_PRESS. Sin retroalimentación háptica, el usuario no está seguro de que el gesto se haya registrado y puede presionar de nuevo, causando acciones no deseadas.
| Recomendación | iOS | Android |
|---|---|---|
| Tiempo de espera de reconocimiento | 0.5–0.65 segundos | 500 ms (por defecto) |
| Retroalimentación táctil | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Retroalimentación visual | Menú contextual, resaltado | PopupMenu, animación ripple |
| Accesibilidad | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Movimiento máximo del dedo | allowableMovement = 10 pt | TouchSlop (~8 dp por defecto) |
| Conflicto con scroll | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Accesibilidad: no todos los usuarios pueden realizar una pulsación larga (personas con problemas motores, usuarios mayores). Proporciona siempre una forma alternativa de acceder a las acciones de Long Press — por ejemplo, mediante un botón "Más" en la interfaz o mediante funciones de accesibilidad del sistema (VoiceOver en iOS, TalkBack en Android). Para iOS, puedes añadir Custom Actions mediante UIAccessibilityCustomAction, que están disponibles a través del rotor de VoiceOver.
Preguntas frecuentes
El tiempo estándar para Long Press es de 0,5 segundos (500 ms) en ambas plataformas. iOS permite configurar minimumPressDuration de 0.3 a 1.0 segundos. Android usa un tiempo de espera fijo de 500 ms para View.setOnLongClickListener. Para usuarios con habilidades motoras limitadas, se recomienda aumentar el tiempo de espera a 0,8–1,0 segundos.
Long Press se reconoce por el tiempo de pulsación (0,5 s), 3D Touch — por la fuerza de presión (gramos de fuerza). 3D Touch solo está disponible en iPhone 6S–XR (tecnología Force Touch por hardware). A partir de iOS 13, Apple reemplazó 3D Touch por Haptic Touch — una simulación por software que funciona mediante Long Press con retroalimentación táctil. Haptic Touch está disponible en todos los iPhone y iPad modernos.
El conflicto entre Long Press y el scroll es un problema común. Solución: establece delaysTouchesBegan = true para el reconocedor de gestos en iOS (el sistema no envía touchesBegan inmediatamente, sino que espera el reconocimiento del gesto). En Android, usa onInterceptTouchEvent devolviendo false para Long Press. Si el usuario comienza a mover el dedo antes del tiempo de espera, el gesto se cancela a favor del scroll.
Sí, Long Press es compatible con aplicaciones web mediante el evento touchstart/touchend con medición de tiempo. Los navegadores modernos también admiten el evento contextmenu, que se activa con pulsación larga en dispositivos móviles. Para compatibilidad entre navegadores, usa bibliotecas como hammer.js o implementa un reconocedor personalizado mediante setInterval en el manejador de touchstart.
En iOS, la retroalimentación táctil se agrega mediante UIImpactFeedbackGenerator. Llama a impactOccurred() cuando UILongPressGestureRecognizer transicione al estado began. Para una respuesta ligera, usa UIImpactFeedbackGenerator(style: .light). Para una más notable — .medium. Para menús contextuales, iOS agrega automáticamente retroalimentación táctil mediante UIContextMenuInteraction sin código adicional.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también