为什么要控制 Android 上的振动?从“叮”到触觉杰作
\n\n您有没有想过,为什么有些应用程序振动起来舒适而精准,而另一些却像邻居家的电钻?关键在于振动的频率和振幅。在 Stack Overflow 上,“How to make an Android device vibrate with different frequency?”这个问题获得了数千次浏览——这并非偶然。开发者们不仅仅想要“开启振动”,而是希望创建有意义的触觉反馈:轻触、脉动警报或模拟机械按键的按压感。
\n\n在本文中,我们将探讨如何使用 Kotlin 控制 Android 上的振动。您将了解有哪些可用的 API,它们从 Android 8 到 Android 14 是如何演进的,以及哪种方法适合您的项目。让我们开始吧!
\n\n历史简述:从 Vibrator 到 VibratorManager
\n\n长期以来,Android 开发者使用 Vibrator 类和 vibrate(long milliseconds) 方法。简单,但很遗憾:无法控制频率。随着 Android 8(API 26)的推出,Google 引入了 VibrationEffect——一个用于创建复杂振动模式的强大工具。而在 Android 12(API 31)中,又增加了 VibratorManager,它允许控制多个振动器(例如,在折叠屏设备上)。
如今,我们有三种主要方法:
\n- \n
- Vibrator + VibrationEffect(API 26+)——基础但灵活。 \n
- VibratorManager(API 31+)——现代方法,适用于多振动器设备。 \n
- 已弃用的 Vibrator.vibrate()——仅用于向后兼容。 \n
我们将重点关注前两种,因为它们提供了对频率和振幅的控制。
\n\n准备工作:振动权限
\n\n在引发“地震”之前,别忘了在 AndroidManifest.xml 中添加权限:
<uses-permission android:name="android.permission.VIBRATE" />\n\n没有它,您的代码将被忽略——不会报错,但也不会产生振动。
\n\n方法 1:VibrationEffect——控制频率和振幅(API 26+)
\n\nVibrationEffect 类允许创建具有指定频率(通过振幅)和持续时间的振动。在 Android 中,频率不直接以赫兹为单位设置——而是使用振幅(0–255),硬件会将其转换为频率。振幅越高,振动越强。
带振幅的简单振动
\n\nval vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n\n// 振动 500 毫秒,最大振幅 (255)\nval effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)\nvibrator.vibrate(effect)\n\n不同频率(振幅)的振动
\n\n想要微弱的振动?指定振幅为 50:
\nval weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)\n\n振幅 255 为最大,1 几乎不可察觉。尽情尝试吧!
\n\n模式:带停顿的振动
\n\n有时需要的不仅仅是“叮”一声,而是脉动效果。使用 createWaveform:
val timings = longArrayOf(0, 200, 100, 300) // 停顿, 振动, 停顿, 振动\nval amplitudes = intArrayOf(0, 200, 0, 150) // 每个阶段的振幅\n\nval pattern = VibrationEffect.createWaveform(timings, amplitudes, -1) // -1 = 不重复\nvibrator.vibrate(pattern)\n\ntimings 的第一个元素是初始延迟。通常设为 0。amplitudes 必须具有相同的长度。如果传递 null 而不是振幅数组,则所有阶段都将使用最大振幅。
方法 2:VibratorManager——适用于现代设备(API 31+)
\n\n从 Android 12 开始,推荐使用 VibratorManager。