本节介绍 Android 中提供的各种触觉 API。它还介绍了何时以及如何检查任何必要的设备支持,以确保你的触觉效果按预期播放。
有几种不同的方法可以创建触觉效果,在选择这些方法时,务必考虑 Android 触觉设计原则。下表总结了每种方法的高级属性
API 表面 | 可用性 | 清晰的触觉 | 丰富的触觉 |
---|---|---|---|
HapticFeedbackConstants | Android 1.5+ (每个常量) |
||
预定义的 VibrationEffect | Android 10+ | ||
VibrationEffect 组合 | Android 11+ (每个常量) | ||
开/关、一次性和波形振动 | Android 1 |
此外,本页面描述的通知 API 允许你自定义为传入通知播放的触觉效果。
本页面还介绍了跨越 API 表面的其他概念
- 设备是否有振动器?
- 幅度控制 允许更平滑、更丰富的触觉效果,但并非所有设备都支持。
VibrationAttributes()
可以帮助你根据其用途对振动进行分类,确保将适当的用户设置应用于它,从而避免给用户带来意外。
HapticFeedbackConstants
HapticFeedbackConstants
类提供基于操作的常量,允许应用添加在设备体验中一致的触觉反馈,而不是每个应用对常见操作都有不同的效果。
兼容性和要求
使用这些常量与View.performHapticFeedback
方法不需要应用的任何特殊权限。它受View.hapticFeedbackEnabled
属性的约束,如果将其设置为false
,则将禁用视图上的所有触觉反馈调用,包括默认调用。主要相关的设置是View.hapticFeedbackEnabled
属性,如果将其设置为false
,则将禁用视图上的所有触觉反馈调用,包括默认调用。该方法还会遵守用户启用触摸反馈的系统设置。
唯一需要考虑的兼容性是特定操作的常量的 SDK 级别。
使用HapticFeedbackConstants
时,无需提供回退行为。
使用 HapticsFeedbackConstants
有关使用HapticFeedbackConstants
的详细信息,请参阅向事件添加触觉反馈。
预定义的 VibrationEffect
VibrationEffect
类提供了一些预定义的常量,例如CLICK
、TICK
和DOUBLE_CLICK
。这些效果可能针对设备进行了优化。
兼容性和要求
播放任何VibrationEffect
都需要在应用清单中使用VIBRATE
权限。
使用预定义的VibrationEffect
时,无需提供回退行为,因为没有设备优化实现的常量会回退到标准平台回退。
Vibrator.areEffectsSupported
和Vibrator.areAllEffectsSupported
API 用于确定是否存在设备优化实现。预定义的效果仍然可以使用,即使没有优化的实现,它也会使用标准平台回退。因此,只有当应用程序想要考虑效果是否针对设备进行了优化时,才需要这些areEffectsSupported
API。
效果检查方法可以返回三个值之一
VIBRATION_EFFECT_SUPPORT_YES
表示设备对此效果具有优化的支持。VIBRATION_EFFECT_SUPPORT_NO
表示设备没有优化的支持,但仍然使用平台回退。VIBRATION_EFFECT_SUPPORT_UNKNOWN
表示系统不知道实现是否已优化。
由于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.createOneshot
或VibrationEffect.createWaveform
创建的。
通知 API
自定义应用程序通知时,可以使用以下 API 之一来将模式与每个通知渠道关联
- AndroidX
- Android
所有这些形式都采用基本的开关波形模式,如前所述,其中第一个条目是开启振动器之前的延迟。
一般概念
几个概念适用于上面详细介绍的 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
来检查幅度控制支持。如果振动器没有幅度支持,所有幅度值都将根据它们是零/非零而映射到关闭/开启。因此,使用具有不同幅度的丰富触觉反馈的应用程序应考虑在设备缺乏幅度控制的情况下禁用它们。