触觉最基本的使用案例之一是为用户交互提供反馈。时间选择器、虚拟键盘上的按键以及文本选择都是触觉反馈良好用例的常见示例。有关何时以及如何应用触觉的更多信息,请阅读触觉设计原则。
此页面介绍了三种提供触觉反馈的方法。
- 使用
View
(推荐)。这种方法面向动作,支持范围最广,并且不需要VIBRATE
权限。 - 使用预定义的
VibrationEffect
。这种方法具有更大的灵活性,但也有一些权衡。 - 使用基本元素进行高级组合。此方法更新且更灵活,但需要特定设备支持。
这些方法使用在设备级别定义的基本元素来提供针对手持设备量身定制的高质量反馈。
所有触觉反馈方法默认都尊重用户的触摸反馈设置。
使用 View
组件生成触觉反馈
使用 View.performHapticFeedback
方法生成触觉反馈。由 HapticFeedbackConstants
定义的触觉常量侧重于其在应用程序中的功能,而不是执行的触觉效果类型。
底层实现可能因设备和硬件功能而异,但应用只需要考虑在特定上下文中提供的反馈类型。通过专注于功能,您可以为类似的交互启用触觉反馈。用户会随着时间的推移学会将不同的含义与不同的触觉感知联系起来。
先决条件:启用触觉反馈
只要 View
可见,触觉反馈就可以用于其事件。某些事件(例如长按)具有默认触觉,如果视图上的侦听器处理该事件(返回 true
),则会触发这些触觉。
Android View
可以通过将 View.hapticFeedbackEnabled
属性设置为 false
来禁用触觉反馈。禁用此属性会导致默认反馈。
该 performHapticFeedback
方法也遵守系统设置 HAPTIC_FEEDBACK_ENABLED
,它允许用户可能禁用整个系统的触觉反馈。
与其他触觉 API 不同,使用 HapticFeedbackConstants
和 View
不需要 VIBRATE
权限。
选择 HapticFeedbackConstant
当使用 HapticFeedbackConstants
与 View
组件时,无需评估特定设备的支持,因为这些常量如有必要将具有回退行为。唯一需要考虑的是所需常量的 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
方法进行播放。
此示例播放 Click 效果。
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 的方法。