Long Press — a hosszú lenyomás gesztusa, mely során az ujjat meghatározott ideig (általában 0,5–1 másodpercig) mozgás nélkül tartják a képernyőn. A Tap-pal ellentétben a Long Press nem az érintés pillanatában ismerŝik fel, hanem a késleltetési időzítő lejárta után. A gesztust helyi menü meghívására, előnézetre, több objektum kijelölésére és további műveletek aktiválására használják. iOS-ben a UILongPressGestureRecognizer, Androidban — a setOnLongClickListener vagy GestureDetector segítségével valósítják meg.
Főbb pontok
Long Press (hosszú lenyomás, hosszú érintés) — a multitouch interfész egy gesztusa, mely során a felhasználó megérinti a képernyőt, és az ujját meghatározott ideig mozdulatlanul tartja. A rendszer nem reagál azonnal: várja az időtúllépést (általában 500 ms), és csak annak lejárta után ismeri fel a gesztust Long Press-ként. Ha az ujj korábban elengedésre kerül — a gesztus egy szokásos Tap-ként értelmeződik.
A gesztus a modern mobil interfészek alapvető építőeleme. Az Apple a helyi menük előhívására használja az alkalmazásokban (Messages, Safari, Files). A Google bevezette a Long Press-t a szövegkijelölés rendszerébe, az ikonok asztalon történő áthelyezésébe és a helyi menük előhívásába Androidban. Webes interfészeken a hosszú lenyomás gyakran az egér jobb gombjának működését utánozza olyan mobileszközökön, amelyek nem rendelkeznek fizikai jobb gombbal.
Történetileg a Long Press a helyi menü (jobb kattintás) alternatívájaként jelent meg az érintőképernyőkhöz. Az első implementációk rezisztív képernyős eszközökben (Palm, Windows Mobile a 2000-es évek elején) találhatók, de a gesztus csak az iPhone és Android megjelenésével vált szabványossá. Mindkét platform Human Interface Guidelines útmutatója a Long Press-t másodlagos műveletként írja le — nem a Tap helyettesítése, hanem a funkcionalitás bővítése.
Long Press és Tap — két különböző gesztus eltérő szemantikával. A Tap (érintés) — egy azonnali lenyomás: az ujj megérinti a képernyőt, és 100–300 ms-en belül elengedésre kerül. A Tap mindig a fő művelet (primary action): alkalmazás megnyitása, gomb megnyomása, linkre lépés. Long Press — másodlagos művelet (secondary action): helyi menü megnyitása, szerkesztés indítása, további információk megjelenítése.
| Paraméter | Tap | Long Press |
|---|---|---|
| Lenyomás ideje | 100–300 ms | 500–1000 ms |
| Művelet típusa | Fő (primary) | Másodlagos (secondary) |
| Példák | Link megnyitása, gomb megnyomása | Helyi menü, szerkesztés |
| Visszajelzés | Vizuális (highlight) | Haptikus (Haptic Feedback) |
| iOS API | UITapGestureRecognizer | UILongPressGestureRecognizer |
| Android API | setOnClickListener | setOnLongClickListener |
Fő szabály: soha ne használja a Long Press-t egyetlen módként egy művelet végrehajtására. A felhasználók azt várják, hogy a Tap végrehajtja a fő műveletet, és a Long Press megnyitja a további opciókat. Ennek az elvnek a megsértése (például hosszú lenyomás követelménye egy link megnyitásához) negatív felhasználói élményhez és csökkentett akadálymentesítéshez vezet.
UILongPressGestureRecognizer — a szabvány gesztusfelismerő az iOS SDK-ban a hosszú lenyomás kezelésére. Az UIGestureRecognizer-ből származik, és támogatja a minimális időtartam, a megengedett ujjmozgás és a érintések számának konfigurálását. A felismerő az időzítő lejárta után UIGestureRecognizerStateBegan állapotba, az ujj mozgásakor UIGestureRecognizerStateChanged állapotba, elengedéskor pedig UIGestureRecognizerStateEnded állapotba kerül.
// UILongPressGestureRecognizer minimális időtartam konfigurálással
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Minimális lenyomási idő: 0.5 másodperc
longPressRecognizer.minimumPressDuration = 0.5
// Megengedett ujjmozgás: 10 pont
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Helyi menü létrehozása
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Konfigurációs paraméterek: minimumPressDuration — idő másodpercben a működésbe lépésig (alapértelmezett 0.5, akadálymentesítéshez 0.65+ ajánlott); allowableMovement — az ujj maximális elmozdulása pontokban (alapértelmezett 10, növelése remegés esetén segít). Az iOS támogatja a numberOfTouchesRequired-t többérintéses gesztusokhoz (például két ujjal történő hosszú lenyomás). A felismerő integrálódik a UIContextMenuInteraction őssel is — amikor a context menu hozzáadásra kerül a UIView-hez a UIContextMenuConfiguration révén, a Long Press automatikusan meghívja a helyi menüt a gesztus kézi implementálása nélkül.
setOnLongClickListener — az Android SDK View metódusa, amely beállítja a hosszú lenyomás figyelőjét. Amikor a felhasználó 500 ms-nál tovább tartja a View-t, a rendszer meghívja az onLongClick()-et. A metódus boolean értéket ad vissza — a true azt jelenti, hogy az esemény feldolgozásra került és nem továbbítandó, a false azt, hogy az eseményt más figyelők is feldolgozhatják. Összetettebb kezeléshez (ujjmozgás a Long Press megkezdése után) a GestureDetector-t használják az OnGestureListener-rel.
// Példa setOnLongClickListener haptikus visszajelzéssel
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Haptikus válasz a gesztus kezdetének megerősítéséhez
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Helyi menü megjelenítése az elem pozíciójában
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Esemény feldolgozva
}GestureDetector finomabb kontrollt biztosít a gesztus felett. A setOnLongClickListener-rel ellentétben a GestureDetector értesít a kezdetről (onLongPress), a mozgásról (onScroll) és az elengedésről. Ez lehetővé teszi összetett forgatókönyvek megvalósítását — például a húzás kezdeményezését hosszú lenyomás után (Drag-and-Drop). Az OnGestureListener hat metódus implementálását igényli: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press számos mobil interfész forgatókönyvben használatos. A leggyakoribb alkalmazás a helyi menü: a névjegyen történő hosszú lenyomás megjeleníti a kommunikációs opciókat (hívás, üzenet, e-mail), a fájlon — az opciókat (másolás, áthelyezés, törlés), a szövegen — a kijelölést és vágólapot. Az Android Launcher az ikonon történő hosszú lenyomást használja az alkalmazások áthelyezésére és widgetek hozzáadására.
Szövegkijelölés — a Long Press klasszikus példája mindkét platformon. iOS-ben a szövegen történő hosszú lenyomás aktiválja a nagyítót a kurzor pozicionálásához; egy szón — kijelöli azt jelölőkkel. Androidban a hosszú lenyomás kijelöli a teljes szót, és megjeleníti a műveleti panelt (másolás, kivágás, beillesztés). Mindkét platform a jelölők húzását használja a kijelölés bővítéséhez.
Előnézet — iOS-ben a Safari-beli linken vagy Mail-beli üzeneten történő hosszú lenyomás megnyitja a tartalom előnézetét (peek). Androidban hasonló viselkedés valósul meg értesítésen történő Long Press által (kibővíti az értesítést műveleti gombokkal). A Fotók alkalmazások a miniatörön történő hosszú lenyomást használják a kép gyors előnézetéhez.
Drag-and-Drop gyakran Long Press által indul. A felhasználó tartja az elemet, a rendszer átvált húzási módba, és az ujj mozgása mozgatja az elemet a képernyőn. Az Android támogatja ezt a forgatókönyvet a View.startDragAndDrop() által Long Press után. Az iOS a UIDragInteraction-t használja, ahol a drag interakció hosszú lenyomást igényel a húzás megkezdéséhez.
Human Interface Guidelines mindkét platform egyértelmű javaslatokat ad: a Long Press mindig másodlagos művelet legyen. Soha ne tegye a hosszú lenyomást az egyetlen móddá egy kritikus funkció végrehajtására. A felhasználók először a Tap-ot próbálják — ha a Tap nem úgy működik, ahogy várják, csalódottak lesznek. Adjunk hozzá vizuális utalásokat: a helyi menük jelölhetők három pont ikonjával, és a Long Press-t támogató elemek — vizuális jelzéssel érintéskor.
Haptikus visszajelzés kötelező a Long Press számára. Amikor a gesztus felismerésre kerül, az eszköznek haptikus válasszal kell megerősítenie azt: iOS-ben ez az UIImpactFeedbackGenerator egy könnyű impulzussal, Androidban — a HapticFeedbackConstants.LONG_PRESS. Haptikus visszajelzés nélkül a felhasználó nem biztos abban, hogy a gesztus sikeres volt, és újra megnyomhatja, nem kívánt műveleteket okozva.
| Javaslat | iOS | Android |
|---|---|---|
| Felismerési időtúllépés | 0.5–0.65 másodperc | 500 ms (alapértelmezett) |
| Haptikus visszajelzés | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Vizuális visszajelzés | Helyi menü, kiemelés | PopupMenu, ripple animáció |
| Akadálymentesítés (Accessibility) | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Max. ujjmozgás | allowableMovement = 10 pt | TouchSlop (alapértelmezett ~8 dp) |
| Konfliktus a görgetéssel | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Akadálymentesítés: nem minden felhasználó képes hosszú lenyomást végrehajtani (mozgássérültek, idős felhasználók). Mindig biztosítson alternatív hozzáférést a Long Press műveletekhez — például egy «Továbbiak» gombon keresztül a kezelőfelületen vagy a rendszer akadálymentesítési funkcióin (VoiceOver iOS-ben, TalkBack Androidban) keresztül. iOS-ben Custom Actions adhatók hozzá az UIAccessibilityCustomAction-hez, amelyek a VoiceOver rotor segítségével érhetők el.
Gyakran ismételt kérdések
A szabványos idő a Long Press számára 0,5 másodperc (500 ms) mindkét platformon. Az iOS lehetővé teszi a minimumPressDuration beállítását 0.3 és 1.0 másodperc között. Az Android rögzített 500 ms időtúllépést használ a View.setOnLongClickListener számára. Korlátozott mozgásképességű felhasználók számára ajánlott az időtúllépés 0,8–1,0 másodpercre növelése.
Long Press a lenyomás ideje (0,5 máp) alapján kerül felismerésre, 3D Touch — a nyomóerő (gramm nyomás) alapján. A 3D Touch csak iPhone 6S–XR készülékeken érhető el (hardveres Force Touch technológia). Az iOS 13-tól kezdve az Apple a 3D Touch-t Haptic Touch-ra cserélte — egy szoftveres utánzásra, amely Long Press-en keresztül működik haptikus visszajelzéssel. A Haptic Touch minden modern iPhone és iPad készüléken elérhető.
A Long Press és a görgetés ütközése gyakori probléma. Megoldás: állítsa be a delaysTouchesBegan = true értéket a gesztusfelismerő számára iOS-ben (a rendszer nem küldi el azonnal a touchesBegan-t, hanem vár a gesztus felismerésére). Androidban használja az onInterceptTouchEvent-et, amely false értéket ad vissza Long Press esetén. Ha a felhasználó az időtúllépés előtt elkezdi mozgatni az ujját — a gesztus érvénytelenítődik a görgetés javára.
Igen, a Long Press támogatott webalkalmazásokban a touchstart/touchend eseményen keresztül időméréssel. A modern böngészők támogatják a contextmenu eseményt is, amely hosszú lenyomáskor aktiválódik mobileszközökön. A több böngészős kompatibilitás érdekében használjon olyan könyvtárakat, mint a hammer.js, vagy valósítson meg egyedi felismerőt setInterval segítségével a touchstart kezelőben.
iOS-ben a haptikus visszajelzés az UIImpactFeedbackGenerator segítségével adható hozzá. Hívja meg az impactOccurred()-et abban a pillanatban, amikor az UILongPressGestureRecognizer a began állapotba kerül. Könnyű válaszhoz használja az UIImpactFeedbackGenerator(style: .light) függvényt. Erősebb hatáshoz — .medium. Helyi menük esetén az iOS automatikusan hozzáadja a haptikus visszajelzést a UIContextMenuInteraction révén, többletkód nélkül.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is