Android 搖一搖終極解決方案


根據手機型號的不同,對於搖一搖靈敏度反應也不同,通過自己寫的ShakeListener 可以完美控制靈敏度

注意 在aictivity中的onResume 和onPause 方法中需要調用幫頂和解綁方法


import android.content.Context;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.Toast;


public class ShakeListener implements SensorEventListener {
private static final int FORCE_THRESHOLD = 1200;
private static final int TIME_THRESHOLD = 100;

private SensorManager mSensorMgr;
private float mLastX = -1.0f, mLastY = -1.0f, mLastZ = -1.0f;
private long mLastTime;
private OnShakeListener mShakeListener;
private Context mContext;


public interface OnShakeListener {
public void onShake();
}


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 = false;
try {
supported = mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
} catch (Exception e) {
Toast.makeText(mContext, "Shaking not supported", Toast.LENGTH_LONG)
.show();
}


if ((!supported) && (mSensorMgr != null))
mSensorMgr.unregisterListener(this);
}


public void pause() {
if (mSensorMgr != null) {
mSensorMgr.unregisterListener(this);
mSensorMgr = null;
}
}


public void onAccuracyChanged(Sensor sensor, int accuracy) {
}


public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
long now = System.currentTimeMillis();


if ((now - mLastTime) > TIME_THRESHOLD) {
long diff = now - mLastTime;
float speed = Math.abs(event.values[0] + event.values[1]
+ event.values[2] - mLastX - mLastY - mLastZ)
/ diff * 10000;


if (speed > FORCE_THRESHOLD) {
mShakeListener.onShake();
}
mLastTime = now;
mLastX = event.values[0];
mLastY = event.values[1];
mLastZ = event.values[2];
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章