Long Press — це жест довгого натискання, при якому палець утримується на екрані протягом певного часу (зазвичай 0,5–1 секунда) без переміщення. На відміну від Tap, Long Press розпізнається не в момент дотику, а після завершення таймера затримки. Жест використовується для виклику контекстного меню, попереднього перегляду, вибору кількох об'єктів та активації додаткових дій. Реалізується на iOS через UILongPressGestureRecognizer, на Android — через setOnLongClickListener або GestureDetector.
Головне
Long Press (довге натискання, довгий дотик) — це жест мультитач-інтерфейсу, при якому користувач торкається екрану та утримує палець нерухомо протягом заданого часу. Система не реагує миттєво: вона очікує тайм-аут (зазвичай 500 мс), і тільки після його завершення розпізнає жест як Long Press. Якщо палець відпущено раніше — жест інтерпретується як звичайне натискання Tap.
Жест є фундаментальним будівельним блоком сучасних мобільних інтерфейсів. Apple використовує його для виклику контекстних меню в додатках (Messages, Safari, Files). Google впровадив Long Press у систему виділення тексту, переміщення іконок на робочому столі та виклику контекстних меню в Android. У веб-інтерфейсах довге натискання часто емулює правий клік миші на мобільних пристроях, де немає фізичної правої кнопки.
Історично Long Press з'явився як альтернатива контекстному меню (правий клік) для сенсорних екранів. Перші реалізації зустрічаються в пристроях з резистивними екранами (Palm, Windows Mobile початку 2000-х), але стандартизувався жест тільки з появою iPhone та Android. Інструкції з людського інтерфейсу обох платформ описують Long Press як вторинну дію — не заміну Tap, а розширення функціональності.
Long Press і Tap — два різні жести з різною семантикою. Tap (дотик) — це миттєве натискання: палець торкається екрану і відпускається за 100–300 мс. Tap завжди є основною дією: відкрити додаток, натиснути кнопку, перейти за посиланням. Long Press — вторинна дія: відкрити контекстне меню, почати редагування, показати додаткову інформацію.
| Параметр | Tap | Long Press |
|---|---|---|
| Час утримання | 100–300 мс | 500–1000 мс |
| Тип дії | Основна (primary) | Вторинна (secondary) |
| Приклади | Відкриття посилання, натискання кнопки | Контекстне меню, редагування |
| Зворотний зв'язок | Візуальний (підсвічування) | Тактильний (Haptic Feedback) |
| iOS API | UITapGestureRecognizer | UILongPressGestureRecognizer |
| Android API | setOnClickListener | setOnLongClickListener |
Ключове правило: ніколи не використовуйте Long Press як єдиний спосіб виконати дію. Користувачі очікують, що Tap виконує основну дію, а Long Press відкриває додаткові опції. Порушення цього принципу (наприклад, вимога довгого натискання для відкриття посилання) призводить до негативного досвіду користувача та зниження доступності.
UILongPressGestureRecognizer — стандартний розпізнавач жестів у iOS SDK для обробки довгого натискання. Він успадковується від UIGestureRecognizer та підтримує конфігурацію мінімальної тривалості, допустимого переміщення пальця та кількості дотиків. Розпізнавач переходить у стан UIGestureRecognizerStateBegan після завершення таймера, потім у UIGestureRecognizerStateChanged при русі пальця та UIGestureRecognizerStateEnded при відпусканні.
// UILongPressGestureRecognizer з налаштуванням мінімальної тривалості
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Мінімальний час утримання: 0.5 секунди
longPressRecognizer.minimumPressDuration = 0.5
// Допустиме зміщення пальця: 10 точок
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Створення контекстного меню
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Параметри конфігурації: minimumPressDuration — час у секундах до спрацьовування (стандартно 0.5, для accessibility рекомендується 0.65+); allowableMovement — максимальне зміщення пальця в точках (стандартно 10, збільшення допомагає при тремтінні). iOS підтримує numberOfTouchesRequired для мультитач-жестів (наприклад, довге натискання двома пальцями). Розпізнавач також інтегрується з UIContextMenuInteraction — при додаванні контекстного меню до UIView через UIContextMenuConfiguration, Long Press автоматично викликає контекстне меню без ручної реалізації жесту.
setOnLongClickListener — метод View в Android SDK, який встановлює слухач довгого натискання. Коли користувач утримує View більше 500 мс, система викликає onLongClick(). Метод повертає boolean — true означає, що подію оброблено і вона не повинна передаватися далі, false — подія може бути оброблена іншими слухачами. Для більш складної обробки (рух пальця після початку Long Press) використовується GestureDetector з OnGestureListener.
// Приклад setOnLongClickListener з тактильним зворотним зв'язком
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Тактильний відклик для підтвердження початку жесту
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Показуємо контекстне меню в позиції елемента
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Подію оброблено
}GestureDetector забезпечує більш тонкий контроль над жестом. На відміну від setOnLongClickListener, GestureDetector сповіщає про початок (onLongPress), рух (onScroll) та відпускання. Це дозволяє реалізувати складні сценарії — наприклад, початок перетягування після довгого натискання (Drag-and-Drop). OnGestureListener вимагає реалізації шести методів: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press використовується в десятках сценаріїв мобільних інтерфейсів. Найпоширеніше застосування — контекстне меню: довге натискання на контакт показує варіанти зв'язку (дзвінок, повідомлення, email), на файл — опції (копіювати, перемістити, видалити), на текст — виділення та буфер обміну. Android Launcher використовує довге натискання на іконку для переміщення додатків та додавання віджетів.
Виділення тексту — класичний приклад Long Press на обох платформах. В iOS довге натискання на текст активує лупу для позиціонування курсора; на слові — виділяє його з маркерами. В Android довге натискання виділяє слово повністю та показує панель дій (копіювати, вирізати, вставити). Обидві платформи використовують подальше перетягування маркерів для розширення виділення.
Попередній перегляд — в iOS довге натискання на посилання в Safari або повідомлення в Mail відкриває попередній перегляд вмісту (peek). В Android аналогічна поведінка реалізується через Long Press на сповіщенні (розгортає сповіщення з кнопками дій). Додатки Photos використовують довге натискання на мініатюру для швидкого попереднього перегляду зображення.
Drag-and-Drop часто ініціюється Long Press. Користувач утримує елемент, система перемикається в режим перетягування, і рух пальця переміщує елемент по екрану. Android підтримує цей сценарій через View.startDragAndDrop() після Long Press. iOS використовує UIDragInteraction, де drag interaction вимагає довгого натискання для старту перетягування.
Інструкції з людського інтерфейсу обох платформ дають чіткі рекомендації: Long Press завжди має бути вторинною дією. Ніколи не робіть довге натискання єдиним способом виконання критичної функції. Користувачі спочатку пробують Tap — якщо Tap не спрацьовує очікуваним чином, вони розчаровуються. Додавайте візуальні підказки: контекстні меню можуть бути позначені іконкою трьох крапок, а елементи, що підтримують Long Press, — візуальним натяком при дотику.
Тактильний зворотний зв'язок обов'язковий для Long Press. Коли жест розпізнано, пристрій має підтвердити це тактильним відкликом: в iOS це UIImpactFeedbackGenerator з легким імпульсом, в Android — HapticFeedbackConstants.LONG_PRESS. Без тактильного зворотного зв'язку користувач не впевнений, що жест спрацював, і може повторно натиснути, викликаючи небажані дії.
| Рекомендація | iOS | Android |
|---|---|---|
| Тайм-аут розпізнавання | 0.5–0.65 секунди | 500 мс (за замовчуванням) |
| Тактильний відклик | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Візуальний фідбек | Контекстне меню, виділення | PopupMenu, ripple анімація |
| Доступність (Accessibility) | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Макс. зміщення пальця | allowableMovement = 10 pt | TouchSlop (стандартно ~8 dp) |
| Конфлікт з прокруткою | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Доступність: не всі користувачі можуть виконати довге натискання (люди з моторними порушеннями, літні користувачі). Завжди надавайте альтернативний спосіб доступу до дій Long Press — наприклад, через кнопку "Ще" в інтерфейсі або через системні функції доступності (VoiceOver в iOS, TalkBack в Android). Для iOS можна додати Custom Actions через UIAccessibilityCustomAction, які доступні через ротор VoiceOver.
Поширені запитання
Стандартний час для Long Press становить 0,5 секунди (500 мс) на обох платформах. iOS дозволяє налаштувати minimumPressDuration від 0.3 до 1.0 секунди. Android використовує фіксований тайм-аут 500 мс для View.setOnLongClickListener. Для користувачів з обмеженою моторикою рекомендується збільшити тайм-аут до 0,8–1,0 секунди.
Long Press розпізнається за часом утримання (0,5 с), 3D Touch — за силою натискання (грами тиску). 3D Touch доступний лише на iPhone 6S–XR (апаратна технологія Force Touch). Починаючи з iOS 13, Apple замінила 3D Touch на Haptic Touch — програмну імітацію, що працює через Long Press з тактильним відкликом. Haptic Touch доступний на всіх сучасних iPhone та iPad.
Конфлікт Long Press і прокрутки — часта проблема. Рішення: встановіть delaysTouchesBegan = true для розпізнавача жесту в iOS (система не надсилає touchesBegan негайно, а чекає розпізнавання жесту). В Android використовуйте onInterceptTouchEvent, що повертає false для Long Press. Якщо користувач починає рух пальця до тайм-ауту — жест скасовується на користь прокрутки.
Так, Long Press підтримується в веб-додатках через подію touchstart/touchend з вимірюванням часу. Сучасні браузери також підтримують подію contextmenu, яка спрацьовує при довгому натисканні на мобільних пристроях. Для крос-браузерної сумісності використовуйте бібліотеки hammer.js або реалізуйте кастомний розпізнавач через setInterval в обробнику touchstart.
В iOS тактильний зворотний зв'язок додається через UIImpactFeedbackGenerator. Викличте impactOccurred() в момент переходу UILongPressGestureRecognizer в стан began. Для легкого відклику використовуйте UIImpactFeedbackGenerator(style: .light). Для більш помітного — .medium. Для контекстних меню iOS автоматично додає тактильний відклик через UIContextMenuInteraction без додаткового коду.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також