• 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 }
  • 相关阅读:
    postgresql----UNION&&INTERSECT&&EXCEPT
    postgresql----JOIN之多表查询
    postgresql----ANY/SOME&&ALL
    在页面获取本地电脑IP
    redis-Jedis连接集群
    redis-存储命令
    redis-启用命令
    springboot-整合freemarker
    springboot-发布jar包
    springboot-实现log4j的AOP切面
  • 原文地址:https://www.cnblogs.com/ggzjj/p/2856235.html
Copyright © 2020-2023  润新知