Long Press là cử chỉ nhấn giữ trong đó ngón tay giữ yên trên màn hình trong một khoảng thời gian nhất định (thường 0,5–1 giây) mà không di chuyển. Không giống như Tap, Long Press được nhận dạng không phải tại thời điểm chạm mà sau khi hết thời gian chờ. Cử chỉ này được sử dụng để gọi menu ngữ cảnh, xem trước nội dung, chọn nhiều đối tượng và kích hoạt các hành động bổ sung. Nó được triển khai trên iOS qua UILongPressGestureRecognizer, và trên Android qua setOnLongClickListener hoặc GestureDetector.
Những điểm chính
Long Press (nhấn giữ, chạm giữ) là một cử chỉ giao diện đa chạm trong đó người dùng chạm vào màn hình và giữ ngón tay bất động trong một khoảng thời gian xác định. Hệ thống không phản ứng ngay lập tức: nó chờ một khoảng thời gian chờ (thường 500 ms) và chỉ sau khi hết thời gian mới nhận dạng cử chỉ là Long Press. Nếu ngón tay được nhấc lên sớm hơn, cử chỉ được hiểu là Tap thông thường.
Cử chỉ này là một khối xây dựng cơ bản của các giao diện di động hiện đại. Apple sử dụng nó để gọi menu ngữ cảnh trong ứng dụng (Messages, Safari, Files). Google đã tích hợp Long Press vào tính năng chọn văn bản, sắp xếp lại biểu tượng trên màn hình chính và gọi menu ngữ cảnh trong Android. Trong giao diện web, nhấn giữ thường mô phỏng cú nhấp chuột phải trên thiết bị di động, nơi không có nút chuột phải vật lý.
Trong lịch sử, Long Press xuất hiện như một giải pháp thay thế cho menu ngữ cảnh (nhấp chuột phải) cho màn hình cảm ứng. Các triển khai đầu tiên xuất hiện trên các thiết bị có màn hình điện trở (Palm, Windows Mobile đầu những năm 2000), nhưng cử chỉ này chỉ được tiêu chuẩn hóa với sự ra đời của iPhone và Android. Hướng dẫn giao diện người dùng của cả hai nền tảng mô tả Long Press là hành động thứ cấp — không phải thay thế cho Tap, mà là mở rộng chức năng.
Long Press và Tap là hai cử chỉ khác nhau với ngữ nghĩa khác nhau. Tap là một lần chạm tức thì: ngón tay chạm vào màn hình và nhấc lên trong vòng 100–300 ms. Tap luôn là hành động chính: mở ứng dụng, nhấn nút, theo liên kết. Long Press là hành động thứ cấp: mở menu ngữ cảnh, bắt đầu chỉnh sửa, hiển thị thông tin bổ sung.
| Tham số | Tap | Long Press |
|---|---|---|
| Thời gian giữ | 100–300 ms | 500–1000 ms |
| Loại hành động | Chính (primary) | Phụ (secondary) |
| Ví dụ | Mở liên kết, nhấn nút | Menu ngữ cảnh, chỉnh sửa |
| Phản hồi | Trực quan (làm nổi bật) | Xúc giác (Phản hồi Haptic) |
| API iOS | UITapGestureRecognizer | UILongPressGestureRecognizer |
| API Android | setOnClickListener | setOnLongClickListener |
Nguyên tắc chính: không bao giờ sử dụng Long Press như cách duy nhất để thực hiện một hành động. Người dùng mong đợi Tap thực hiện hành động chính và Long Press mở các tùy chọn bổ sung. Vi phạm nguyên tắc này (ví dụ: yêu cầu nhấn giữ để mở liên kết) dẫn đến trải nghiệm người dùng tiêu cực và giảm khả năng tiếp cận.
UILongPressGestureRecognizer là bộ nhận dạng cử chỉ tiêu chuẩn trong iOS SDK để xử lý nhấn giữ. Nó kế thừa từ UIGestureRecognizer và hỗ trợ cấu hình thời lượng tối thiểu, chuyển động cho phép của ngón tay và số lần chạm. Bộ nhận dạng chuyển sang trạng thái UIGestureRecognizerStateBegan sau khi hết thời gian chờ, sau đó sang UIGestureRecognizerStateChanged khi ngón tay di chuyển và UIGestureRecognizerStateEnded khi nhả ra.
// UILongPressGestureRecognizer với cấu hình thời lượng tối thiểu
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Thời gian giữ tối thiểu: 0.5 giây
longPressRecognizer.minimumPressDuration = 0.5
// Chuyển động cho phép của ngón tay: 10 điểm
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Tạo menu ngữ cảnh
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Tham số cấu hình: minimumPressDuration — thời gian tính bằng giây trước khi kích hoạt (mặc định 0.5, cho khả năng tiếp cận khuyến nghị 0.65+); allowableMovement — chuyển động tối đa của ngón tay tính bằng điểm (mặc định 10, tăng lên giúp ích cho tay run). iOS hỗ trợ numberOfTouchesRequired cho cử chỉ đa chạm (ví dụ: nhấn giữ bằng hai ngón tay). Bộ nhận dạng cũng tích hợp với UIContextMenuInteraction — khi menu ngữ cảnh được thêm vào UIView qua UIContextMenuConfiguration, Long Press tự động gọi menu ngữ cảnh mà không cần triển khai cử chỉ thủ công.
setOnLongClickListener là phương thức View trong Android SDK để đặt trình lắng nghe nhấn giữ. Khi người dùng giữ một View hơn 500 ms, hệ thống gọi onLongClick(). Phương thức trả về boolean — true có nghĩa là sự kiện đã được xử lý và không nên truyền tiếp, false có nghĩa là sự kiện có thể được xử lý bởi các trình lắng nghe khác. Để xử lý phức tạp hơn (chuyển động ngón tay sau khi bắt đầu Long Press), GestureDetector với OnGestureListener được sử dụng.
// Ví dụ setOnLongClickListener với phản hồi xúc giác
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Phản hồi xúc giác để xác nhận bắt đầu cử chỉ
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Hiển thị menu ngữ cảnh tại vị trí phần tử
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Sự kiện đã xử lý
}GestureDetector cung cấp khả năng kiểm soát tinh vi hơn đối với cử chỉ. Không giống như setOnLongClickListener, GestureDetector thông báo về thời điểm bắt đầu (onLongPress), di chuyển (onScroll) và nhả ra. Điều này cho phép các kịch bản phức tạp — ví dụ: bắt đầu kéo sau khi nhấn giữ (Drag-and-Drop). OnGestureListener yêu cầu triển khai sáu phương thức: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press được sử dụng trong hàng chục kịch bản giao diện di động. Ứng dụng phổ biến nhất là menu ngữ cảnh: nhấn giữ vào một liên hệ hiển thị các tùy chọn liên lạc (gọi, tin nhắn, email), vào tệp — các tùy chọn (sao chép, di chuyển, xóa), vào văn bản — chọn và bảng nhớ tạm. Trình khởi chạy Android sử dụng nhấn giữ vào biểu tượng để di chuyển ứng dụng và thêm widget.
Chọn văn bản là một ví dụ cổ điển về Long Press trên cả hai nền tảng. Trên iOS, nhấn giữ vào văn bản kích hoạt kính lúp để định vị con trỏ; trên một từ — chọn từ đó với các điểm đánh dấu. Trên Android, nhấn giữ chọn toàn bộ từ và hiển thị thanh hành động (sao chép, cắt, dán). Cả hai nền tảng đều sử dụng việc kéo điểm đánh dấu sau đó để mở rộng vùng chọn.
Xem trước — trên iOS, nhấn giữ vào liên kết trong Safari hoặc tin nhắn trong Mail sẽ mở xem trước nội dung (peek). Trên Android, hành vi tương tự được triển khai qua Long Press trên thông báo (mở rộng thông báo với các nút hành động). Ứng dụng Ảnh sử dụng nhấn giữ vào hình thu nhỏ để xem trước nhanh hình ảnh.
Kéo và thả (Drag-and-Drop) thường được bắt đầu bằng Long Press. Người dùng giữ phần tử, hệ thống chuyển sang chế độ kéo và chuyển động của ngón tay di chuyển phần tử trên màn hình. Android hỗ trợ kịch bản này qua View.startDragAndDrop() sau Long Press. iOS sử dụng UIDragInteraction, trong đó tương tác kéo yêu cầu nhấn giữ để bắt đầu kéo.
Hướng dẫn giao diện người dùng của cả hai nền tảng đưa ra các khuyến nghị rõ ràng: Long Press phải luôn là hành động thứ cấp. Đừng bao giờ biến nhấn giữ thành cách duy nhất để thực hiện một chức năng quan trọng. Người dùng trước tiên thử Tap — nếu Tap không hoạt động như mong đợi, họ sẽ thất vọng. Thêm các gợi ý trực quan: menu ngữ cảnh có thể được biểu thị bằng biểu tượng ba chấm và các phần tử hỗ trợ Long Press — bằng gợi ý trực quan khi chạm.
Phản hồi xúc giác là bắt buộc đối với Long Press. Khi cử chỉ được nhận dạng, thiết bị phải xác nhận điều này bằng phản hồi xúc giác: trên iOS là UIImpactFeedbackGenerator với xung nhẹ, trên Android — HapticFeedbackConstants.LONG_PRESS. Nếu không có phản hồi xúc giác, người dùng không chắc cử chỉ đã được ghi nhận và có thể nhấn lại, gây ra các hành động không mong muốn.
| Khuyến nghị | iOS | Android |
|---|---|---|
| Thời gian chờ nhận dạng | 0.5–0.65 giây | 500 ms (mặc định) |
| Phản hồi xúc giác | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Phản hồi trực quan | Menu ngữ cảnh, làm nổi bật | PopupMenu, hiệu ứng ripple |
| Khả năng tiếp cận | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Chuyển động tối đa ngón tay | allowableMovement = 10 pt | TouchSlop (~8 dp mặc định) |
| Xung đột với cuộn | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Khả năng tiếp cận: không phải tất cả người dùng đều có thể thực hiện nhấn giữ (người khiếm khuyết vận động, người dùng lớn tuổi). Luôn cung cấp cách thay thế để truy cập các hành động Long Press — ví dụ: qua nút "Thêm" trong giao diện hoặc qua các tính năng trợ năng của hệ thống (VoiceOver trên iOS, TalkBack trên Android). Đối với iOS, bạn có thể thêm Hành động tùy chỉnh qua UIAccessibilityCustomAction, có sẵn qua bộ điều khiển VoiceOver.
Câu hỏi thường gặp
Thời gian tiêu chuẩn cho Long Press là 0,5 giây (500 ms) trên cả hai nền tảng. iOS cho phép cấu hình minimumPressDuration từ 0,3 đến 1,0 giây. Android sử dụng thời gian chờ cố định 500 ms cho View.setOnLongClickListener. Đối với người dùng có khả năng vận động hạn chế, khuyến nghị tăng thời gian chờ lên 0,8–1,0 giây.
Long Press được nhận dạng bằng thời gian giữ (0,5 giây), 3D Touch — bằng lực nhấn (gram áp lực). 3D Touch chỉ khả dụng trên iPhone 6S–XR (công nghệ Force Touch phần cứng). Bắt đầu từ iOS 13, Apple đã thay thế 3D Touch bằng Haptic Touch — mô phỏng phần mềm hoạt động qua Long Press với phản hồi xúc giác. Haptic Touch có sẵn trên tất cả iPhone và iPad hiện đại.
Xung đột giữa Long Press và cuộn là một vấn đề phổ biến. Giải pháp: đặt delaysTouchesBegan = true cho bộ nhận dạng cử chỉ trên iOS (hệ thống không gửi touchesBegan ngay lập tức mà chờ nhận dạng cử chỉ). Trên Android, sử dụng onInterceptTouchEvent trả về false cho Long Press. Nếu người dùng bắt đầu di chuyển ngón tay trước thời gian chờ, cử chỉ sẽ bị hủy để ưu tiên cuộn.
Có, Long Press được hỗ trợ trong ứng dụng web qua sự kiện touchstart/touchend với đo thời gian. Trình duyệt hiện đại cũng hỗ trợ sự kiện contextmenu, kích hoạt khi nhấn giữ trên thiết bị di động. Để tương thích đa trình duyệt, hãy sử dụng các thư viện như hammer.js hoặc triển khai bộ nhận dạng tùy chỉnh qua setInterval trong trình xử lý touchstart.
Trên iOS, phản hồi xúc giác được thêm qua UIImpactFeedbackGenerator. Gọi impactOccurred() tại thời điểm UILongPressGestureRecognizer chuyển sang trạng thái began. Để phản hồi nhẹ, sử dụng UIImpactFeedbackGenerator(style: .light). Để phản hồi rõ rệt hơn — .medium. Đối với menu ngữ cảnh, iOS tự động thêm phản hồi xúc giác qua UIContextMenuInteraction mà không cần mã bổ sung.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm