package net.dev123.yibo.service.listener;
import net.dev123.yibo.YiBoApplication;
import net.dev123.yibo.common.Constants;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Vibrator;
import android.util.Log;
public class ShakeUpdateListener {
private static final String TAG = "ShakeUpdateListener";
private static final long SHAKE_INTERVAL_TIME = 15000;
private static final float SHAKE_UPDATE_ACCELERATION_X = 5.0F;
private static final float SHAKE_UPDATE_ACCELERATION_Y = 1.0F;
private Context context;
private YiBoApplication yibo;
private SensorManager sensorManager;
private Sensor acceleromererSensor;
private long lastShakeTime;
private float lastX;
private float lastY;
private float lastDiffX;
private float lastDiffY;
public ShakeUpdateListener(Context context) {
this.context = context;
this.yibo = (YiBoApplication)context.getApplicationContext();
// 获取传感器管理器
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
// 获取加速度传感器
acceleromererSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
public void startMonitor() {
//在传感器管理器中注册监听器
sensorManager.registerListener(acceleromererListener, acceleromererSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public void stopMonitor() {
sensorManager.unregisterListener(acceleromererListener);
}
//产生振动效果
public void vibrateToUpdate() {
lastShakeTime = System.currentTimeMillis();
Vibrator vibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
//vibrator.vibrate(1000);
vibrator.vibrate(new long[]{50, 150}, -1);
Intent updateIntent = new Intent(Constants.ACTION_RECEIVER_AUTO_UPDATE);
context.sendBroadcast(updateIntent);
}
// 定义传感器事件监听器
SensorEventListener acceleromererListener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//什么也不干
}
//传感器数据变动事件
@Override
public void onSensorChanged(SensorEvent event) {
long currentTime = System.currentTimeMillis();
if (currentTime - lastShakeTime < SHAKE_INTERVAL_TIME
|| !yibo.isRefreshOnShake()) {
return;
}
//获取加速度传感器的三个参数
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
//System.out.println("加速度: x->" + x + ", y->" + y + ", z->" + z);
float tempDiffX = x - lastX;
float tempDiffY = y - lastY;
lastX = x;
lastY = y;
if (lastDiffX < 0
&& lastDiffY < 0
&& tempDiffX > SHAKE_UPDATE_ACCELERATION_X
&& tempDiffY > SHAKE_UPDATE_ACCELERATION_Y) {
if (Constants.DEBUG) Log.v(TAG, "vibrateToUpdate: x->" + x + ", y->" + y + ", z->" + z);
vibrateToUpdate();
}
lastDiffX = tempDiffX;
lastDiffY = tempDiffY;
}
};
}