研究了一下午的Sensor 总结下吧

 

首先Sensor包含许多传感器 有重力 方向 加速度 磁场 光感

 

这里先说加速度 Sensor.TYPE_ACCELEROMETER

 

实际上手机处于静止状态时 重力方向有加速度 其他方向没有 此时手机静止没有产生移动 所以所谓加速度不过是对力的判断

 

这也和官方文档说的一样 

 

如果手机出于自由落体状态 则垂直方向的加速度为0 因为此时水平方向不受力

 

再看看 方向传感器 Sensor.TYPE_ORIENTATION

 

如果加速度传感器对力敏感 那么方向传感器则对偏转角度特别敏感 这里也不需要多深的几何知识 记住3个方向

 

首先手机就像平时一样 竖直放在桌子上

 

此时X轴方向的数值大约是90 也可能是270 慢慢让手机在桌上转圈 你会发现实际上当手机横置在我们面前时的角度是0 竖直是90 其他时刻的角度都是水平方向上手机转动的角度

 

Y轴其实和X轴类似 我们最亲切的平面几何 当手机屏幕朝上时 Y轴的值是0 向前 让屏幕向外翻转180度 Y值取到了-180

 

当屏幕向内翻转180度时 Y值取到了+180 Y值的取值范围就是(-180~+180) 还是360度

 

最后看看Z轴 其实Z轴最简单 把Xy的平面想象成钥匙孔 手机想象成钥匙 

 

钥匙(手机)向左扭动时 Z值最大取到了90 

 

钥匙(手机)向右扭动时 Z值取到了-90

 

则是说 Z轴的范围是 -90 到 90 

 

传感器更新频率的说明:

 

SensorManager.SENSOR_DELAY_FASTEST : as fast as possible 变态般的更新 刷新速度变态的快 电池消耗变态的快 常量是0
 
SensorManager.SENSOR_DELAY_GAME : rate suitable for game 比较快的更新 适合游戏开发 常量是1
 
SensorManager.SENSOR_DELAY_NORMAL : normal rate 更新速度一般 真的是一般 敏感不如game 低调不如UI 常量是3
 
SensorManager.SENSOR_DELAY_UI : rate suitable for UI Thread 一般应用程序多半使用这种 省点 而且判断也比较精确 常量是2//
 long start= System.currentTimeMillis();
 if (x < -15) {
 movement = "right"; //右向
 }
 if (x > 15) {
 movement = "left"; //左向
 }
 if(Math.abs(x)<3){
 movement="ready";//中置位
 }
 if (!tag.equals(movement)) {
 if(bcSwitch){
 Intent intent = new Intent();
 intent.putExtra("orientation", movement);
 activity.sendBroadcast(intent);
 System.out.println("prepare brordcast ----> "+movement);
 }
 tag = movement;
 System.out.println(movement+"====>x-->"+x+" +y-->"+y);
 if(movement.equals("ready")){
 bcSwitch=true;
 }else{
 bcSwitch=false;
 }
 }