Long Press — gest długiego naciśnięcia, w którym palec jest przytrzymywany na ekranie przez określony czas (zwykle 0,5–1 sekundy) bez przesuwania. W przeciwieństwie do Tap, Long Press jest rozpoznawany nie w momencie dotknięcia, ale po upływie timera opóźnienia. Gest służy do wywoływania menu kontekstowego, podglądu, zaznaczania wielu obiektów i aktywowania dodatkowych działań. Jest implementowany w iOS przez UILongPressGestureRecognizer, w Android — przez setOnLongClickListener lub GestureDetector.
Najważniejsze
Long Press (długie naciśnięcie, długi dotyk) — gest interfejsu multitouch, w którym użytkownik dotyka ekranu i przytrzymuje palec nieruchomo przez określony czas. System nie reaguje natychmiast: czeka na timeout (zwykle 500 ms) i dopiero po jego upływie rozpoznaje gest jako Long Press. Jeśli palec zostanie puszczony wcześniej — gest jest interpretowany jako zwykłe naciśnięcie Tap.
Gest jest fundamentalnym blokiem budulcowym nowoczesnych interfejsów mobilnych. Apple używa go do wywoływania menu kontekstowych w aplikacjach (Messages, Safari, Files). Google wdrożył Long Press w system zaznaczania tekstu, przenoszenia ikon na pulpicie i wywoływania menu kontekstowych w Android. W interfejsach internetowych długie naciśnięcie często emuluje prawy przycisk myszy na urządzeniach mobilnych, które nie mają fizycznego prawego przycisku.
Historycznie Long Press pojawił się jako alternatywa dla menu kontekstowego (prawy klik) w ekranach dotykowych. Pierwsze implementacje spotyka się w urządzeniach z ekranami rezystancyjnymi (Palm, Windows Mobile z początku lat 2000.), ale gest został ustandaryzowany dopiero wraz z pojawieniem się iPhone i Android. Human Interface Guidelines obu platform opisują Long Press jako działanie drugorzędne — nie zastąpienie Tap, ale rozszerzenie funkcjonalności.
Long Press i Tap — dwa różne gesty o różnej semantyce. Tap (dotknięcie) — to natychmiastowe naciśnięcie: palec dotyka ekranu i jest puszczany w ciągu 100–300 ms. Tap jest zawsze działaniem głównym (primary action): otwarcie aplikacji, naciśnięcie przycisku, przejście pod link. Long Press — działanie drugorzędne (secondary action): otwarcie menu kontekstowego, rozpoczęcie edycji, pokazanie dodatkowych informacji.
| Parametr | Tap | Long Press |
|---|---|---|
| Czas przytrzymania | 100–300 ms | 500–1000 ms |
| Typ działania | Główne (primary) | Drugorzędne (secondary) |
| Przykłady | Otwieranie linku, naciśnięcie przycisku | Menu kontekstowe, edycja |
| Sprzężenie zwrotne | Wizualne (highlight) | Dotykowe (Haptic Feedback) |
| iOS API | UITapGestureRecognizer | UILongPressGestureRecognizer |
| Android API | setOnClickListener | setOnLongClickListener |
Kluczowa zasada: nigdy nie używaj Long Press jako jedynego sposobu wykonania działania. Użytkownicy oczekują, że Tap wykonuje główne działanie, a Long Press otwiera dodatkowe opcje. Naruszenie tej zasady (np. wymaganie długiego naciśnięcia do otwarcia linku) prowadzi do negatywnego doświadczenia użytkownika i obniżenia dostępności.
UILongPressGestureRecognizer — standardowy rozpoznawacz gestów w iOS SDK do obsługi długiego naciśnięcia. Dziedziczy po UIGestureRecognizer i obsługuje konfigurację minimalnego czasu trwania, dopuszczalnego przesunięcia palca oraz liczby dotknięć. Rozpoznawacz przechodzi w stan UIGestureRecognizerStateBegan po upływie timera, następnie w UIGestureRecognizerStateChanged przy ruchu palca i UIGestureRecognizerStateEnded przy puszczeniu.
// UILongPressGestureRecognizer z konfiguracją minimalnego czasu trwania
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Minimalny czas przytrzymania: 0.5 sekundy
longPressRecognizer.minimumPressDuration = 0.5
// Dopuszczalne przesunięcie palca: 10 punktów
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Tworzenie menu kontekstowego
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Parametry konfiguracji: minimumPressDuration — czas w sekundach do zadziałania (standardowo 0.5, dla accessibility zalecane 0.65+); allowableMovement — maksymalne przesunięcie palca w punktach (standardowo 10, zwiększenie pomaga przy drżeniu rąk). iOS obsługuje numberOfTouchesRequired dla gestów multitouch (np. długie naciśnięcie dwoma palcami). Rozpoznawacz integruje się również z UIContextMenuInteraction — po dodaniu context menu do UIView przez UIContextMenuConfiguration, Long Press automatycznie wywołuje menu kontekstowe bez ręcznej implementacji gestu.
setOnLongClickListener — metoda View w Android SDK, która ustawia słuchacza długiego naciśnięcia. Gdy użytkownik przytrzymuje View dłużej niż 500 ms, system wywołuje onLongClick(). Metoda zwraca boolean — true oznacza, że zdarzenie zostało obsłużone i nie powinno być przekazywane dalej, false — zdarzenie może być obsłużone przez innych słuchaczy. Do bardziej złożonej obsługi (ruch palca po rozpoczęciu Long Press) używa się GestureDetector z OnGestureListener.
// Przykład setOnLongClickListener z dotykowym sprzężeniem zwrotnym
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Dotykowy odzew potwierdzający rozpoczęcie gestu
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Pokazanie menu kontekstowego w pozycji elementu
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Zdarzenie obsłużone
}GestureDetector zapewnia bardziej precyzyjną kontrolę nad gestem. W przeciwieństwie do setOnLongClickListener, GestureDetector powiadamia o rozpoczęciu (onLongPress), ruchu (onScroll) i puszczeniu. Pozwala to na implementację złożonych scenariuszy — na przykład rozpoczęcie przeciągania po długim naciśnięciu (Drag-and-Drop). OnGestureListener wymaga implementacji sześciu metod: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press jest używany w dziesiątkach scenariuszy interfejsów mobilnych. Najczęstsze zastosowanie to menu kontekstowe: długie naciśnięcie na kontakt pokazuje opcje komunikacji (połączenie, wiadomość, email), na plik — opcje (kopiuj, przenieś, usuń), na tekst — zaznaczanie i schowek. Android Launcher używa długiego naciśnięcia na ikonie do przenoszenia aplikacji i dodawania widgetów.
Zaznaczanie tekstu — klasyczny przykład Long Press na obu platformach. W iOS długie naciśnięcie na tekst aktywuje lupę do pozycjonowania kursora; na słowie — zaznacza go z markerami. W Android długie naciśnięcie zaznacza całe słowo i pokazuje panel działań (kopiuj, wytnij, wklej). Obie platformy używają następnie przeciągania markerów do rozszerzania zaznaczenia.
Podgląd — w iOS długie naciśnięcie na link w Safari lub wiadomość w Mail otwiera podgląd zawartości (peek). W Android podobne zachowanie jest realizowane przez Long Press na powiadomieniu (rozwija powiadomienie z przyciskami działań). Aplikacje Photos używają długiego naciśnięcia na miniaturze do szybkiego podglądu obrazu.
Drag-and-Drop często jest inicjowany przez Long Press. Użytkownik przytrzymuje element, system przełącza się w tryb przeciągania, a ruch palca przesuwa element po ekranie. Android obsługuje ten scenariusz przez View.startDragAndDrop() po Long Press. iOS używa UIDragInteraction, gdzie drag interaction wymaga długiego naciśnięcia do rozpoczęcia przeciągania.
Human Interface Guidelines obu platform podają jasne zalecenia: Long Press zawsze powinien być działaniem drugorzędnym. Nigdy nie rób długiego naciśnięcia jedynym sposobem wykonania krytycznej funkcji. Użytkownicy najpierw próbują Tap — jeśli Tap nie działa zgodnie z oczekiwaniami, są rozczarowani. Dodawaj wizualne wskazówki: menu kontekstowe może być oznaczone ikoną trzech kropek, a elementy obsługujące Long Press — wizualną podpowiedzią przy dotknięciu.
Dotykowe sprzężenie zwrotne jest obowiązkowe dla Long Press. Gdy gest zostanie rozpoznany, urządzenie powinno potwierdzić to dotykowym odzewem: w iOS to UIImpactFeedbackGenerator z lekkim impulsem, w Android — HapticFeedbackConstants.LONG_PRESS. Bez dotykowego sprzężenia zwrotnego użytkownik nie jest pewien, czy gest zadziałał, i może ponownie nacisnąć, wywołując niepożądane działania.
| Zalecenie | iOS | Android |
|---|---|---|
| Timeout rozpoznawania | 0.5–0.65 sekundy | 500 ms (domyślnie) |
| Dotykowe sprzężenie zwrotne | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Sprzężenie wizualne | Menu kontekstowe, podświetlenie | PopupMenu, ripple animation |
| Dostępność (Accessibility) | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Maks. przesunięcie palca | allowableMovement = 10 pt | TouchSlop (standardowo ~8 dp) |
| Konflikt ze scrollowaniem | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Dostępność: nie wszyscy użytkownicy mogą wykonać długie naciśnięcie (osoby z zaburzeniami motorycznymi, starsi użytkownicy). Zawsze zapewniaj alternatywny sposób dostępu do działań Long Press — na przykład przez przycisk „Więcej" w interfejsie lub przez systemowe funkcje dostępności (VoiceOver w iOS, TalkBack w Android). W iOS można dodać Custom Actions w UIAccessibilityCustomAction, które są dostępne przez rotor VoiceOver.
Często zadawane pytania
Standardowy czas dla Long Press wynosi 0,5 sekundy (500 ms) na obu platformach. iOS pozwala ustawić minimumPressDuration od 0.3 do 1.0 sekundy. Android używa stałego timeoutu 500 ms dla View.setOnLongClickListener. Dla użytkowników z ograniczoną motoryką zaleca się zwiększenie timeoutu do 0,8–1,0 sekundy.
Long Press jest rozpoznawany na podstawie czasu przytrzymania (0,5 s), 3D Touch — na podstawie siły naciśnięcia (gramy nacisku). 3D Touch jest dostępny tylko na iPhone 6S–XR (sprzętowa technologia Force Touch). Od iOS 13 Apple zastąpił 3D Touch Haptic Touch — programową imitację działającą przez Long Press z dotykowym sprzężeniem zwrotnym. Haptic Touch jest dostępny na wszystkich nowoczesnych iPhone i iPad.
Konflikt Long Press i scrollowania to częsty problem. Rozwiązanie: ustaw delaysTouchesBegan = true dla rozpoznawacza gestu w iOS (system nie wysyła touchesBegan natychmiast, lecz czeka na rozpoznanie gestu). W Android użyj onInterceptTouchEvent, zwracający false dla Long Press. Jeśli użytkownik zacznie ruszać palcem przed timeoutem — gest jest anulowany na rzecz scrollowania.
Tak, Long Press jest obsługiwany w aplikacjach internetowych przez zdarzenie touchstart/touchend z pomiarem czasu. Nowoczesne przeglądarki obsługują również zdarzenie contextmenu, które jest wywoływane przy długim naciśnięciu na urządzeniach mobilnych. Do zapewnienia kompatybilności międzyprzeglądarkowej używaj bibliotek hammer.js lub zaimplementuj własny rozpoznawacz przez setInterval w handlerze touchstart.
W iOS dotykowe sprzężenie zwrotne dodaje się przez UIImpactFeedbackGenerator. Wywołaj impactOccurred() w momencie przejścia UILongPressGestureRecognizer w stan began. Do lekkiego odzewu użyj UIImpactFeedbackGenerator(style: .light). Do bardziej zauważalnego — .medium. Dla menu kontekstowych iOS automatycznie dodaje dotykowe sprzężenie zwrotne przez UIContextMenuInteraction bez dodatkowego kodu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również