Android手机震动主要用到的类是Vibrator类。该类作为一个系统级的服务类,可以通过getSystemServic(Context.VIBRATOR_SERVICE)来获取该类的实例。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
该类主要包含的方法如下:
//判断是否正在震动
public boolean hasVibrator()
//取消震动
public void cancel()
//开启震动,参数milliseconds为震动时间,单位为毫秒
public void vibrate(long milliseconds)
//开启震动
public void vibrate(long[] pattern, int repeat)
最后一个震动方法的参数解释:
vibrate(longArrayOf(1000, 3000, 5000, 8000), 1)
1000表示系统在1秒钟后开始震动,3000表示系统震动3秒钟,5000表示系统在5秒钟之后开始震动,8000表示系统震动8秒钟。也是就说,如果不重复,整个震动完成的时间为1+3+5+8=17秒钟。repeat表示重复震动的模式的索引。如果不重复可以传递-1。repeat的取值范围为0到pattern的长度-1,上面的repeat的取值范围为0~3。当repeat参数大于取值范围时,会抛出数组下标越界异常。上面的参数为1表示从pattern数组索引为1时开始重复震动。也就是说,当第一次震动结束后重复震动时,会先停止3秒,在震动5秒,在停止8秒。这样重复震动。震动会在一定时间后停止。
开启震动功能需要获取震动权限,该权限不是危险权限,只要在manifests文件中声明就行。
<uses-permission android:name="android.permission.VIBRATE"/>
Android8.0后
在Android8.0(api26)后,系统添加了对震幅的控制。要判断硬件是否支持对震幅的控制可以调用:
//判断硬件是否支持控制振幅
public boolean hasAmplitudeControl()
上述的两个震动方法也已经被标记过时。取而代之的是:
//开启震动
public void vibrate(VibrationEffect vibe)
VibrationEffect封装了震动幅度和震动时间,通过VibrationEffect的多种静态方法可以获得一个VibrationEffect的实例:
//创建一个VibrationEffect的实例
//参数milliseconds表示震动时间
//参数amplitude表示震动幅度,取值范围为0-255。或者传入VibrationEffect.DEFAULT_AMPLITUDE表示默认的震动幅度
public static VibrationEffect createOneShot(long milliseconds, int amplitude)
//创建一个VibrationEffect的实例
//参数解释和上面vibrate(long[] pattern, int repeat)一样,每次的震动幅度都是默认幅度
public static VibrationEffect createWaveform(long[] timings, int repeat)
//创建一个VibrationEffect的实例
//添加了对每一次震动幅度的控制
public static VibrationEffect createWaveform(long[] timings, int[] amplitudes, int repeat)
//创建一个预定义震动效果VibrationEffect的实例
//包括VibrationEffect.EFFECT_CLICK,VibrationEffect.EFFECT_DOUBLE_CLICK,VibrationEffect.EFFECT_TICK,VibrationEffect.EFFECT_HEAVY_CLICK
public static VibrationEffect createPredefined(@EffectType int effectId)