博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android加速度传感器实现“摇一摇”,带手机振动 .
阅读量:4605 次
发布时间:2019-06-09

本文共 5174 字,大约阅读时间需要 17 分钟。

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     @Override18     public void onCreate(Bundle savedInstanceState) {19         // TODO Auto-generated method stub20         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                     @Override36                     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     @Override56     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 }

 

 

 

 

转载于:https://www.cnblogs.com/ggzjj/archive/2013/01/11/2856235.html

你可能感兴趣的文章
CSS重置(css reset)【转载】
查看>>
Elasticserach 配置文件详解
查看>>
【案例】大型摩托制造企业如何高效排产?看APS系统如何帮忙
查看>>
NTCIR-13 We Want Web 任务概述
查看>>
模版include的用法
查看>>
LotusScript_导出数据库路径和名称
查看>>
String ,StringBuffer 与S tringBuilder的区别??
查看>>
PgSQL · 追根究底 · WAL日志空间的意外增长
查看>>
struts2笔记之struts:property标签
查看>>
Threejs.教程
查看>>
超闩锁和子闩锁如何工作的
查看>>
ZendStudio快捷键
查看>>
[ovs] ovs开启日志debug
查看>>
Eclipse插件项目中读取文件
查看>>
jquery定义链接跳转的高亮显示
查看>>
CheckListBox怎样得到多选值?
查看>>
2370 小机房的树
查看>>
三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
mysql 数据表操作 目录
查看>>