Android手機搖一搖的實現SensorEventListener
package com.example.shakeactivity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class ShakeListener implements SensorEventListener { /* Sensor 說明 * Sensor.TYPE_ACCELEROMETER 加速度感應檢測 * Sensor.TYPE_MAGNETIC_FIELD 磁場感應檢測 * Sensor.TYPE_ORIENTATION 方位感應檢測 * Sensor.TYPE_GYROSCOPE 回轉儀感應檢測 * Sensor.TYPE_LIGHT 亮度感應檢測 * Sensor.TYPE_PRESSURE 壓力感應檢測 * Sensor.TYPE_TEMPERATURE 溫度感應檢測 * Sensor.TYPE_PROXIMITY 接近感應檢測 * SENSOR_DELAY_FASTEST 最低延遲。一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗。因為傳遞的為原始數據,算法不處理好將會影響遊戲邏輯和UI的性能,所以不推薦使用。* SENSOR_DELAY_GAME 遊戲延遲,一般絕大多數的實時性較高的遊戲都使用該級別 * SENSOR_DELAY_NORMAL 標準延遲,對於一般的益智類或EASY級別的遊戲能夠使用,但過低的採樣率可能對一些賽車類遊戲有跳幀現象。
* SENSOR_DELAY_UI 用戶界面延遲。一般對於屏幕方向自己主動旋轉使用,相對節省電能和邏輯處理,一般遊戲開發中我們不使用。 */ private static final int FORCE_THRESHOLD = 350; private static final int TIME_THRESHOLD = 100; private static final int SHAKE_TIMEOUT = 500; private static final int SHAKE_DURATION = 1000; private static final int SHAKE_COUNT = 6; private SensorManager mSensorMgr; private float mLastX = -1.0f, mLastY = -1.0f, mLastZ = -1.0f; private long mLastTime; private OnShakeListener mShakeListener; private Context mContext; private int mShakeCount = 0; private long mLastShake; private long mLastForce; public interface OnShakeListener { public void onShake(); //public void onShakeHorizontal(); //public void onShakeVertical(); } public ShakeListener(Context context) { mContext = context; resume(); } public void setOnShakeListener(OnShakeListener listener) { mShakeListener = listener; } public void resume() { mSensorMgr = (SensorManager) mContext .getSystemService(Context.SENSOR_SERVICE); if (mSensorMgr == null) { throw new UnsupportedOperationException("Sensors not supported"); } boolean supported = mSensorMgr.registerListener(this, mSensorMgr .getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); if (!supported) { mSensorMgr.unregisterListener(this); throw new UnsupportedOperationException( "Accelerometer not supported"); } } public void pause() { if (mSensorMgr != null) { mSensorMgr.unregisterListener(this); mSensorMgr = null; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @SuppressWarnings("deprecation") @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) { return; } long now = System.currentTimeMillis(); if ((now - mLastForce) > SHAKE_TIMEOUT) { mShakeCount = 0; } if ((now - mLastTime) > TIME_THRESHOLD) { long diff = now - mLastTime; float speed = Math.abs(event.values[SensorManager.DATA_X] + event.values[SensorManager.DATA_Y] + event.values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000; if (speed > FORCE_THRESHOLD) { if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) { mLastShake = now; mShakeCount = 0; if (mShakeListener != null) { mShakeListener.onShake(); } } mLastForce = now; } mLastTime = now; mLastX = event.values[SensorManager.DATA_X]; mLastY = event.values[SensorManager.DATA_Y]; mLastZ = event.values[SensorManager.DATA_Z]; } } }
ShakeListener mShaker = new ShakeListener(this); mShaker.setOnShakeListener(new ShakeListener.OnShakeListener() { public void onShake() { // action while shaking setTextView("shaked"); } });
Android手機搖一搖的實現SensorEventListener