近期項目中要求增加搖一搖功能,搜了相關帖子,自己整理一套代碼,發個博客保留一份。
解析:Android中搖一搖主要通過[SensorManager]實現,想了解可以查一下。
public class ShakeHelper implements SensorEventListener {
private Context mContext;
//傳感器管理器
private SensorManager mSensorManager;
//傳感器
private Sensor mSensor;
//速度閥值
private int mSpeed = 3000;
//時間間隔
private int mInterval = 150;
//上一次搖晃的時間
private long LastTime;
//上一次的x、y、z座標
private float LastX, LastY, LastZ;
private boolean flag = true;
private Handler handler = new Handler();
public ShakeHelper(Context mContext) {
this.mContext = mContext;
Start();
}
public void Start() {
mSensorManager = (SensorManager) mContext.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() {
mSensorManager.unregisterListener(this);
handler.removeCallbacksAndMessages(null);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@Override
public void onSensorChanged(SensorEvent Event) {
long NowTime = System.currentTimeMillis();
if ((NowTime - LastTime) < mInterval) {
return;
}
//將NowTime賦給LastTime
LastTime = NowTime;
//獲取x,y,z
float NowX = Event.values[0];
float NowY = Event.values[1];
float NowZ = Event.values[2];
//計算x,y,z變化量
float DeltaX = NowX - LastX;
float DeltaY = NowY - LastY;
float DeltaZ = NowZ - LastZ;
//賦值
LastX = NowX;
LastY = NowY;
LastZ = NowZ;
//計算
double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ) / mInterval * 10000;
//判斷
if (NowSpeed >= mSpeed) {
if (flag) {
/**
* 相應操作
*/
flag = false;
//搖一搖執行3s後通知外部
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (startListener != null) {
startListener.onStart();
}
}
}, mSpeed);
}
//防止3s內重複搖一搖,去執行相應操作
handler.postDelayed(new Runnable() {
@Override
public void run() {
flag = true;
}
}, mSpeed);
}
}
//接口回調,搖一搖開始通知外部
public interface onStartListener {
void onStart();
}
public onStartListener startListener;
public void setStartListener(onStartListener startListener) {
this.startListener = startListener;
}
}