前言
要想实现"摇一摇"需要使用到系统传感器,由于属于冷门知识点,所以趁着还记得,写了一个工具类,以后需要时候的时候就可以机智的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();