震动
权限
<uses-permission android:name="android.permission.VIBRATE" />
初始化
Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
//设置初始化感应
ShakeListener shakeListener = new ShakeListener(this);
shakeListener.setOnShake(onShake);
/*
* 重力感应
*/
private OnShakeListener onShake = new OnShakeListener() {
@Override
public void onShake() {
imgnot.setVisibility(View.GONE);
startVibrator();
shakeListener.stop();
}
};
/**
* 播放振动效果
*/
public void startVibrator() {
vibrator.vibrate(new long[] { 500, 300, 500, 300 }, -1);
}
//实现SensorListener接口
public class ShakeListener implements SensorEventListener {
private static final int SPEED_SHRESHOLD = 3500;
private static final int UPTATE_INTERVAL_TIME = 70;
private Context context;
private Sensor sensor;
private SensorManager senmanager;
private float last_x;
private float last_y;
private float last_z;
private long lastUpDatetime;
private OnShakeListener onShake;
public ShakeListenerUtils(Context context) {
this.context = context;
start();
}
public void start() {
//初始化
senmanager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
if (senmanager != null) {
sensor = senmanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
if (sensor != null) {
senmanager.registerListener(this, SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ACCELEROMETER,SensorManager.SENSOR_DELAY_NORMAL,SensorManager.SENSOR_DELAY_GAME);
}
}
public void stop() {
senmanager.unregisterListener(this, sensor);
}
public void setOnShake(OnShakeListener onShake) {
this.onShake = onShake;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//精确度改变的时候
Log.d(tag, "onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);
}
@Override
public void onSensorChanged(SensorEvent event) {
long currentUpDatetime = System.currentTimeMillis();
long timeInterval = currentUpDatetime - lastUpDatetime;
if (timeInterval < UPTATE_INTERVAL_TIME) {
return;
}
synchronized (this) {
Log.d(tag, "onSensorChanged: " + sensor + ", x: " + values[0] + ", y: " + values[1] + ", z: " + values[2]);
//三维方向坐标
if (sensor == SensorManager.SENSOR_ORIENTATION) {
xViewO.setText("Orientation X: " + values[0]);
yViewO.setText("Orientation Y: " + values[1]);
zViewO.setText("Orientation Z: " + values[2]);
}
//三维方向的加速度
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
xViewA.setText("Accel X: " + values[0]);
yViewA.setText("Accel Y: " + values[1]);
zViewA.setText("Accel Z: " + values[2]);
}
lastUpDatetime = currentUpDatetime;
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float deltaX = x - last_x;
float deltaY = y - last_y;
float deltaZ = z - last_z;
last_x = x;
last_y = y;
last_z = z;
double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000;
if (speed >= SPEED_SHRESHOLD) {
onShake.onShake();
}
}
public interface OnShakeListener {
public void onShake();
}
}