Google 致力于为黑人社区推动种族平等。查看具体举措

触感反馈框架的用户体验基础

所有围绕触感反馈构建的 Android 框架改进都由一组用户体验原则驱动,这些原则正在以相同的速率改进。当前的原则包括将蜂鸣振动替换为清晰触感反馈,以及探索丰富触感反馈。

用户体验原则

图 1. 当前原则

按年份列举的 API

图 2. 按年份列举的触感反馈 API

蜂鸣振动

早在寻呼机和非智能手机时代,低质量但节能的 ERM 蜂鸣器振动就已经被用来代替静音模式下的听觉铃声。旧版硬件组件会产生令人不悦的较大的可听噪声,并且往往质量不佳(例如廉价、破损的手机),会损害触感反馈用户体验。

清晰触感反馈

清晰触感反馈支持感知离散状态变化(例如,电源开/关过程中的二进制文件变化)。由于离散特征的性质,系统会将清晰触感反馈生成为单个实体(例如,每个输入事件有一个触感反馈效果)。

安卓的目标是提供清晰触感反馈,有强烈而尖锐的感觉,而不是蜂鸣或轻柔的感觉。

为提供清晰触感反馈而创建的预定义触感反馈常量包括以下内容。

HapticFeedbackConstants

  • CLOCK_TICK
  • CONFIRM
  • CONTEXT_CLICK
  • GESTURE_END
  • GESTURE_START
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • KEYBOARD_TAP
  • LONG_PRESS
  • REJECT
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY
  • VIRTUAL_KEY_RELEASE

VibrationEffect

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

在设备制造商和开发者之间建立共识对于提升 Android 生态系统的总体触感反馈质量至关重要。使用基本核对清单硬件评估CDD,详细了解触感反馈实现。

按下和松开

图 3. 按下和松开。

丰富触感反馈

丰富触感反馈是一个不断变化的触感反馈类别,超越了基于单个脉冲的效果。Android 旨在提供丰富触感反馈,以实现更高组合性和可调性,并提供精细粒度。Android 11 或更低版本支持以下用例。

丰富触感反馈

图 4. 带滑动纹理的丰富触感反馈

拖动和滑动

图 5.拖动和滑动

用例 1:滑动纹理

如果在手指滑过触控面时触感反馈效果重复(例如,拖动、滑动、探索具有幻觉触感纹理的表面),重复的触感反馈效果最好是清脆而不易察觉。

如果个别效果产生蜂鸣而不清脆,重复之间的间隔很可能已被抹去。结果会导致一声长时间的蜂鸣声,而不是出现多个离散信号。

如果振幅不够小,感知的触感反馈能量会在重复过程中不断累积,从而在重复结束时产生非常强烈的触感反馈。

实现用于滑动和拖动手势的简单表面触感纹理

HapticFeedbackConstants 中使用 CLOCK_TICKTEXT_HANDLE_MOVE。这些常量预定义了重复和振幅的特性。

创建您的专属效果

如需创建您的专属效果,请通过将 VibrationEffect.Composition 中的 PRIMITIVE_CLICKPRIMITIVE_TICK 序列组合在一起,以构建设计。您可以使用 addPrimitive(int primitiveID, float scale, int delay) 调整重复和振幅比例的特征。是否支持依赖于振动器 HAL 接口CAP_COMPOSE_EFFECTS 功能。

用例 2:带缓入效果的长时间振动

长时间振动是从 0 转换到目标振幅的平滑振幅振动。长时间振动会产生容易感知和引起注意的触感反馈。然而,在安静的环境中,突发的长时间振动可能会使用户受到惊吓,并且通常会产生可听的蜂鸣噪声。如需生成更令人愉悦的长时间振动,请在长时间振动开始时应用缓入效果。这样会产生一个平滑的振幅过渡,从而累积达到目标振幅。

应用缓入效果

  1. 使用 android.os.Vibrator.hasAmplitudeControl() 检查振幅控制的硬件功能。

    • 结果必须为 true,才能产生不同振幅的缓入效果。
  2. 使用 VibrationEffect.createWaveform(timings[], amplitudes[], int repeat)

  3. 调整 timings[]amplitudes[] 系列以生成缓入曲线,如图 6 所示。

长时间振动

图 6. 长时间振动缓入曲线

用例 3:音频耦合触感反馈

音频耦合触感反馈是指将触感反馈模式与音频节奏相结合,以引起用户的注意。

音频耦合触感反馈:优势

如需实现音频耦合触感反馈,请将清晰触感反馈与长时间振动相结合。清晰触感反馈强烈而短暂的触感反馈感受能产生一种有节奏的离散模式。如果再加上长时间振动所带来的高刺激,就能很好地吸引用户的注意。

请务必考虑感觉节奏模式。如果没有节奏感,用户就会将触感反馈感知为随机蜂鸣声,并倾向于忽略它们。

音频耦合

图 7. 音频耦合触感反馈示例

音频耦合触感反馈:实现方法提示

如需实现音频耦合触感反馈,需要对音频和触感反馈通道的内容播放有基本的了解。请注意以下几点。

  • 使用 MediaPlayerSoundPool 类。

    • OGG 格式的资源带有一个特殊的元数据键(ANDROID_HAPTIC 后跟很多触感反馈通道),表示存在触感反馈数据,可以用 MediaPlayerSoundPool 播放。
  • 表示支持 audio_policy_configuration.xml 中的触感反馈和音频播放。

    • 使用具有触感反馈通道 AUDIO_CHANNEL_OUT_HAPTIC_A|B 的输出配置文件。
    • 对于带有触感反馈通道的输出流,请记住,触感反馈通道在数据中表示为 extra 通道。

    示例

    如果输出流的通道掩码如下所示:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    那么每个示例应如下所示:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) 更改

    false 以播放触感反馈通道。

    • 默认情况下,触感反馈通道会被静音 (true)。
    • 用例包括具有同步触感反馈和反馈的铃声和界面声音。
  • 振动器 HAL 必须实现外部控件支持。

音频耦合触感反馈

图 8. 实现音频耦合触感反馈