触感反馈最基本的用例之一是为用户互动提供反馈。时间选择器、虚拟键盘上的按键和文本选择都是适合触感反馈的常见用例。如需详细了解何时以及如何应用触感反馈,请参阅触感反馈设计原则。
本页将介绍提供触感反馈的三种方法。
- 使用
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
。
前提条件:加载振动器和 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,请参阅创建自定义触感反馈效果。