• 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.   

  • 相关阅读:
    【来自知乎】AR技术可以通过H5实现吗?不通过APP
    太虚AR
    【ArUco】- Augmented reality library based on OpenCV
    unity MVC简易框架! MVC in Code Control
    游戏服务器框架与互联网产品的认识
    关于 boost::asio::io_service::run() 出现【句柄无效】的问题
    编译luabind-0.9.1 出现 error C2665: 'boost::operator ==' : none of the 4 overloads could convert all the argument types 的解决方案
    javascript 控制 table tr display block 显示模式时,只对第一个单元格有效
    Ogre::UINT 与 其他库的 类型冲突问题
    排序仿函数 出现 std::priority_queue::push() 的 invalid operator < 异常
  • 原文地址:https://www.cnblogs.com/tianshidechibang234/p/3441166.html
Copyright © 2020-2023  润新知