触感反馈最基本的用例之一是为用户交互提供反馈。时间选择器、虚拟键盘上的按键以及文本选择都是触感反馈的常见且良好的用例。有关何时以及如何应用触感反馈的详细信息,请阅读触感设计原则。
本页面介绍了提供触感反馈的三种方法。
- 使用
View(推荐)。此方法以操作为导向,支持范围最广,并且不需要VIBRATE权限。 - 使用预定义的
VibrationEffect。此方法具有更高的灵活性,但需要权衡一些因素。 - 使用基元进行高级合成。此方法较新且更灵活,但需要特定的设备支持。
这些方法使用设备级定义的基元,以提供针对手头设备量身定制的高质量反馈。
所有触感反馈方法默认都会遵循用户的触摸反馈设置。
使用 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。
前提条件:加载 Vibrator 和 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 的更详细讨论,请参阅创建自定义触感效果。