Android加速度传感器实现“摇一摇”,带手机振动 .
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 @Override 18 public void onCreate(Bundle savedInstanceState) { 19 // TODO Auto-generated method stub 20 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 @Override 36 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 @Override 56 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 }