Long Press — жест на дълго натискане, при който пръстът се задържа на екрана за определено време (обикновено 0,5–1 секунда) без движение. За разлика от Tap, Long Press се разпознава не в момента на докосване, а след изтичане на таймера за закъснение. Жестът се използва за извикване на контекстно меню, предварителен преглед, избор на множество обекти и активиране на допълнителни действия. Реализира се в iOS чрез UILongPressGestureRecognizer, в Android — чрез setOnLongClickListener или GestureDetector.
Основни точки
Long Press (дълго натискане, дълго докосване) — жест на мултитъч интерфейса, при който потребителят докосва екрана и задържа пръста неподвижно за определено време. Системата не реагира веднага: тя изчаква таймаут (обикновено 500 ms) и едва след неговото изтичане разпознава жеста като Long Press. Ако пръстът бъде пуснат по-рано — жестът се интерпретира като обикновено Tap.
Жестът е фундаментален градивен блок на съвременните мобилни интерфейси. Apple го използва за извикване на контекстни менюта в приложения (Messages, Safari, Files). Google внедри Long Press в системата за избор на текст, преместване на икони на работния плот и извикване на контекстни менюта в Android. В уеб интерфейсите дългото натискане често емулира десния клик на мишката на мобилни устройства, които нямат физически десен бутон.
Исторически, Long Press се появи като алтернатива на контекстното меню (десен клик) за сензорни екрани. Първите реализации се срещат в устройства с резистивни екрани (Palm, Windows Mobile от началото на 2000-те), но жестът беше стандартизиран едва с появата на iPhone и Android. Human Interface Guidelines и на двете платформи описват Long Press като вторично действие — не заместител на Tap, а разширение на функционалността.
Long Press и Tap — два различни жеста с различна семантика. Tap (докосване) — е моментално натискане: пръстът докосва екрана и се пуска за 100–300 ms. Tap винаги е основно действие (primary action): отваряне на приложение, натискане на бутон, отиване на линк. Long Press — вторично действие (secondary action): отваряне на контекстно меню, започване на редактиране, показване на допълнителна информация.
| Параметър | Tap | Long Press |
|---|---|---|
| Време на задържане | 100–300 ms | 500–1000 ms |
| Тип действие | Основно (primary) | Вторично (secondary) |
| Примери | Отваряне на линк, натискане на бутон | Контекстно меню, редактиране |
| Обратна връзка | Визуална (highlight) | Хаптична (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, за достъпност се препоръчва 0.65+); allowableMovement — максимално движение на пръста в точки (стандартно 10, увеличението помага при треперене). iOS поддържа numberOfTouchesRequired за мултитъч жестове (например дълго натискане с два пръста). Разпознавачът също се интегрира с UIContextMenuInteraction — при добавяне на контекстно меню към UIView чрез UIContextMenuConfiguration, Long Press автоматично извиква контекстното меню без ръчна имплементация на жеста.
setOnLongClickListener — методът View в Android SDK, който задава слушател за дълго натискане. Когато потребителят задържи View повече от 500 ms, системата извиква 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 се използва в десетки сценарии на мобилни интерфейси. Най-честото приложение е контекстното меню: дълго натискане на контакт показва опции за комуникация (обаждане, съобщение, имейл), на файл — опции (копиране, преместване, изтриване), на текст — избор и клипборд. Android Launcher използва дълго натискане на икона за преместване на приложения и добавяне на уиджети.
Избор на текст — класически пример за Long Press на двете платформи. В iOS дългото натискане на текст активира лупа за позициониране на курсора; на дума — я избира с маркери. В Android дългото натискане избира цялата дума и показва панела с действия (копиране, изрязване, поставяне). И двете платформи използват плъзгане на маркери за разширяване на селекцията.
Предварителен преглед — в iOS дългото натискане на линк в Safari или съобщение в Mail отваря предварителен преглед на съдържанието (peek). В Android подобно поведение се реализира чрез Long Press на известие (разширява известието с бутони за действия). Приложенията за снимки използват дълго натискане на миниатюра за бърз преглед на изображение.
Drag-and-Drop често се инициира от Long Press. Потребителят задържа елемента, системата превключва в режим на плъзгане и движението на пръста премества елемента по екрана. Android поддържа този сценарий чрез View.startDragAndDrop() след Long Press. iOS използва UIDragInteraction, където drag взаимодействието изисква дълго натискане за започване на плъзгане.
Human Interface Guidelines и на двете платформи дават ясни препоръки: Long Press винаги трябва да бъде вторично действие. Никога не правете дългото натискане единствен начин за изпълнение на критична функция. Потребителите първо опитват Tap — ако Tap не работи както се очаква, те са разочаровани. Добавете визуални подсказки: контекстните менюта могат да бъдат обозначени с икона на три точки, а елементите, поддържащи Long Press — с визуален намек при докосване.
Хаптичната обратна връзка е задължителна за Long Press. Когато жестът бъде разпознат, устройството трябва да потвърди това с хаптичен отговор: в iOS това е UIImpactFeedbackGenerator с лек импулс, в Android — HapticFeedbackConstants.LONG_PRESS. Без хаптична обратна връзка потребителят не е сигурен, че жестът е проработил и може да натисне отново, причинявайки нежелани действия.
| Препоръка | iOS | Android |
|---|---|---|
| Таймаут за разпознаване | 0.5–0.65 секунди | 500 ms (по подразбиране) |
| Хаптична обратна връзка | 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 ms) на двете платформи. iOS позволява настройка на minimumPressDuration от 0.3 до 1.0 секунди. Android използва фиксиран таймаут от 500 ms за 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 handler.
В iOS хаптичната обратна връзка се добавя чрез UIImpactFeedbackGenerator. Извикайте impactOccurred() в момента на преминаване на UILongPressGestureRecognizer в състояние began. За лек отговор използвайте UIImpactFeedbackGenerator(style: .light). За по-забележим — .medium. За контекстни менюта iOS автоматично добавя хаптична обратна връзка чрез UIContextMenuInteraction без допълнителен код.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също