Android 触觉 API 参考

本节介绍 Android 中提供的各种触觉 API。它还介绍了何时以及如何检查任何必要的设备支持,以确保你的触觉效果按预期播放。

有几种不同的方法可以创建触觉效果,在选择这些方法时,务必考虑 Android 触觉设计原则。下表总结了每种方法的高级属性

  • 可用性在规划行为回退时尤其重要,需要与检查单个设备支持相结合。
  • 清晰的触觉 是清晰明了的感觉,对用户来说不那么刺耳。
  • 丰富的触觉 表达力更强,通常需要功能更丰富的硬件。
API 表面 可用性 清晰的触觉 丰富的触觉
HapticFeedbackConstants Android 1.5+
(每个常量)
预定义的 VibrationEffect Android 10+
VibrationEffect 组合 Android 11+ (每个常量)
开/关、一次性和波形振动 Android 1

此外,本页面描述的通知 API 允许你自定义为传入通知播放的触觉效果。

本页面还介绍了跨越 API 表面的其他概念

HapticFeedbackConstants

HapticFeedbackConstants 类提供基于操作的常量,允许应用添加在设备体验中一致的触觉反馈,而不是每个应用对常见操作都有不同的效果。

兼容性和要求

使用这些常量与View.performHapticFeedback 方法不需要应用的任何特殊权限。它受View.hapticFeedbackEnabled 属性的约束,如果将其设置为false,则将禁用视图上的所有触觉反馈调用,包括默认调用。主要相关的设置是View.hapticFeedbackEnabled 属性,如果将其设置为false,则将禁用视图上的所有触觉反馈调用,包括默认调用。该方法还会遵守用户启用触摸反馈的系统设置。

唯一需要考虑的兼容性是特定操作的常量的 SDK 级别。

使用HapticFeedbackConstants时,无需提供回退行为。

使用 HapticsFeedbackConstants

有关使用HapticFeedbackConstants 的详细信息,请参阅向事件添加触觉反馈

预定义的 VibrationEffect

VibrationEffect 类提供了一些预定义的常量,例如CLICKTICKDOUBLE_CLICK。这些效果可能针对设备进行了优化。

兼容性和要求

播放任何VibrationEffect都需要在应用清单中使用VIBRATE权限。

使用预定义的VibrationEffect时,无需提供回退行为,因为没有设备优化实现的常量会回退到标准平台回退。

Vibrator.areEffectsSupportedVibrator.areAllEffectsSupported API 用于确定是否存在设备优化实现。预定义的效果仍然可以使用,即使没有优化的实现,它也会使用标准平台回退。因此,只有当应用程序想要考虑效果是否针对设备进行了优化时,才需要这些areEffectsSupported API。

效果检查方法可以返回三个值之一

由于UNKNOWN值表示检查 API 不可用,因此它通常针对所有效果或所有效果都不返回。这些设备会动态回退。

使用预定义的 VibrationEffect

有关使用预定义VibrationEffect 的详细信息,请参阅使用预定义的 VibrationEffect 生成触觉反馈

VibrationEffect 组合

一个VibrationEffect组合是使用VibrationEffect.startComposition API 创建的振动效果。此 API 允许通过创建具有自定义延迟和强度的基元序列来实现富有表现力的丰富的触觉。但是,请特别注意确保设备支持正在组合的功能,以避免整体体验不一致。

兼容性和要求

播放任何VibrationEffect都需要在应用清单中使用VIBRATE权限。

并非所有设备都支持组合式 API 的所有功能,务必确保基元可用。

检查振动基元支持

可以使用Vibrator.arePrimitivesSupported方法检索每个基元的支持情况。或者,可以使用Vibrator.areAllPrimitivesSupported方法一起检查一组基元——这等效于对每个基元的支持进行AND运算。

使用VibrationEffect组合

有关使用VibrationEffect组合的详细信息,请参阅创建振动组合

开关、单次和波形振动

Android 上支持的最古老的振动形式是具有可配置持续时间的简单振动器开关模式。这些 API 通常与触觉设计原则不太一致,因为它们会产生嗡嗡的触觉反馈;除非万不得已,否则应避免使用它们。

开关振动的最常见用例是通知,在这种情况下,无论如何都需要一些振动。波形振动还独特地允许模式无限期重复,正如您可能想象的铃声一样。

单次模式是指振动 N 毫秒一次。

有两种类型的波形模式

  • 仅计时。这种类型的波形是对关闭和开启所花费的交替持续时间的描述。计时从关闭所花费的持续时间开始。因此,波形模式通常以零值开头,以指示立即开始振动。
  • 计时和幅度。这种类型的波形还有一个幅度数组与每个计时数字匹配,而不是第一种形式的隐式开关。但是,务必检查设备是否支持幅度控制,以确保可以实现预期的缩放。

兼容性和要求

由于开关振动是最古老的振动形式,因此这些振动几乎在所有带有振动器的设备上都受支持带有振动器,如本页后面所述。

播放任何VibrationEffect或旧样式的vibrate调用都需要应用程序清单中的VIBRATE权限。

在波形中使用不同的幅度值时,我们强烈建议您检查设备是否支持幅度控制

检查幅度控制支持

在没有幅度控制的设备上,非零幅度值将四舍五入到 100%,因此务必使用Vibrator.hasAmplitudeControl检查是否提供了支持。有关详细信息,请参阅幅度控制

您应该仔细考虑您的效果在没有幅度控制的情况下是否具有足够的质量。回退到明确设计的开关振动可能会更好。

使用开关振动

在较新的 SDK 级别中,所有振动模式都合并到单个表达式的VibrationEffect类中,其中这些简单的振动是使用VibrationEffect.createOneshotVibrationEffect.createWaveform创建的。

通知 API

自定义应用程序通知时,可以使用以下 API 之一来将模式与每个通知渠道关联

所有这些形式都采用基本的开关波形模式,如前所述,其中第一个条目是开启振动器之前的延迟。

一般概念

几个概念适用于上面详细介绍的 API 表面。

设备是否有振动器?

您可以从context.getSystemService(Vibrator.class)获取非空Vibrator类。如果设备没有振动器,则对振动 API 的调用没有任何效果,因此应用程序不需要在一个条件下阻止所有触觉反馈。但是,如果需要,应用程序可以调用hasVibrator()来确定这是一个真正的振动器(true)还是一个存根(false)。

用户是否已禁用触觉反馈?

某些自定义实现可能需要手动检查用户是否已完全禁用 Android 的触觉反馈设置,在这种情况下,应抑制触觉反馈效果。可以使用HAPTIC_FEEDBACK_ENABLED键查询此设置,其中值为零表示已禁用。

振动属性

可以提供振动属性(当前为AudioAttributes形式),以帮助告知系统振动的用途。当您的应用在后台启动振动时,这是必需的,因为仅支持用于后台使用的注意力触觉反馈。

在类文档中介绍了AudioAttributes的创建,应将其视为振动而不是声音

作为指导,在大多数情况下,内容类型为CONTENT_TYPE_SONIFICATION,用法可能是USAGE_ASSISTANCE_SONIFICATION(用于前台的触觉反馈)或USAGE_ALARM(用于后台的警报)等值。音频标志对振动没有影响。

幅度控制

如果振动器具有幅度控制,则它可以播放强度不同的振动。这对于产生丰富的触觉反馈非常重要,并且还可能允许用户控制默认的触觉强度。

可以通过调用Vibrator.hasAmplitudeControl来检查幅度控制支持。如果振动器没有幅度支持,所有幅度值都将根据它们是零/非零而映射到关闭/开启。因此,使用具有不同幅度的丰富触觉反馈的应用程序应考虑在设备缺乏幅度控制的情况下禁用它们。