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.                                 "呵呵,成功了!。 再试一次吧!"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[] { 500200500200 }, -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.   

原文地址:https://www.cnblogs.com/tianshidechibang234/p/3441166.html