为事件添加触感反馈

触感反馈最基本的用例之一就是为用户提供反馈 互动。时间选择器、虚拟键盘上的按键,以及文本 选择是不错的触感反馈用例的常见示例。有关 有关何时以及如何应用触感反馈的信息,请参阅 触感反馈设计原则

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

这些方法使用在设备级别定义的基元来提供高质量的 针对手持设备提供量身定制的反馈

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

使用 View 组件生成触感反馈

使用 View.performHapticFeedback 方法生成触感反馈。通过 由 HapticFeedbackConstants 定义的触感反馈常量聚焦于 功能,而不是所执行的触感反馈效果的类型。

底层实现可能因设备和硬件而异 功能,但应用只需考虑提供的反馈类型 特定上下文。通过专注于功能,您可以启用触感反馈 针对类似互动提供反馈。用户学会如何将不同含义联系起来 不同的触感反馈。

前提条件:启用触感反馈

只要 View 可见,触感反馈就可以用于其事件。 某些事件(例如长按)具有默认触感反馈,如果 视图上的监听器处理事件(返回 true)。

Android View 可以通过设置 将 View.hapticFeedbackEnabled 属性设置为 false。停用此媒体资源 会生成默认反馈。

performHapticFeedback 方法还会遵循系统设置 HAPTIC_FEEDBACK_ENABLED:让用户可以将其停用 整个系统。

与其他触感反馈 API 不同,将 HapticFeedbackConstantsView 结合使用 不需要 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 等 API 和 Vibrator.areAllEffectsSupported 用于确定设备是否 常量的自定义实现。如果自定义效果 应用仍然可以播放音效,并使用平台定义的 后备实现

有关详情,请参阅预定义 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.Composition API 为 触感反馈。不过,与效果不同,这些基元 系统级别的回退,这意味着需要格外注意 设备支持的基元和其他功能。

有关如何使用这些 API 的详情,请参阅 创建自定义触感反馈效果