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) |
| ตัวอย่าง | เปิดลิงก์ กดปุ่ม | เมนูบริบท การแก้ไข |
| การตอบสนอง | ภาพ (ไฮไลต์) | สัมผัส (การตอบสนองแบบสัมผัส) |
| 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 มิลลิวินาที ระบบจะเรียก onLongClick() เมธอดส่งค่าบูลีนคืน — 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 ซึ่งการโต้ตอบแบบลากต้องใช้การกดค้างเพื่อเริ่มลาก
คู่มืออินเทอร์เฟซมนุษย์ของทั้งสองแพลตฟอร์มให้คำแนะนำที่ชัดเจน: 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 |
| การเข้าถึง | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| การเคลื่อนไหวนิ้วสูงสุด | allowableMovement = 10 จุด | TouchSlop (~8 dp ค่าเริ่มต้น) |
| ข้อขัดแย้งกับการเลื่อน | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
การเข้าถึง: ไม่ใช่ผู้ใช้ทุกคนที่สามารถกดค้างได้ (ผู้ที่มีความบกพร่องทางการเคลื่อนไหว ผู้สูงอายุ) จัดเตรียมวิธีการอื่นในการเข้าถึงการดำเนินการ Long Press เสมอ — เช่น ผ่านปุ่ม "เพิ่มเติม" ในอินเทอร์เฟซ หรือผ่านคุณสมบัติการเข้าถึงของระบบ (VoiceOver ใน iOS, TalkBack ใน Android) สำหรับ iOS คุณสามารถเพิ่มการดำเนินการแบบกำหนดเองผ่าน 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 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม