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 }

 

 

 

 

posted @ 2013-01-11 12:56  ggzjj  阅读(513)  评论(0编辑  收藏  举报