前言
要想实现"摇一摇"需要使用到系统传感器,由于属于冷门知识点,所以趁着还记得,写了一个工具类,以后需要时候的时候就可以机智的ctrl_c、ctrl_v了
代码实现
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class SensorManagerHelper implements SensorEventListener {
// 传感器管理器
private SensorManager mSensorManager;
// 传感器
private Sensor mSensor;
// 速度阈值,当摇晃速度达到这值后产生作用
private static int SPEED_SHRESHOLD = 4000;
// 两次检测的时间间隔
private static int UPTATE_INTERVAL_TIME = 50;
// 两次回调的间隔时间
private static int CALL_BACK_INTERVAL_TIME = 1000;
// 手机上一个位置时重力感应坐标
private float lastX;
private float lastY;
private float lastZ;
// 上次检测时间
private long mLastUpdateTime;
// 上次回调的时间
private long mLastCallBackTime;
// 摇动监控回调
private OnShakeListener mOnShakeListener;
public SensorManagerHelper() {
}
/**
* 开始监听摇一摇事件
* <p>
* 注意:在不使用的时候必须调用stop()方法防止泄漏
*/
public void start(Context context) {
// 获得传感器管理器
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager != null) {
// 获得重力传感器
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
// 注册
if (mSensor != null) {
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
}
}
/**
* 停止监听摇一摇事件
*/
public void stop() {
if (mSensorManager != null) {
mSensorManager.unregisterListener(this);
mSensor = null;
mSensorManager = null;
}
}
/**
* 摇动监听回调
*/
public interface OnShakeListener {
public void onShake();
}
/**
* 设置遥控监听回调
*/
public void setOnShakeListener(OnShakeListener listener) {
mOnShakeListener = listener;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
// 现在检测时间
long currentUpdateTime = System.currentTimeMillis();
// 两次检测的时间间隔
long timeInterval = currentUpdateTime - mLastUpdateTime;
// 判断是否达到了检测时间间隔
if (timeInterval < UPTATE_INTERVAL_TIME) {
return;
}
// 现在的时间变成last时间
mLastUpdateTime = currentUpdateTime;
// 获得x,y,z坐标
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// 获得x,y,z的变化值
float deltaX = x - lastX;
float deltaY = y - lastY;
float deltaZ = z - lastZ;
// 将现在的坐标变成last坐标
lastX = x;
lastY = y;
lastZ = z;
double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000;
// 达到速度阀值,发出提示
if (speed >= SPEED_SHRESHOLD && mOnShakeListener != null) {
// 防止多次回调,1s回调一次
if (System.currentTimeMillis() - mLastCallBackTime > CALL_BACK_INTERVAL_TIME) {
mOnShakeListener.onShake();
mLastCallBackTime = System.currentTimeMillis();
}
}
}
}
在代码中的调用
// 摇一摇帮助类
private SensorManagerHelper mSensorManagerHelper = new SensorManagerHelper();
//在需要监听的时候调用star()方法,与stop方法成对使用
mSensorManagerHelper.start(this);
mSensorManagerHelper.setOnShakeListener(new OnShakeListener() {
@Override
public void onShake() {
Toast.makeText(MainActivity.this, "摇摇晃晃", Toast.LENGTH_SHORT).show();
}
});
//回收资源
mSensorManagerHelper.stop();