Android摇动监听(kotlin描述)——传感器系列博客1(加速度传感器)
时间:2023-09-24 00:07:02
Android摇动监听(kotlin描述)
——传感器系列博客1(加速度传感器)
在Android传感器种类繁多,充分利用传感器可以极大地丰富app功能。实现手机摇动监控的故事(如微信摇、红包等)主要用于许多传感器加速传感器。
-
通过getSystemService获得传感器管理实例:
private var sensorManager: SensorManager? = null sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
-
通过getDefaultSensor函数,传入传感器类型,获得传感器:
private var sensor: Sensor? = null sensor = sensorManager!!.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
注:此处传入加速度传感器getDefaultSensor(…)还有传入参数:
传感器类型 | 传入参数 |
---|---|
加速传感器 | Sensor.TYPE_ACCELEROMETER |
重力传感器 | TYPE_GRAVITY |
磁场传感器 | Sensor.TYPE_MAGNETIC_FIELD |
光传感器 | Sensor.TYPE_LIGHT |
温度传感器 | Sensor.TYPE_TEMPERATURE |
计步器传感器 | Sensor.TYPE_STEP_COUNTER |
旋转传感器 | Sensor.TYPE_GAME_ROTATION_VECTOR |
(Sensor还有36个类别感兴趣的朋友请自己百度)
-
注册SensorEventListener:
SensorManager.registerListener(listener: SensorEventListener, sensor: Sensor, rate: Int)
注:输入的第一个参数是SensorEventListener这里的工具类型已经继承了 了SensorEventListener,故直接写this,然后将第二个参数传入一个参数Sensor类型的,此处传入上一步:“通过getDefaultSensor传感器类型的函数,获得传感器 获得的传感器sensor。第三个参数是监控时间间隔,常用值有四个:
第三个参数值 作用 SensorManager.SENSOR_DELAY_FASTEST 最快但耗电量大,可能会影响手机的性能 SensorManager.SensorManager.SENSOR_DELAY_GAME 适用于实时性高的游戏 SensorManager.SENSOR_DELAY_UI 屏幕旋转刷新更省电 SensorManager.SENSOR_DELAY_NORMAL (默认值)刷新率低,不适合实时要求高的游戏 -
开关:
将SensorManager注册即打开,注册终止后达到关闭效果Activity其中,记得解除注册,onResume时注册
override fun onResume() { super.onResume() mSensorManager?.registerListenerthis, mSensorGyroscope, SENSOR_DELAY_GAME) }
override fun onPause() { super.onPause() mSensorManager?.unregisterListener(this) }
-
重写onSensorChanged以及onAccuracyChanged两个来自父类抽象函数:
onAccuracyChanged函数为,在精度发生改变后的处理逻辑,不需要的话直接整个空函数就好。
onSensorChanged函数,才是感应器监测到的状态发生改变时的处理逻辑应该呆的地方:
override fun onSensorChanged(event: SensorEvent) { // 速度阈值,当摇晃速度达到这值后产生作用 private val SPEED_SHRESHOLD = 2500 // 获得x,y,z坐标 val x = event.values[0] val y = event.values[1] val z = event.values[2] // 获得x,y,z的变化值 val deltaX = x - lastX val deltaY = y - lastY val deltaZ = z - lastZ // 将现在的坐标变成last坐标 lastX = x lastY = y lastZ = z //下面这个speed,速度,就是最简单的用勾股定理算距离,再把距离除以时间得出速度。 val speed = Math.sqrt((deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ).toDouble()) / timeInterval * 10000 // 达到速度阀值,发出提示 if (speed >= SPEED_SHRESHOLD) { //在此处加你想加的,摇动时的处理逻辑 } }
-
题外话,许多app在加“摇一摇”的同时,还会加上手机振动的效果,这里也顺带提一提:
1.先在AndroidManifest里面,添加个权限:
2.添加句柄:
val vibrator = context.getSystemService(Service.VIBRATOR_SERVICE) as Vibrator
3.确定振动模式:
val vibrationPattern = longArrayOf(0, 180, 80, 120)
第一个参数:等待多久后开启振动器
第二个参数:关闭振动器前保持振动器开启的毫秒数
第三个参数:每次振动之间的间隔
第四个参数:振动持续的时间
4.vibrate函数:
- vibortor.vibrate(1000) //传入持续振动的毫秒数
- vibortor.vibrate(vibrationPattern,-1) //第一个参数是Long类型的数组,上面的第三条“确定振动模式”讲过了。
//第二个参数,传入-1,振动一次,传入不是-1的数,则一直振动
5.关闭振动器:
vibortor.cancel()