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 استاندارد شد. Human Interface Guidelines هر دو پلتفرم Long Press را به عنوان یک اقدام ثانویه توصیف میکنند — نه جایگزین Tap، بلکه افزایش قابلیت.
Long Press و Tap — دو حرکت متفاوت با معنای متفاوت هستند. Tap (لمس) — یک فشار فوری است: انگشت صفحه را لمس کرده و طی 100–300 میلیثانیه رها میشود. Tap همیشه اقدام اصلی (primary action) است: باز کردن برنامه، فشردن دکمه، رفتن به لینک. Long Press — اقدام ثانویه (secondary action): باز کردن منوی موضعی، شروع ویرایش، نمایش اطلاعات اضافی.
| پارامتر | Tap | Long Press |
|---|---|---|
| زمان نگهداشتن | 100–300 میلیثانیه | 500–1000 میلیثانیه |
| نوع اقدام | اصلی (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 میلیثانیه نگه میدارد، سیستم 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 روی اعلان (اعلان را با دکمههای اقدام باز میکند) پیاده شده است. برنامههای Photos از فشار طولانی روی بنگانه برای پیشنمایش سریع تصویر استفاده میکنند.
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 میلیثانیه (پیشفرض) |
| بازخورد لمسی | 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 میلیثانیه) است. 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 و پیمایش یک مشکل رایج است. راه حل: در iOS برای شناساینده حرکت، delaysTouchesBegan = true را تنظیم کنید (سیستم touchesBegan را فورا ارسال نمیکند، بلکه منتظر شناسایی حرکت میماند). در Android از onInterceptTouchEvent استفاده کنید که false برای Long Press برمیگرداند. اگر کاربر قبل از تایمآوت حرکت انگشت را آغاز کند — حرکت به نفع پیمایش لغو میشود.
بله، Long Press در برنامههای وب پشتیبانی میشود از طریق رویداد touchstart/touchend با اندازهگیری زمان. مرورگرهای مدرن همچنین از رویداد contextmenu پشتیبانی میکنند که در فشار طولانی روی دستگاههای موبایل فعال میشود. برای سازگاری چند مرورگرهای از کتابخانههایی مانند hammer.js استفاده کنید یا یک شناساینده سفارشی از طریق setInterval در هندلر touchstart پیاده کنید.
در iOS بازخورد لمسی از طریق UIImpactFeedbackGenerator اضافه میشود. در لحظه تبدیل UILongPressGestureRecognizer به وضعیت began، impactOccurred() را فراخوان کنید. برای بازخورد سبک از UIImpactFeedbackGenerator(style: .light) استفاده کنید. برای مشخوصتر — .medium. برای منوهای موضعی، iOS به طور خودکار از طریق UIContextMenuInteraction بدون نیاز به کد اضافی، بازخورد لمسی اضافه میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید