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 — при додавању context menu 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 interaction захтева дуго притискање за почетак превлачења.
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 animation |
| Приступачност (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 хендлеру.
У iOS-у, хаптичка повратна спрега се додаје кроз UIImpactFeedbackGenerator. Позовите impactOccurred() у тренутку преласка UILongPressGestureRecognizer у стање began. За лаган одговор користите UIImpactFeedbackGenerator(style: .light). За упечатљивији — .medium. За контекстне меније, iOS аутоматски додаје хаптичку повратну спрегу кроз UIContextMenuInteraction без додатног кода.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође