Android 振动:如何控制频率和振幅(Kotlin)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么要控制 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

如今,我们有三种主要方法:

\n
    \n
  • Vibrator + VibrationEffect(API 26+)——基础但灵活。
  • \n
  • VibratorManager(API 31+)——现代方法,适用于多振动器设备。
  • \n
  • 已弃用的 Vibrator.vibrate()——仅用于向后兼容。
  • \n
\n\n

我们将重点关注前两种,因为它们提供了对频率和振幅的控制。

\n\n

准备工作:振动权限

\n\n

在引发“地震”之前,别忘了在 AndroidManifest.xml 中添加权限:

\n
<uses-permission android:name="android.permission.VIBRATE" />
\n\n

没有它,您的代码将被忽略——不会报错,但也不会产生振动。

\n\n

方法 1:VibrationEffect——控制频率和振幅(API 26+)

\n\n

VibrationEffect 类允许创建具有指定频率(通过振幅)和持续时间的振动。在 Android 中,频率不直接以赫兹为单位设置——而是使用振幅(0–255),硬件会将其转换为频率。振幅越高,振动越强。

\n\n

带振幅的简单振动

\n\n
val 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:

\n
val weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)
\n\n

振幅 255 为最大,1 几乎不可察觉。尽情尝试吧!

\n\n

模式:带停顿的振动

\n\n

有时需要的不仅仅是“叮”一声,而是脉动效果。使用 createWaveform:

\n
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\n

timings 的第一个元素是初始延迟。通常设为 0。amplitudes 必须具有相同的长度。如果传递 null 而不是振幅数组,则所有阶段都将使用最大振幅。

\n\n

方法 2:VibratorManager——适用于现代设备(API 31+)

\n\n

从 Android 12 开始,推荐使用 VibratorManager。

博客

书籍推荐