前言
目前市场上很多应用都有着摇一摇功能,晃动手机就能够达到页面跳转等效果,本期我们实现一个简单的摇一摇功能Android demo。
一、Android平台传感器
在实现摇一摇功能之前,我们首先对Android 平台的传感器进行简单说明。
多数的Android手机中都有着内置传感器,用来测量运动,屏幕方向和各种环境条件。这些传感器能够提供比较高精度的原始数据,对于设备的定位,三维移动及设备周围环境的变化能够进行监测。
1. 传感器类型
那么Android平台支持的传感器有哪些呢?
通常来说,Android平台支持的三大类:
- 动态传感器
这类传感器可以测量三维方向上的加速力和旋转力.
- 环境传感器
这类传感器测量各种环境参数,包括有环境气温、气压和湿度等等.
- 位置传感器
这类传感器测量设备的物理位置。
2. 摇一摇实现原理分析
显然摇一摇动作时需要对动态传感器进行监听,通过对传感器获得的加速度参数进行判断,判断用户是否摇动了手机。
从上述的传感器类型上来看,我们需要使用的是动态传感器。
二、Android动态传感器
Android平台支持多种动态传感器,常用的几项如下:
传感器 | 说明 | 单位 |
---|---|---|
TYPE_ACCELEROMETER | 三维方向的加速力(包括重力) | m/s^2 |
TYPE_GRAVITY | 三维方向的重力 | m/s^2 |
TYPE_GYROSCOPE | 沿三维方向的旋转力 | 弧度/秒 |
TYPE_LINEAR_ACCELERATION | 三维方向的加速力(不包括重力) | m/s^2 |
TYPE_STEP_COUNTER | 已激活传感器最后一次重新启动以来用户迈出的步数。 | 步数 |
上面便是常见的Android支持的动态传感器了,详细说明可以参考Android传感器说明官方文档.
本文着重说明的是TYPE_ACCELEROMETER
来实现摇一摇监听。
三、代码实现
首先我们需要实现一个加速度传感器的实例:
private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
然后我们需要设置一个监听,通过计算三维方向上的加速度变化率来决定摇一摇动作是否要被触发:
private SensorEventListener listener;
...
listener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
try {
long currentTime = System.currentTimeMillis();
if (timeInterval > currentTime - lastTime) {
return;//如果两次回调间隔过小,直接忽略
}
//读取传感器监听到加速度 m/(s^2)
float[] values = event.values;
if(!isInitPosition){
//手机的状态不同,其x,y,z的值不同,重新对x,y,z赋值
lastX = values[0];
lastY = values[1];
lastZ = values[2];
//仅限在初始化赋值
isInitPosition = true;
}
float x = values[0];
float y = values[1];
float z = values[2];
//计算和上次的变化值
float deltaX = x - lastX;
float deltaY = y - lastY;
float deltaZ = z - lastZ;
//更新变化值
lastX = x;
lastY = y;
lastZ = z;
//计算灵敏度 m/(s^3)
double speed = (Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval) * 1000;
if (speed > acceleration) {
//回调执行
if (iSensorCallBack != null) {
iSensorCallBack.action();
}
lastTime = System.currentTimeMillis();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
其中iSensorCallBack是我们设置的一个监听回调:
/**
* 监听回调
*/
public interface ISensorCallBack {
/**
* 摇一摇触发后的动作
*/
void action();
}
这样摇一摇动作的监听及回调就基本设置完成了。
但是在使用动态传感器时还需要注意传感器的监听注册及取消注册,API为我们提供了方法:
/**
* 注册监听
*/
public void register() {
if (sensorManager != null && sensor != null && listener != null) {
isRegisterSuccess = sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI);
}
}
/**
* 取消监听注册
*/
public void unregister() {
if (sensorManager != null && sensor != null && listener != null && isRegisterSuccess) {
sensorManager.unregisterListener(listener, sensor);
}
}
这样的话我们就可以在需要使用摇一摇功能是调用register
方法注册,而在需要停止摇一摇监听时调用unregister
移除注册。
如果要使得动态传感器监听生效,在使用前务必要执行传感器注册方法。
如上,这样我们就实现了一个摇一摇简单demo。