Long Press — 什么是长按,应用程序中的长触手势

作者: IT Sectr 发布日期: 2026-02-27 阅读时间: 8 分钟

Long Press — 长按手势,手指在屏幕上保持不动一段时间(通常为 0.5–1 秒)。与 Tap 不同,Long Press 不是在触摸瞬间被识别,而是在延迟计时器到期后。该手势用于调用上下文菜单、预览、选择多个对象和激活附加操作。在 iOS 中通过 UILongPressGestureRecognizer 实现,在 Android 中通过 setOnLongClickListener 或 GestureDetector 实现。

要点

  • 延迟 — Long Press 与 Tap 的主要区别:需要按住 0.5–1 秒
  • 上下文菜单 — Long Press 最常见的用途:为元素调用附加选项
  • UILongPressGestureRecognizer — iOS 中用于处理带状态回调的长按操作的主要类
  • setOnLongClickListener — Android View 在长按时调用监听器的方法
  • 多状态 — Long Press 在 iOS 中经历 began、changed、ended、cancelled 状态

什么是 Long Press?

Long Press(长按,长触)— 多点触控界面的一个手势,用户触摸屏幕并将手指静止保持一段时间。系统不会立即反应:它会等待超时(通常为 500 毫秒),只有在超时过后才会将手势识别为 Long Press。如果手指提前松开 — 该手势将被解释为普通 Tap。

该手势是现代移动界面的基本构建块。Apple 使用它在应用程序(Messages、Safari、Files)中调用上下文菜单。Google 将 Long Press 应用在文本选择系统、桌面图标移动和 Android 中的上下文菜单调用中。在 Web 界面中,长按通常模拟鼠标右键单击在缺少物理右键的移动设备上的操作。

从历史上看,Long Press 是作为触摸屏上下文菜单(右键单击)的替代方案出现的。最初的实现出现在电阻屏设备中(Palm、2000 年代初的 Windows Mobile),但该手势直到 iPhone 和 Android 出现后才标准化。两个平台的 Human Interface Guidelines 都将 Long Press 描述为次要操作 — 不是替代 Tap,而是功能的扩展。

Long Press 与 Tap 的区别

Long Press 和 Tap — 两种语义不同的手势。Tap(触摸)— 是一种即时按压:手指触摸屏幕并在 100–300 毫秒内松开。Tap 始终是主要操作(primary action):打开应用程序、按下按钮、跳转到链接。Long Press — 次要操作(secondary action):打开上下文菜单、开始编辑、显示附加信息。

参数TapLong Press
按住时间100–300 毫秒500–1000 毫秒
操作类型主要(primary)次要(secondary)
示例打开链接、按下按钮上下文菜单、编辑
反馈视觉(highlight)触觉(Haptic Feedback)
iOS APIUITapGestureRecognizerUILongPressGestureRecognizer
Android APIsetOnClickListenersetOnLongClickListener

关键规则:永远不要将 Long Press 作为执行操作的唯一方式。用户期望 Tap 执行主要操作,而 Long Press 打开附加选项。违反此原则(例如,要求长按才能打开链接)会导致负面用户体验和可访问性降低。

iOS 中的 Long Press:UILongPressGestureRecognizer

UILongPressGestureRecognizer — iOS SDK 中用于处理长按操作的标准手势识别器。它继承自 UIGestureRecognizer,并支持配置最短持续时间、允许的手指移动和触摸次数。识别器在计时器到期后进入 UIGestureRecognizerStateBegan 状态,然后在手指移动时进入 UIGestureRecognizerStateChanged,松开时进入 UIGestureRecognizerStateEnded。

swift
// 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 集成 — 当通过 UIContextMenuConfiguration 向 UIView 添加上下文菜单时,Long Press 会自动调用上下文菜单,无需手动实现手势。

Android 中的 Long Press:setOnLongClickListener

setOnLongClickListener — Android SDK 中 View 的设置长按监听器的方法。当用户按住 View 超过 500 毫秒时,系统调用 onLongClick()。该方法返回布尔值 — true 表示事件已处理且不应进一步传递,false 表示事件也可以由其他监听器处理。对于更复杂的处理(长按开始后手指移动),使用带有 OnGestureListener 的 GestureDetector。

kotlin
// 带触觉反馈的 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 中,类似的行为通过长按通知实现(展开带有操作按钮的通知)。照片应用程序使用长按缩略图来快速预览图像。

拖放(Drag-and-Drop)通常由 Long Press 启动。用户按住元素,系统切换到拖动模式,手指移动将元素在屏幕上移动。Android 通过 Long Press 后的 View.startDragAndDrop() 支持此场景。iOS 使用 UIDragInteraction,其中拖放交互需要长按才能开始拖动。

Long Press 使用建议

Human Interface Guidelines 两个平台都给出了明确的建议:Long Press 应始终是次要操作。永远不要将长按作为执行关键功能的唯一方式。用户首先尝试 Tap — 如果 Tap 没有按预期工作,他们会感到失望。添加视觉提示:上下文菜单可以用三点图标标记,支持 Long Press 的元素在触摸时应有视觉提示。

触觉反馈 对于 Long Press 是必需的。当手势被识别时,设备应通过触觉响应确认:在 iOS 中是 UIImpactFeedbackGenerator 的轻微脉冲,在 Android 中是 HapticFeedbackConstants.LONG_PRESS。没有触觉反馈,用户不确定手势是否成功,可能会再次按压,导致不必要的操作。

建议iOSAndroid
识别超时0.5–0.65 秒500 毫秒(默认)
触觉反馈UIImpactFeedbackGeneratorHapticFeedbackConstants.LONG_PRESS
视觉反馈上下文菜单、高亮PopupMenu、涟漪动画
无障碍(Accessibility)VoiceOver + Custom ActionsTalkBack + AccessibilityNodeInfo
最大手指移动allowableMovement = 10 ptTouchSlop(默认 ~8 dp)
与滚动的冲突cancelsTouchesInView = delayedonInterceptTouchEvent + LongPress

无障碍:并非所有用户都能执行长按(运动障碍人士、老年用户)。始终提供访问 Long Press 操作的替代方式 — 例如,通过界面中的「更多」按钮或通过系统辅助功能(iOS 中的 VoiceOver、Android 中的 TalkBack)。对于 iOS,可以在 UIAccessibilityCustomAction 中添加 Custom Actions,通过 VoiceOver 转子即可访问。

常见问题

Long Press 的标准按住时间是多少?

Long Press 的标准时间在两个平台上都是 0.5 秒(500 毫秒)。iOS 允许将 minimumPressDuration 设置为 0.3 到 1.0 秒。Android 对 View.setOnLongClickListener 使用固定的 500 毫秒超时。对于行动不便的用户,建议将超时增加到 0.8–1.0 秒。

Long Press 和 3D Touch 有什么区别?

Long Press 根据按住时间(0.5 秒)识别,3D Touch 根据按压力度(克压力)识别。3D Touch 仅在 iPhone 6S–XR 上可用(硬件 Force Touch 技术)。从 iOS 13 开始,Apple 用 Haptic Touch 取代了 3D Touch — 一种通过 Long Press 配合触觉反馈工作的软件模拟。Haptic Touch 在所有现代 iPhone 和 iPad 上均可使用。

如何避免 Long Press 与滚动(ScrollView)冲突?

Long Press 和滚动 的冲突是一个常见问题。解决方案:在 iOS 中为手势识别器设置 delaysTouchesBegan = true(系统不会立即发送 touchesBegan,而是等待手势识别)。在 Android 中,使用为 Long Press 返回 false 的 onInterceptTouchEvent。如果用户在超时前开始移动手指 — 手势将被取消,优先进行滚动。

Long Press 可以用于 Web 应用程序(PWA)吗?

是的,Long Press 在 Web 应用程序中受到支持,通过带有时间测量的 touchstart/touchend 事件实现。现代浏览器还支持 contextmenu 事件,该事件在移动设备上长按时触发。为了跨浏览器兼容性,请使用 hammer.js 等库,或在 touchstart 处理程序中通过 setInterval 实现自定义识别器。

如何在 iOS 中为 Long Press 添加触觉反馈?

在 iOS 中,触觉反馈通过 UIImpactFeedbackGenerator 添加。在 UILongPressGestureRecognizer 进入 began 状态时调用 impactOccurred()。对于轻微响应,使用 UIImpactFeedbackGenerator(style: .light)。对于更明显的响应 — .medium。对于上下文菜单,iOS 通过 UIContextMenuInteraction 自动添加触觉反馈,无需额外代码。

总结

  • Long Press — 在屏幕上按住手指 0.5–1 秒以调用次要操作的手势
  • 与 Tap 的区别 — Tap 立即执行(主要操作),Long Press 需要超时(次要操作)
  • iOS API — UILongPressGestureRecognizer,带有 minimumPressDuration 和 allowableMovement 参数
  • Android API — View.setOnLongClickListener 和 GestureDetector.OnGestureListener
  • 应用 — 上下文菜单、文本选择、预览、启动拖放
  • 触觉反馈 — 必须向用户确认手势识别
  • 无障碍 — 始终提供 Long Press 操作的替代访问方式

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读