1. import android.content.Context;
  2. import android.hardware.Sensor;
  3. import android.hardware.SensorEvent;
  4. import android.hardware.SensorEventListener;
  5. import android.hardware.SensorManager;
  6. /**
  7. *
  8. * 一个检测手机摇晃的监听器
  9. * @author fuzhengchao
  10. *
  11. */
  12. public class ShakeListener implements SensorEventListener {
  13. //速度阈值,当摇晃速度达到这值后产生作用
  14. private static final int SPEED_SHRESHOLD = 4000;
  15. //两次检测的时间间隔
  16. private static final int UPTATE_INTERVAL_TIME = 70;
  17. //传感器管理器
  18. private SensorManager sensorManager;
  19. //传感器
  20. private Sensor sensor;
  21. //重力感应监听器
  22. private OnShakeListener onShakeListener;
  23. //上下文
  24. private Context context;
  25. //手机上一个位置时重力感应坐标
  26. private float lastX;
  27. private float lastY;
  28. private float lastZ;
  29. //上次检测时间
  30. private long lastUpdateTime;
  31. //构造器
  32. public ShakeListener(Context c) {
  33. //获得监听对象
  34. context = c;
  35. start();
  36. }
  37. //开始
  38. public void start() {
  39. //获得传感器管理器
  40. sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
  41. if(sensorManager != null) {
  42. //获得重力传感器
  43. sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  44. }
  45. //注册
  46. if(sensor != null) {
  47. sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
  48. }
  49. }
  50. //停止检测
  51. public void stop() {
  52. sensorManager.unregisterListener(this);
  53. }
  54. //摇晃监听接口
  55. public interface OnShakeListener {
  56. public void onShake();
  57. }
  58. //设置重力感应监听器
  59. public void setOnShakeListener(OnShakeListener listener) {
  60. onShakeListener = listener;
  61. }
  62. //重力感应器感应获得变化数据
  63. public void onSensorChanged(SensorEvent event) {
  64. //现在检测时间
  65. long currentUpdateTime = System.currentTimeMillis();
  66. //两次检测的时间间隔
  67. long timeInterval = currentUpdateTime - lastUpdateTime;
  68. //判断是否达到了检测时间间隔
  69. if(timeInterval < UPTATE_INTERVAL_TIME)
  70. return;
  71. //现在的时间变成last时间
  72. lastUpdateTime = currentUpdateTime;
  73. //获得x,y,z坐标
  74. float x = event.values[0];
  75. float y = event.values[1];
  76. float z = event.values[2];
  77. //获得x,y,z的变化值
  78. float deltaX = x - lastX;
  79. float deltaY = y - lastY;
  80. float deltaZ = z - lastZ;
  81. //将现在的坐标变成last坐标
  82. lastX = x;
  83. lastY = y;
  84. lastZ = z;
  85. double speed = Math.sqrt(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ)/timeInterval * 10000;
  86. //达到速度阀值,发出提示
  87. if(speed >= SPEED_SHRESHOLD)
  88. onShakeListener.onShake();
  89. }
  90. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  91. }
  92. }

用法:

  1. ShakeListener shakeListener = new ShakeListener(this);//创建一个对象
  2. shakeListener.setOnShakeListener(new OnShakeListener(){//调用setOnShakeListener方法进行监听
  3. public void onShake() {
  4. //对手机摇晃后的处理(如换歌曲,换图片,震动……)
  5. //onVibrator();
  6. }
  7. });

//震动

  1. private void onVibrator() {
  2. Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
  3. if (vibrator == null) {
  4. Vibrator localVibrator = (Vibrator) context.getApplicationContext()
  5. .getSystemService("vibrator");
  6. vibrator = localVibrator;
  7. }
  8. vibrator.vibrate(100L);
  9. }

摇一摇精简代码实现 
http://blog.sina.com.cn/s/blog_66cfbaa5010120w8.html

Android中类似于奇虎360手机卫士中摇一摇效果实现 
http://blog.csdn.net/nono_love_lilith/article/details/7554341

监听手机晃动(摇一摇)SensorEventListener的更多相关文章

  1. 用BroadcastReceiver监听手机网络状态变化

    android--解决方案--用BroadcastReceiver监听手机网络状态变化 标签: android网络状态监听方案 2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报 ...

  2. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  3. Android初级教程使用服务注册广播接收者监听手机解锁屏变化

    之前第七章广播与服务理论篇写到: 特殊的广播接收者(一般发广播次数频率很高) 安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的 屏幕锁屏和解锁 电量改变 今天在这里就回顾一下,且用代码方 ...

  4. iOS 关于监听手机截图,UIView生成UIImage, UIImage裁剪与压缩的总结

    一.  关于监听手机截图 1. 背景: 发现商品的售价页总是被人转发截图,为了方便用户添加截图分享的小功能 首先要注册用户截屏操作的通知 - (void)viewDidLoad { [super vi ...

  5. vue 监听手机键盘是否弹出及input是否聚焦成功

    //定义移动端类型 function pageStats() { let u = navigator.userAgent, app = navigator.appVersion; let obj = ...

  6. 知识点---js监听手机返回键,回到指定界面

    方法一. $(function(){ pushHistory(); window.addEventListener(“popstate”, function(e) { window.location ...

  7. 使用ionic开发时用遇到监听手机返回按钮的问题~

    当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决:  //双击退出   $ionicP ...

  8. JavaScript监听手机物理返回键的两种解决方法

    JavaScript没有监听物理返回键的API,所以只能使用 popstate 事件监听. 有两个解决办法: 1.返回到指定的页面 pushHistory(); window.addEventList ...

  9. 监听 手机back键和顶部的回退

    // 回退事件,监听 手机back键和顶部的回退 pushHistory(); window.addEventListener("popstate", function(e) { ...

随机推荐

  1. Android apk逆向实战

    简介 逆向Android apk其实是一个分析Android apk的一个过程,必须了解Android程序开发的流程.结构.语句分支.解密原理等等. 功能 破解一个注册验证程序(自写一个简单的注册验证 ...

  2. shell一些笔记

    1.getopts可以编写脚本,使控制多个命令行参数更加容易 如:文件get.sh #! /bin/sh NAME=false AGE=false ODD=false SEX=false while ...

  3. [每天一个Linux小技巧] gdb 下一次运行多个命令

    一般gdb运行的时候,我们仅仅能输入一个命令. 如: (gdb) c (gdb) bt 假设想运行多个命令怎么办? 能否像bash那样, 使用; 如 ls; ls 结论是不行. 但能够通过gdb 内建 ...

  4. 自己动手为PHP7添加新的语法特性

    好文章! nikic介绍了如何向PHP添加新的语法特性,原文写的非常精彩,具体是添加in语法功能,使最终实现: <?php $words = ['hello', 'world', 'foo', ...

  5. CodeForces 546D Soldier and Number Game 打表(求质因子个数)

    题目:戳我这个题与HDUOJ 5317有异曲同工之妙 题意:题意看懂了上面的一大串英文之后其实很简单,就是给你一个正整数n,问你n有多少个质因子,不过这里n是通过a!/b!给定的,也就是说n=(a!/ ...

  6. C语言,调试必备的DEBUG宏定义

    1. #include <stdio.h> #include <stdarg.h> //仅仅是打印函数名字替换 DEBUG <--> printf #define ...

  7. Linux 下github的使用

    *初始化git仓库,使用git init命令 *添加文件到git仓库分两步: 1.使用git add filename  :可分多次使用,添加多个文件到暂存区 2.使用git commit -m  “ ...

  8. Ural 1313 - Some Words about Sport

    Ural doctors worry about the health of their youth very much. Special investigations showed that a l ...

  9. mul16

    设计思想:乘法运算本身就可以看做是一个移位相加的过程               1 1 0 1 0     = 26*              1 0 1 1 1    = 23          ...

  10. 基于visual Studio2013解决算法导论之019栈实现(基于数组)

     题目 用数组实现栈 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...