Long Press — gestul de apăsare lungă, în care degetul este menținut pe ecran pentru o anumită perioadă de timp (de obicei 0,5–1 secundă) fără mișcare. Spre deosebire de Tap, Long Press este recunoscut nu în momentul atingerii, ci după expirarea timerului de întârziere. Gestul este folosit pentru a apela meniul contextual, previzualizarea, selectarea mai multor obiecte și activarea acțiunilor suplimentare. Este implementat pe iOS prin UILongPressGestureRecognizer, pe Android — prin setOnLongClickListener sau GestureDetector.
Principalele puncte
Long Press (apăsare lungă, atingere lungă) — un gest al interfeței multi-touch, în care utilizatorul atinge ecranul și menține degetul nemișcat pentru un timp specificat. Sistemul nu reacționează instantaneu: așteaptă un timeout (de obicei 500 ms) și doar după expirarea acestuia recunoaște gestul ca Long Press. Dacă degetul este eliberat mai devreme — gestul este interpretat ca o atingere obișnuită Tap.
Gestul este un bloc de construcție fundamental al interfețelor mobile moderne. Apple îl folosește pentru apelarea meniurilor contextuale în aplicații (Messages, Safari, Files). Google a implementat Long Press în sistemul de selectare a textului, mutarea pictogramelor pe ecranul de start și apelarea meniurilor contextuale în Android. În interfețele web, apăsarea lungă emulează adesea clicul dreapta al mouse-ului pe dispozitivele mobile care nu au un buton fizic dreapta.
Istoric, Long Press a apărut ca o alternativă la meniul contextual (clic dreapta) pentru ecranele tactile. Primele implementări întâlnite în dispozitive cu ecrane rezistive (Palm, Windows Mobile de la începutul anilor 2000), dar gestul s-a standardizat doar odată cu apariția iPhone și Android. Human Interface Guidelines ale ambelor platforme descriu Long Press ca o acțiune secundară — nu o înlocuire a Tap, ci o extindere a funcționalității.
Long Press și Tap — două gesturi diferite cu semantică diferită. Tap (atingerea) — este o apăsare instantanee: degetul atinge ecranul și este eliberat în 100–300 ms. Tap este întotdeauna acțiunea principală (primary action): deschiderea unei aplicații, apăsarea unui buton, navigarea la un link. Long Press — acțiunea secundară (secondary action): deschiderea meniului contextual, începerea editării, afișarea informațiilor suplimentare.
| Parametru | Tap | Long Press |
|---|---|---|
| Timp de menținere | 100–300 ms | 500–1000 ms |
| Tipul acțiunii | Principală (primary) | Secundară (secondary) |
| Exemple | Deschiderea linkului, apăsarea butonului | Meniul contextual, editarea |
| Feedback | Vizual (highlight) | Haptic (Haptic Feedback) |
| iOS API | UITapGestureRecognizer | UILongPressGestureRecognizer |
| Android API | setOnClickListener | setOnLongClickListener |
Regula cheie: nu folosiți niciodată Long Press ca unic mod de a executa o acțiune. Utilizatorii se așteaptă ca Tap să execute acțiunea principală, iar Long Press să deschidă opțiunile suplimentare. Încălcarea acestui principiu (de exemplu, cerința de apăsare lungă pentru a deschide un link) duce la o experiență negativă a utilizatorului și la reducerea accesibilității.
UILongPressGestureRecognizer — recunoscătorul standard de gesturi în iOS SDK pentru manipularea apăsării lungi. Acesta moștenește de la UIGestureRecognizer și suportă configurarea duratei minime, a deplasării permise a degetului și a numărului de atingeri. Recunoscătorul trece în starea UIGestureRecognizerStateBegan după expirarea timerului, apoi în UIGestureRecognizerStateChanged la mișcarea degetului și UIGestureRecognizerStateEnded la eliberare.
// UILongPressGestureRecognizer cu configurarea duratei minime
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Timpul minim de menținere: 0.5 secunde
longPressRecognizer.minimumPressDuration = 0.5
// Deplasarea permisă a degetului: 10 puncte
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Crearea meniului contextual
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Parametrii de configurare: minimumPressDuration — timpul în secunde până la declanșare (standard 0.5, pentru accesibilitate se recomandă 0.65+); allowableMovement — deplasarea maximă a degetului în puncte (standard 10, mărirea ajută în caz de tremur). iOS suportă numberOfTouchesRequired pentru gesturi multi-touch (de exemplu, apăsarea lungă cu două degete). Recunoscătorul se integrează și cu UIContextMenuInteraction — atunci când se adaugă un meniu contextual la UIView prin UIContextMenuConfiguration, Long Press apelează automat meniul contextual fără implementarea manuală a gestului.
setOnLongClickListener — metoda View din Android SDK care setează un ascultător pentru apăsarea lungă. Când utilizatorul menține View mai mult de 500 ms, sistemul apelează onLongClick(). Metoda returnează un boolean — true înseamnă că evenimentul a fost gestionat și nu trebuie transmis mai departe, false — evenimentul poate fi gestionat și de alți ascultători. Pentru o gestionare mai complexă (mișcarea degetului după începerea Long Press) se folosește GestureDetector cu OnGestureListener.
// Exemplu setOnLongClickListener cu feedback haptic
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Răspuns haptic pentru confirmarea începerii gestului
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Afișarea meniului contextual în poziția elementului
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Eveniment gestionat
}GestureDetector oferă un control mai fin asupra gestului. Spre deosebire de setOnLongClickListener, GestureDetector notifică despre începere (onLongPress), mișcare (onScroll) și eliberare. Acest lucru permite implementarea unor scenarii complexe — de exemplu, începerea tragerii după apăsarea lungă (Drag-and-Drop). OnGestureListener necesită implementarea a șase metode: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press este utilizat în zeci de scenarii ale interfețelor mobile. Cea mai frecventă utilizare este meniul contextual: apăsarea lungă pe un contact arată opțiunile de comunicare (apel, mesaj, email), pe un fișier — opțiunile (copiere, mutare, ștergere), pe text — selectarea și clipboard-ul. Android Launcher folosește apăsarea lungă pe o pictogramă pentru mutarea aplicațiilor și adăugarea widget-urilor.
Selectarea textului — un exemplu clasic de Long Press pe ambele platforme. În iOS, apăsarea lungă pe text activează lupa pentru poziționarea cursorului; pe un cuvânt — îl selectează cu marcatori. În Android, apăsarea lungă selectează întregul cuvânt și arată panoul de acțiuni (copiere, tăiere, lipire). Ambele platforme folosesc apoi tragerea marcatorilor pentru a extinde selecția.
Previzualizarea — în iOS, apăsarea lungă pe un link în Safari sau pe un mesaj în Mail deschide previzualizarea conținutului (peek). În Android, un comportament similar este implementat prin Long Press pe o notificare (extinde notificarea cu butoane de acțiune). Aplicațiile Foto folosesc apăsarea lungă pe o miniatură pentru previzualizarea rapidă a imaginii.
Drag-and-Drop este adesea inițiat de Long Press. Utilizatorul menține elementul, sistemul comută în modul de tragere, iar mișcarea degetului deplasează elementul pe ecran. Android suportă acest scenariu prin View.startDragAndDrop() după Long Press. iOS folosește UIDragInteraction, unde interacțiunea de tragere necesită apăsare lungă pentru a începe tragerea.
Human Interface Guidelines ale ambelor platforme oferă recomandări clare: Long Press trebuie să fie întotdeauna o acțiune secundară. Nu faceți niciodată apăsarea lungă unicul mod de a executa o funcție critică. Utilizatorii încearcă mai întâi Tap — dacă Tap nu funcționează așa cum se așteaptă, ei devin dezamăgiți. Adăugați indicii vizuale: meniurile contextuale pot fi indicate printr-o pictogramă cu trei puncte, iar elementele care suportă Long Press — printr-un indiciu vizual la atingere.
Feedback-ul haptic este obligatoriu pentru Long Press. Când gestul este recunoscut, dispozitivul trebuie să confirme acest lucru printr-un răspuns haptic: în iOS este UIImpactFeedbackGenerator cu un impuls ușor, în Android — HapticFeedbackConstants.LONG_PRESS. Fără feedback haptic, utilizatorul nu este sigur că gestul a funcționat și poate apăsa din nou, provocând acțiuni nedorite.
| Recomandare | iOS | Android |
|---|---|---|
| Timeout de recunoaștere | 0.5–0.65 secunde | 500 ms (implicit) |
| Feedback haptic | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Feedback vizual | Meniul contextual, evidențiere | PopupMenu, ripple animation |
| Accesibilitate (Accessibility) | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Deplasarea max. a degetului | allowableMovement = 10 pt | TouchSlop (standard ~8 dp) |
| Conflict cu derularea | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Accesibilitate: nu toți utilizatorii pot executa o apăsare lungă (persoane cu deficiențe motorii, utilizatori vârstnici). Oferiți întotdeauna o modalitate alternativă de acces la acțiunile Long Press — de exemplu, printr-un buton «Mai mult» în interfață sau prin funcțiile sistemice de accesibilitate (VoiceOver în iOS, TalkBack în Android). Pentru iOS, puteți adăuga Custom Actions în UIAccessibilityCustomAction, care sunt accesibile prin rotorul VoiceOver.
Întrebări frecvente
Timpul standard pentru Long Press este de 0,5 secunde (500 ms) pe ambele platforme. iOS permite configurarea minimumPressDuration de la 0.3 la 1.0 secunde. Android folosește un timeout fix de 500 ms pentru View.setOnLongClickListener. Pentru utilizatorii cu mobilitate redusă, se recomandă creșterea timeout-ului la 0,8–1,0 secunde.
Long Press este recunoscut după timpul de menținere (0,5 s), 3D Touch — după forța de apăsare (grame de presiune). 3D Touch este disponibil doar pe iPhone 6S–XR (tehnologia hardware Force Touch). începând cu iOS 13, Apple a înlocuit 3D Touch cu Haptic Touch — o imitație software care funcționează prin Long Press cu feedback haptic. Haptic Touch este disponibil pe toate iPhone și iPad moderne.
Conflictul Long Press și derularea este o problemă frecventă. Soluția: setați delaysTouchesBegan = true pentru recunoscătorul de gesturi în iOS (sistemul nu trimite touchesBegan imediat, ci așteaptă recunoașterea gestului). În Android, utilizați onInterceptTouchEvent care returnează false pentru Long Press. Dacă utilizatorul începe mișcarea degetului înainte de timeout — gestul este anulat în favoarea derulării.
Da, Long Press este suportat în aplicațiile web prin evenimentul touchstart/touchend cu măsurarea timpului. Browserele moderne suportă, de asemenea, evenimentul contextmenu, care se declanșează la apăsarea lungă pe dispozitivele mobile. Pentru compatibilitate cross-browser, utilizați biblioteci precum hammer.js sau implementați un recunoscător personalizat prin setInterval în handler-ul touchstart.
În iOS, feedback-ul haptic se adaugă prin UIImpactFeedbackGenerator. Apelați impactOccurred() în momentul trecerii UILongPressGestureRecognizer în starea began. Pentru un răspuns ușor, utilizați UIImpactFeedbackGenerator(style: .light). Pentru unul mai vizibil — .medium. Pentru meniurile contextuale, iOS adaugă automat feedback haptic prin UIContextMenuInteraction fără cod suplimentar.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și