为事件添加触感反馈

使用 View 组件、预定义的 VibrationEffect API 和时间轴锚定组合(通过 VibrationEffect.Builder)在 Android 应用中实现触感反馈。 keywords_public: > Android 开发、触感、触感反馈、界面、视图、VibrationEffect、View.performHapticFeedback、Vibrator、触感常量

触感反馈最基本的应用场景之一是为用户互动提供反馈。时间选择器、虚拟键盘上的按键和文本选择是触感反馈的常见优秀应用场景。如需详细了解何时以及如何应用触感反馈,请参阅触感反馈设计原则。

本页介绍了提供触感反馈的三种方式。

这些方法使用设备级定义的基元来提供根据手持设备量身定制的高质量反馈。

默认情况下,所有触感反馈方法都会遵循用户的触感反馈设置。

使用 View 组件生成触感反馈

使用 View.performHapticFeedback 方法生成触感反馈。由 HapticFeedbackConstants 定义的触感反馈常量侧重于其在应用中的功能,而不是执行的触感反馈效果类型。

底层实现可能会因设备和硬件功能而异,但应用只需考虑在特定情境中提供哪种类型的反馈。通过专注于功能,您可以为类似互动启用触感反馈。随着时间的推移,用户会逐渐学会将不同的触感与不同的含义相关联。

前提条件:启用触感反馈

只要 View 可见,就可以使用触感反馈来处理其事件。某些事件(例如触摸并按住)具有默认的触感反馈,如果视图上的监听器处理该事件(返回 true),则会触发这些触感反馈。

Android View 可以通过将 View.hapticFeedbackEnabled 属性设置为 false 来停用触感反馈。停用此属性会导致系统提供默认反馈。

performHapticFeedback 方法还会遵循系统设置 HAPTIC_FEEDBACK_ENABLED,这允许用户可能针对整个系统停用它们。

与其他触感 API 不同,将 HapticFeedbackConstants 与 View 搭配使用时不需要 VIBRATE 权限。

选择一个HapticFeedbackConstant

将 View 组件与 HapticFeedbackConstants 搭配使用时,无需评估特定设备支持情况,因为这些常量会在必要时具有回退行为。唯一需要考虑的是所需常量的 SDK 级别。

示例 1:按键

以下示例展示了如何在 View 中使用触摸监听器为触摸输入添加触感反馈。这些效果可模拟按压按钮然后松开按钮的感觉。

Kotlin

class HapticTouchListener : View.OnTouchListener {
  override fun onTouch(View view, MotionEvent event) : Boolean {
    when (event.actionMasked) {
      MotionEvent.ACTION_DOWN ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
      MotionEvent.ACTION_UP ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE)
    }
    return true
  }
}

Java

class HapticTouchListener implements View.OnTouchListener {
  @Override
  public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
        break;
      case MotionEvent.ACTION_UP:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE);
        break;
    }
    return true;
  }
}

示例 2:“提交”按钮

触感反馈用例不仅限于模拟与设备的物理互动。它们也可能用于传达抽象含义。例如,CONFIRM 效果的一般预期是短暂而轻微的振动,而 REJECT 可能是更强烈的反馈,用于指示失败。以下示例展示了提交按钮反馈。

Kotlin

submitButton.setOnClickListener { view ->
  val successful = performSubmit()
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM)
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT)
  }
}

Java

submitButton.setOnClickListener(view -> {
  boolean successful = performSubmit();
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM);
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT);
  }
});

使用预定义的 VibrationEffect 生成触感反馈

使用基于 View 的方法侧重于用户互动,因此建议使用此方法以确保整个系统的一致性。不过,您也可以调用特定的预定义 VibrationEffect API 来实现自定义触感反馈效果。

预定义效果以 VibrationEffect 常量的形式提供,并且可以检查是否受支持,以及通过 Vibrator 服务播放,如下例所示。

了解设备对 VibrationEffect API 的支持情况

在基本使用场景中,无需检查对各个 VibrationEffect API 的支持情况。Vibrator.areEffectsSupported 和 Vibrator.areAllEffectsSupported 等 API 用于确定设备是否具有常量的自定义实现。如果不存在自定义效果,应用仍可以播放效果并使用平台定义的后备实现。

如需了解详情,请参阅预定义的 VibrationEffect。

前提条件:加载振动器和 VIBRATE 权限

大多数振动都可以通过 Vibrator 服务播放,该服务可按如下方式加载:

Kotlin

import android.os.Vibrator

val vibrator = context.getSystemService(Vibrator::class.java)

Java

import android.os.Vibrator;

Vibrator vibrator = context.getSystemService(Vibrator.class);

您的应用必须拥有 VIBRATE 权限才能使用此服务使设备振动。您可以将此权限添加到应用清单文件:

<uses-permission android:name="android.permission.VIBRATE"/>

播放预定义的 VibrationEffect

可以使用 VibrationEffect.createPredefined 准备预定义的效果,然后使用 Vibrator 上的 vibrate 方法之一播放这些效果。

此示例播放点击效果。

Kotlin

val vibrator = context.getSystemService(Vibrator::class.java)
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))

Java

Vibrator vibrator = context.getSystemService(Vibrator.class);
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));

使用 VibrationEffect.Builder 创建乐曲

从 Android 16(2026 年第 4 季度)开始,VibrationEffect.Builder API 提供了一种最灵活、最富有表现力的方式来创建自定义触感反馈,方法是在时间轴上按顺序排列离散的预设、包络和其他振动元素。此外,使用 VibrationEffect.Builder 创建的合成在支持的元素中内置了自动回退支持。

有关如何使用 VibrationEffect.Builder(以及 VibrationEffect.Composition API)组合触感反馈效果的更多详情,请参阅创建自定义触感反馈效果。