Activity
1 package com.lmw.android.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Vibrator; 7 import android.view.View; 8 import android.widget.Toast; 9 10 import com.lmw.android.test.ShakeListener.OnShakeListener;11 12 public class ShakeActivity extends Activity {13 14 ShakeListener mShakeListener = null;15 Vibrator mVibrator;16 17 @Override18 public void onCreate(Bundle savedInstanceState) {19 // TODO Auto-generated method stub20 super.onCreate(savedInstanceState);21 setContentView(R.layout.shake);22 // drawerSet ();//设置 drawer监听 切换 按钮的方向23 24 //获得振动器服务25 mVibrator = (Vibrator) getApplication().getSystemService(VIBRATOR_SERVICE);26 //实例化加速度传感器检测类27 mShakeListener = new ShakeListener(ShakeActivity.this);28 29 mShakeListener.setOnShakeListener(new OnShakeListener() {30 31 public void onShake() {32 mShakeListener.stop();33 startVibrato(); // 开始 震动34 new Handler().postDelayed(new Runnable() {35 @Override36 public void run() {37 Toast mtoast;38 mtoast = Toast.makeText(ShakeActivity.this,39 "呵呵,成功了!。\n再试一次吧!", 1000);40 mtoast.show();41 mVibrator.cancel();42 mShakeListener.start();43 }44 }, 2000);45 }46 });47 } 48 // 定义震动49 public void startVibrato() {50 mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1);51 // 第一个{}里面是节奏数组,52 // 第二个参数是重复次数,-1为不重复,非-1则从pattern的指定下标开始重复53 }54 55 @Override56 protected void onDestroy() {57 super.onDestroy();58 if (mShakeListener != null) {59 mShakeListener.stop();60 }61 }62 }
ShakeListener
1 /** 2 * 一个检测手机摇晃的监听器 3 * 加速度传感器 4 * values[0]: x-axis 方向加速度 5 * values[1]: y-axis 方向加速度 6 * values[2]: z-axis 方向加速度 7 */ 8 public class ShakeListener implements SensorEventListener { 9 // 速度的阈值,当摇晃速度达到这值后产生作用 10 private static final int SPEED_SHRESHOLD = 3000; 11 // 两次检测的时间间隔 12 private static final int UPTATE_INTERVAL_TIME = 70; 13 // 传感器管理器 14 private SensorManager sensorManager; 15 // 传感器 16 private Sensor sensor; 17 // 重力感应监听器 18 private OnShakeListener onShakeListener; 19 // 上下文 20 private Context mContext; 21 // 手机上一个位置时重力感应坐标 22 private float lastX; 23 private float lastY; 24 private float lastZ; 25 // 上次检测时间 26 private long lastUpdateTime; 27 28 // 构造器 29 public ShakeListener(Context c) { 30 // 获得监听对象 31 mContext = c; 32 start(); 33 } 34 35 // 开始 36 public void start() { 37 // 获得传感器管理器 38 sensorManager = (SensorManager) mContext 39 .getSystemService(Context.SENSOR_SERVICE); 40 if (sensorManager != null) { 41 // 获得重力传感器 42 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 43 } 44 // 注册 45 if (sensor != null) { 46 47 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等, 48 //根据不同应用,需要的反应速率不同,具体根据实际情况设定 49 sensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL); 50 } 51 52 } 53 54 // 停止检测 55 public void stop() { 56 sensorManager.unregisterListener(this); 57 } 58 59 // 设置重力感应监听器 60 public void setOnShakeListener(OnShakeListener listener) { 61 onShakeListener = listener; 62 } 63 64 // 重力感应器感应获得变化数据 65 public void onSensorChanged(SensorEvent event) { 66 // 现在检测时间 67 long currentUpdateTime = System.currentTimeMillis(); 68 // 两次检测的时间间隔 69 long timeInterval = currentUpdateTime - lastUpdateTime; 70 // 判断是否达到了检测时间间隔 71 if (timeInterval < UPTATE_INTERVAL_TIME) 72 return; 73 // 现在的时间变成last时间 74 lastUpdateTime = currentUpdateTime; 75 76 // 获得x,y,z坐标 77 float x = event.values[0]; 78 float y = event.values[1]; 79 float z = event.values[2]; 80 81 // 获得x,y,z的变化值 82 float deltaX = x - lastX; 83 float deltaY = y - lastY; 84 float deltaZ = z - lastZ; 85 86 // 将现在的坐标变成last坐标 87 lastX = x; 88 lastY = y; 89 lastZ = z; 90 91 double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ* deltaZ)/ timeInterval * 10000; 92 93 // 达到速度阀值,发出提示 94 if (speed >= SPEED_SHRESHOLD) { 95 onShakeListener.onShake(); 96 } 97 } 98 //当传感器精度改变时回调该方法 99 public void onAccuracyChanged(Sensor sensor, int accuracy) {100 101 }102 103 // 摇晃监听接口104 public interface OnShakeListener {105 public void onShake();106 }107 108 }