Long Press est un geste d'appui long où le doigt reste sur l'écran pendant un certain temps (généralement 0,5 à 1 seconde) sans bouger. Contrairement à Tap, Long Press n'est pas reconnu au moment du toucher, mais après l'expiration du délai. Le geste est utilisé pour invoquer un menu contextuel, prévisualiser le contenu, sélectionner plusieurs objets et activer des actions supplémentaires. Il est implémenté sur iOS via UILongPressGestureRecognizer, et sur Android via setOnLongClickListener ou GestureDetector.
Points clés
Long Press (appui long, toucher prolongé) est un geste d'interface multi-touch où l'utilisateur touche l'écran et maintient le doigt immobile pendant une durée déterminée. Le système ne réagit pas instantanément : il attend un délai d'inactivité (généralement 500 ms) et ne reconnaît le geste comme Long Press qu'après son expiration. Si le doigt est levé plus tôt, le geste est interprété comme un Tap normal.
Le geste est un élément fondamental des interfaces mobiles modernes. Apple l'utilise pour invoquer des menus contextuels dans les applications (Messages, Safari, Files). Google a intégré Long Press dans la sélection de texte, la réorganisation des icônes sur l'écran d'accueil et l'invocation de menus contextuels dans Android. Dans les interfaces web, l'appui long émule souvent le clic droit de la souris sur les appareils mobiles, où il n'y a pas de bouton droit physique.
Historiquement, Long Press est apparu comme une alternative au menu contextuel (clic droit) pour les écrans tactiles. Les premières implémentations sont apparues sur des appareils à écrans résistifs (Palm, Windows Mobile au début des années 2000), mais le geste ne s'est standardisé qu'avec l'avènement de l'iPhone et d'Android. Les guides d'interface humaine des deux plateformes décrivent Long Press comme une action secondaire — pas un remplacement de Tap, mais une extension de fonctionnalité.
Long Press et Tap sont deux gestes différents avec des sémantiques différentes. Tap est un toucher instantané : le doigt touche l'écran et se lève en 100 à 300 ms. Tap est toujours une action principale : ouvrir une application, appuyer sur un bouton, suivre un lien. Long Press est une action secondaire : ouvrir un menu contextuel, commencer l'édition, afficher des informations supplémentaires.
| Paramètre | Tap | Long Press |
|---|---|---|
| Temps de maintien | 100–300 ms | 500–1000 ms |
| Type d'action | Principale (primary) | Secondaire (secondary) |
| Exemples | Ouvrir un lien, appuyer sur un bouton | Menu contextuel, édition |
| Retour | Visuel (surlignage) | Tactile (Haptic Feedback) |
| API iOS | UITapGestureRecognizer | UILongPressGestureRecognizer |
| API Android | setOnClickListener | setOnLongClickListener |
Règle clé : n'utilisez jamais Long Press comme seul moyen d'effectuer une action. Les utilisateurs s'attendent à ce que Tap effectue l'action principale et que Long Press ouvre des options supplémentaires. Violer ce principe (par exemple, exiger un appui long pour ouvrir un lien) conduit à une expérience utilisateur négative et réduit l'accessibilité.
UILongPressGestureRecognizer est le reconnaisseur de gestes standard du SDK iOS pour gérer l'appui long. Il hérite de UIGestureRecognizer et prend en charge la configuration de la durée minimale, du mouvement autorisé du doigt et du nombre de touches. Le reconnaisseur passe à l'état UIGestureRecognizerStateBegan après l'expiration du délai, puis à UIGestureRecognizerStateChanged lorsque le doigt bouge et UIGestureRecognizerStateEnded au relâchement.
// UILongPressGestureRecognizer avec configuration de durée minimale
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Temps de maintien minimal : 0,5 seconde
longPressRecognizer.minimumPressDuration = 0.5
// Mouvement autorisé du doigt : 10 points
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Création d'un menu contextuel
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Paramètres de configuration : minimumPressDuration — temps en secondes avant l'activation (par défaut 0,5, pour l'accessibilité 0,65+ recommandé) ; allowableMovement — mouvement maximum du doigt en points (par défaut 10, l'augmentation aide en cas de tremblements). iOS prend en charge numberOfTouchesRequired pour les gestes multi-touch (par exemple, appui long à deux doigts). Le reconnaisseur s'intègre également avec UIContextMenuInteraction — lorsqu'un menu contextuel est ajouté à une UIView via UIContextMenuConfiguration, Long Press invoque automatiquement le menu contextuel sans implémentation manuelle du geste.
setOnLongClickListener est une méthode View du SDK Android qui définit un écouteur d'appui long. Lorsqu'un utilisateur maintient une View pendant plus de 500 ms, le système appelle onLongClick(). La méthode retourne un booléen — true signifie que l'événement a été traité et ne doit pas se propager davantage, false signifie que l'événement peut être traité par d'autres écouteurs. Pour un traitement plus complexe (mouvement du doigt après le début de Long Press), on utilise GestureDetector avec OnGestureListener.
// Exemple de setOnLongClickListener avec retour haptique
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Réponse haptique pour confirmer le début du geste
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Affichage du menu contextuel à la position de l'élément
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Événement traité
}GestureDetector offre un contrôle plus fin sur le geste. Contrairement à setOnLongClickListener, GestureDetector notifie du début (onLongPress), du mouvement (onScroll) et du relâchement. Cela permet des scénarios complexes — par exemple, lancer un glisser après un appui long (Drag-and-Drop). OnGestureListener nécessite l'implémentation de six méthodes : onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press est utilisé dans des dizaines de scénarios d'interfaces mobiles. L'application la plus courante est le menu contextuel : l'appui long sur un contact affiche les options de communication (appel, message, email), sur un fichier — les options (copier, déplacer, supprimer), sur du texte — la sélection et le presse-papiers. Le lanceur Android utilise l'appui long sur une icône pour déplacer les applications et ajouter des widgets.
Sélection de texte est un exemple classique de Long Press sur les deux plateformes. Sur iOS, l'appui long sur du texte active une loupe pour positionner le curseur ; sur un mot — le sélectionne avec des marqueurs. Sur Android, l'appui long sélectionne le mot entier et affiche une barre d'actions (copier, couper, coller). Les deux plateformes utilisent le glissement ultérieur des marqueurs pour étendre la sélection.
Aperçu — sur iOS, l'appui long sur un lien dans Safari ou un message dans Mail ouvre un aperçu du contenu (peek). Sur Android, un comportement similaire est implémenté via Long Press sur une notification (développe la notification avec des boutons d'action). Les applications Photos utilisent l'appui long sur une vignette pour un aperçu rapide de l'image.
Glisser-déposer est souvent initié par Long Press. L'utilisateur maintient l'élément, le système passe en mode glisser, et le mouvement du doigt déplace l'élément sur l'écran. Android prend en charge ce scénario via View.startDragAndDrop() après Long Press. iOS utilise UIDragInteraction, où l'interaction de glissement nécessite un appui long pour commencer le glisser.
Les guides d'interface humaine des deux plateformes fournissent des recommandations claires : Long Press doit toujours être une action secondaire. Ne faites jamais de l'appui long le seul moyen d'effectuer une fonction critique. Les utilisateurs essaient d'abord Tap — si Tap ne fonctionne pas comme prévu, ils sont frustrés. Ajoutez des indices visuels : les menus contextuels peuvent être indiqués par une icône à trois points, et les éléments prenant en charge Long Press — par un indice visuel au toucher.
Le retour haptique est obligatoire pour Long Press. Lorsque le geste est reconnu, l'appareil doit le confirmer par une réponse haptique : sur iOS c'est UIImpactFeedbackGenerator avec une impulsion légère, sur Android — HapticFeedbackConstants.LONG_PRESS. Sans retour haptique, l'utilisateur n'est pas sûr que le geste a été enregistré et peut appuyer à nouveau, provoquant des actions indésirables.
| Recommandation | iOS | Android |
|---|---|---|
| Délai de reconnaissance | 0,5–0,65 seconde | 500 ms (par défaut) |
| Retour haptique | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Retour visuel | Menu contextuel, surlignage | PopupMenu, animation ripple |
| Accessibilité | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Mouvement max. du doigt | allowableMovement = 10 pt | TouchSlop (~8 dp par défaut) |
| Conflit avec le défilement | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Accessibilité : tous les utilisateurs ne peuvent pas effectuer un appui long (personnes avec des troubles moteurs, utilisateurs âgés). Fournissez toujours un moyen alternatif d'accéder aux actions Long Press — par exemple, via un bouton "Plus" dans l'interface ou via les fonctionnalités d'accessibilité du système (VoiceOver sur iOS, TalkBack sur Android). Pour iOS, vous pouvez ajouter des actions personnalisées via UIAccessibilityCustomAction, disponibles via le rotor VoiceOver.
Questions fréquentes
Le temps standard pour Long Press est de 0,5 seconde (500 ms) sur les deux plateformes. iOS permet de configurer minimumPressDuration de 0,3 à 1,0 seconde. Android utilise un délai fixe de 500 ms pour View.setOnLongClickListener. Pour les utilisateurs à mobilité réduite, il est recommandé d'augmenter le délai à 0,8–1,0 seconde.
Long Press est reconnu par le temps de maintien (0,5 s), 3D Touch — par la force de pression (grammes de force). 3D Touch n'est disponible que sur iPhone 6S–XR (technologie matérielle Force Touch). Depuis iOS 13, Apple a remplacé 3D Touch par Haptic Touch — une simulation logicielle fonctionnant via Long Press avec retour haptique. Haptic Touch est disponible sur tous les iPhones et iPads modernes.
Le conflit entre Long Press et le défilement est un problème courant. Solution : définissez delaysTouchesBegan = true pour le reconnaisseur de gestes sur iOS (le système n'envoie pas touchesBegan immédiatement, mais attend la reconnaissance du geste). Sur Android, utilisez onInterceptTouchEvent retournant false pour Long Press. Si l'utilisateur commence à bouger le doigt avant le délai, le geste est annulé en faveur du défilement.
Oui, Long Press est pris en charge dans les applications web via l'événement touchstart/touchend avec mesure du temps. Les navigateurs modernes prennent également en charge l'événement contextmenu, qui se déclenche lors d'un appui long sur les appareils mobiles. Pour la compatibilité entre navigateurs, utilisez des bibliothèques comme hammer.js ou implémentez un reconnaisseur personnalisé via setInterval dans le gestionnaire touchstart.
Sur iOS, le retour haptique est ajouté via UIImpactFeedbackGenerator. Appelez impactOccurred() au moment du passage de UILongPressGestureRecognizer à l'état began. Pour une réponse légère, utilisez UIImpactFeedbackGenerator(style: .light). Pour une réponse plus marquée — .medium. Pour les menus contextuels, iOS ajoute automatiquement un retour haptique via UIContextMenuInteraction sans code supplémentaire.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi