歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 重力感應監聽

Android 重力感應監聽

日期:2017/3/1 10:29:38   编辑:Linux編程

Android 重力感應監聽:

  1. public class ShakeListener implements SensorEventListener {
  2. public static ShakeListener sensor1;
  3. // 速度阈值,當搖晃速度達到這值後產生作用
  4. private static final int SPEED_SHRESHOLD = 400;
  5. // 兩次檢測的時間間隔
  6. private static final int UPTATE_INTERVAL_TIME = 70;
  7. // 傳感器管理器
  8. private SensorManager sensorManager;
  9. // 傳感器
  10. private Sensor sensor;
  11. // 重力感應監聽器
  12. private OnShakeListener onShakeListener;
  13. // 上下文
  14. private static Context context;
  15. // 手機上一個位置時重力感應坐標
  16. private float lastX;
  17. private float lastY;
  18. private float lastZ;
  19. // 上次檢測時間
  20. private long lastUpdateTime;
  21. public static ShakeListener newInstance(Context c) {
  22. if (sensor1 == null) {
  23. sensor1 = new ShakeListener();
  24. context = c;
  25. return sensor1;
  26. } else {
  27. return sensor1;
  28. }
  29. }
  30. // 開始
  31. public void start() {
  32. // 獲得傳感器管理器
  33. if(sensorManager==null){
  34. sensorManager = (SensorManager) context
  35. .getSystemService(Context.SENSOR_SERVICE);
  36. }
  37. if (sensorManager != null&&sensor==null) {
  38. // 獲得重力傳感器
  39. sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  40. }
  41. if (sensor != null) {
  42. sensorManager.registerListener(this, sensor,
  43. SensorManager.SENSOR_DELAY_NORMAL);
  44. }
  45. }
  46. // 停止檢測
  47. public void stop() {
  48. sensorManager.unregisterListener(this);
  49. }
  50. // 搖晃監聽接口
  51. public interface OnShakeListener {
  52. public void onShake();
  53. }
  54. // 設置重力感應監聽器
  55. public void setOnShakeListener(OnShakeListener listener) {
  56. onShakeListener = listener;
  57. }
  58. // 重力感應器感應獲得變化數據
  59. @Override
  60. public void onSensorChanged(SensorEvent event) {
  61. long currentUpdateTime = System.currentTimeMillis();
  62. // 兩次檢測的時間間隔
  63. long timeInterval = currentUpdateTime - lastUpdateTime;
  64. // 判斷是否達到了檢測時間間隔
  65. if (timeInterval < UPTATE_INTERVAL_TIME) {
  66. return;
  67. }
  68. // 現在的時間變成last時間
  69. lastUpdateTime = currentUpdateTime;
  70. // 獲得x,y,z坐標
  71. float x = event.values[0];
  72. float y = event.values[1];
  73. float z = event.values[2];
  74. // 獲得x,y,z的變化值
  75. float deltaX = x - lastX;
  76. float deltaY = y - lastY;
  77. float deltaZ = z - lastZ;
  78. // 將現在的坐標變成last坐標
  79. lastX = x;
  80. lastY = y;
  81. lastZ = z;
  82. double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
  83. * deltaZ)
  84. / timeInterval * 10000;
  85. // 達到速度閥值,發出提示
  86. if (speed >= SPEED_SHRESHOLD){
  87. // 手機晃動
  88. onShakeListener.onShake();
  89. }
  90. }
  91. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  92. }
  93. }
Copyright © Linux教程網 All Rights Reserved