Long Press — gesto dlouhého stisknutí, při kterém je prst držen na obrazovce po určitou dobu (obvykle 0,5–1 sekunda) bez pohybu. Na rozdíl od Tap je Long Press rozpoznán ne v okamžiku dotyku, ale po uplynutí časovače zpoždění. Gesto se používá pro vyvolání kontextové nabídky, náhledu, výběru více objektů a aktivace dalších akcí. Je implementováno v iOS přes UILongPressGestureRecognizer, v Androidu — přes setOnLongClickListener nebo GestureDetector.
Hlavní body
Long Press (dlouhé stisknutí, dlouhý dotyk) — gesto multitouch rozhraní, při kterém uživatel dotkne obrazovky a drží prst nehybně po určitou dobu. Systém nereaguje okamžitě: čeká na timeout (obvykle 500 ms) a teprve po jeho uplynutí rozpozná gesto jako Long Press. Pokud je prst uvolněn dříve — gesto je interpretováno jako běžné Tap.
Gesto je základním stavebním blokem moderních mobilních rozhraní. Apple ho používá pro vyvolávání kontextových nabídek v aplikacích (Messages, Safari, Files). Google implementoval Long Press do systému výběru textu, přesouvání ikon na ploše a vyvolávání kontextových nabídek v Androidu. Ve webových rozhraních dlouhé stisknutí často emuluje pravé tlačítko myši na mobilních zařízeních, která nemají fyzické pravé tlačítko.
Historicky se Long Press objevil jako alternativa ke kontextové nabídce (pravé kliknutí) pro dotykové obrazovky. První implementace se nacházejí v zařízeních s rezistivními obrazovkami (Palm, Windows Mobile z počátku 2000. let), ale gesto bylo standardizováno až s příchodem iPhone a Androidu. Human Interface Guidelines obou platforem popisují Long Press jako sekundární akci — ne náhradu Tap, ale rozšíření funkcionality.
Long Press a Tap — dvě různá gesta s odlišnou sémantikou. Tap (dotyk) — je okamžité stisknutí: prst se dotkne obrazovky a je uvolněn během 100–300 ms. Tap je vždy hlavní akce (primary action): otevření aplikace, stisknutí tlačítka, přechod na odkaz. Long Press — sekundární akce (secondary action): otevření kontextové nabídky, zahájení úprav, zobrazení dalších informací.
| Parametr | Tap | Long Press |
|---|---|---|
| Doba držení | 100–300 ms | 500–1000 ms |
| Typ akce | Hlavní (primary) | Sekundární (secondary) |
| Příklady | Otevření odkazu, stisknutí tlačítka | Kontextová nabídka, úpravy |
| Zpětná vazba | Vizuální (highlight) | Haptická (Haptic Feedback) |
| iOS API | UITapGestureRecognizer | UILongPressGestureRecognizer |
| Android API | setOnClickListener | setOnLongClickListener |
Klíčové pravidlo: nikdy nepoužívejte Long Press jako jediný způsob provedení akce. Uživatelé očekávají, že Tap provádí hlavní akci a Long Press otevírá další možnosti. Porušení tohoto principu (například požadavek dlouhého stisknutí pro otevření odkazu) vede k negativní uživatelské zkušenosti a snížení přístupnosti.
UILongPressGestureRecognizer — standardní rozpoznávač gest v iOS SDK pro zpracování dlouhého stisknutí. Dědí z UIGestureRecognizer a podporuje konfiguraci minimální doby trvání, povoleného pohybu prstu a počtu dotyků. Rozpoznávač přechází do stavu UIGestureRecognizerStateBegan po uplynutí časovače, poté do UIGestureRecognizerStateChanged při pohybu prstu a UIGestureRecognizerStateEnded při uvolnění.
// UILongPressGestureRecognizer s konfigurací minimální doby trvání
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Minimální doba držení: 0.5 sekundy
longPressRecognizer.minimumPressDuration = 0.5
// Povolený pohyb prstu: 10 bodů
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Vytvoření kontextové nabídky
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Parametry konfigurace: minimumPressDuration — čas v sekundách do aktivace (standardně 0.5, pro přístupnost se doporučuje 0.65+); allowableMovement — maximální pohyb prstu v bodech (standardně 10, zvýšení pomáhá při třesu). iOS podporuje numberOfTouchesRequired pro multitouch gesta (například dlouhé stisknutí dvěma prsty). Rozpoznávač se také integruje s UIContextMenuInteraction — při přidání kontextové nabídky k UIView přes UIContextMenuConfiguration, Long Press automaticky vyvolá kontextovou nabídku bez ruční implementace gesta.
setOnLongClickListener — metoda View v Android SDK, která nastavuje posluchače dlouhého stisknutí. Když uživatel drží View déle než 500 ms, systém volá onLongClick(). Metoda vrací boolean — true znamená, že událost byla zpracována a nemá být předávána dále, false — událost může být zpracována i jinými posluchači. Pro složitější zpracování (pohyb prstu po zahájení Long Press) se používá GestureDetector s OnGestureListener.
// Příklad setOnLongClickListener s haptickou zpětnou vazbou
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Haptická odezva pro potvrzení zahájení gesta
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Zobrazení kontextové nabídky v pozici prvku
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Událost zpracována
}GestureDetector poskytuje jemnější kontrolu nad gestem. Na rozdíl od setOnLongClickListener, GestureDetector informuje o začátku (onLongPress), pohybu (onScroll) a uvolnění. To umožňuje implementaci složitých scénářů — například zahájení přetahování po dlouhém stisknutí (Drag-and-Drop). OnGestureListener vyžaduje implementaci šesti metod: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press se používá v desítkách scénářů mobilních rozhraní. Nejčastější použití je kontextová nabídka: dlouhé stisknutí na kontaktu zobrazuje možnosti komunikace (hovor, zpráva, e-mail), na souboru — možnosti (kopírovat, přesunout, smazat), na textu — výběr a schránka. Android Launcher používá dlouhé stisknutí na ikoně pro přesouvání aplikací a přidávání widgetů.
Výběr textu — klasický příklad Long Press na obou platformách. V iOS dlouhé stisknutí na textu aktivuje lupu pro umístění kurzoru; na slově — vybere ho s markery. V Androidu dlouhé stisknutí vybere celé slovo a zobrazí panel akcí (kopírovat, vyjmout, vložit). Obě platformy pak používají přetahování markerů pro rozšíření výběru.
Náhled — v iOS dlouhé stisknutí na odkazu v Safari nebo zprávě v Mailu otevírá náhled obsahu (peek). V Androidu je podobné chování implementováno přes Long Press na oznámení (rozbalí oznámení s tlačítky akcí). Aplikace Fotky používají dlouhé stisknutí na náhledu pro rychlý náhled obrázku.
Drag-and-Drop je často iniciován Long Press. Uživatel drží prvek, systém přepne do režimu přetahování a pohyb prstu posouvá prvek po obrazovce. Android podporuje tento scénář přes View.startDragAndDrop() po Long Press. iOS používá UIDragInteraction, kde drag interakce vyžaduje dlouhé stisknutí pro zahájení přetahování.
Human Interface Guidelines obou platforem dávají jasná doporučení: Long Press by měl být vždy sekundární akcí. Nikdy nedělejte dlouhé stisknutí jediným způsobem provedení kritické funkce. Uživatelé nejprve zkoušejí Tap — pokud Tap nefunguje podle očekávání, jsou zklamaní. Přidejte vizuální nápovědu: kontextové nabídky mohou být označeny ikonou tří teček a prvky podporující Long Press — vizuálním náznakem při dotyku.
Haptická zpětná vazba je povinná pro Long Press. Když je gesto rozpoznáno, zařízení by to mělo potvrdit haptickou odezvou: v iOS je to UIImpactFeedbackGenerator s lehkým impulsem, v Androidu — HapticFeedbackConstants.LONG_PRESS. Bez haptické zpětné vazby si uživatel není jistý, zda gesto fungovalo, a může znovu stisknout, což způsobí nežádoucí akce.
| Doporučení | iOS | Android |
|---|---|---|
| Timeout rozpoznání | 0.5–0.65 sekundy | 500 ms (výchozí) |
| Haptická zpětná vazba | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Vizuální zpětná vazba | Kontextová nabídka, zvýraznění | PopupMenu, ripple animace |
| Přístupnost (Accessibility) | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Max. pohyb prstu | allowableMovement = 10 pt | TouchSlop (výchozí ~8 dp) |
| Konflikt s rolováním | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Přístupnost: ne všichni uživatelé mohou provést dlouhé stisknutí (osoby s motorickými poruchami, starší uživatelé). Vždy poskytněte alternativní způsob přístupu k akcím Long Press — například prostřednictvím tlačítka «Více» v rozhraní nebo prostřednictvím systémových funkcí přístupnosti (VoiceOver v iOS, TalkBack v Androidu). Pro iOS lze přidat Custom Actions do UIAccessibilityCustomAction, které jsou přístupné přes rotor VoiceOver.
Často kladené otázky
Standardní čas pro Long Press je 0,5 sekundy (500 ms) na obou platformách. iOS umožňuje nastavení minimumPressDuration od 0.3 do 1.0 sekundy. Android používá pevný timeout 500 ms pro View.setOnLongClickListener. Pro uživatele s omezenou pohyblivostí se doporučuje zvýšit timeout na 0,8–1,0 sekundy.
Long Press je rozpoznán podle doby držení (0,5 s), 3D Touch — podle síly stisku (gramy tlaku). 3D Touch je k dispozici pouze na iPhone 6S–XR (hardwarová technologie Force Touch). Od iOS 13 Apple nahradil 3D Touch Haptic Touch — softwarovou imitací fungující přes Long Press s haptickou zpětnou vazbou. Haptic Touch je k dispozici na všech moderních iPhone a iPad.
Konflikt Long Press a rolování je častý problém. Řešení: nastavte delaysTouchesBegan = true pro rozpoznávač gest v iOS (systém neodesílá touchesBegan okamžitě, ale čeká na rozpoznání gesta). V Androidu použijte onInterceptTouchEvent vracející false pro Long Press. Pokud uživatel začne hýbat prstem před timeoutem — gesto je zrušeno ve prospěch rolování.
Ano, Long Press je podporován ve webových aplikacích prostřednictvím události touchstart/touchend s měřením času. Moderní prohlížeče také podporují událost contextmenu, která se spouští při dlouhém stisknutí na mobilních zařízeních. Pro kompatibilitu mezi prohlížeči používejte knihovny jako hammer.js nebo implementujte vlastní rozpoznávač přes setInterval v handleru touchstart.
V iOS se haptická zpětná vazba přidává přes UIImpactFeedbackGenerator. Zavolejte impactOccurred() v okamžiku přechodu UILongPressGestureRecognizer do stavu began. Pro lehkou odezvu použijte UIImpactFeedbackGenerator(style: .light). Pro výraznější — .medium. Pro kontextové nabídky iOS automaticky přidává haptickou zpětnou vazbu přes UIContextMenuInteraction bez dalšího kódu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také