传感器
1.SensorManager
1.sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
2.光照传感器
1.Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(mySensorEventListener,sensor, SensorManager.SENSOR_DELAY_NORMAL);
2.我们所需要的数据就是存放在 SensorEvent的 values 数组
3.加速度传感器
1.Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
2.加速度传感器输出的信息同样也是存放在 SensorEvent 的 values 数组中的,只不过此时的 values 数组中会有三个值, 分别代表手机在 X 轴、 Y 轴和 Z轴方向上的加速度信息。
4.方向传感器
1.不推荐写法:Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
values[0]记录着手机围绕 Z轴的旋转角度,
values[1] 记录着手机围绕 X轴的旋转角度,
values[2] 记录着手机围绕 Y 轴的旋转角度
1.推荐写法:事实上,Android 获取手机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的,这也是 Android目前推荐使用 的方式。
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sensorManager.registerListener(listener, accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener, magneticSensor,SensorManager.SENSOR_DELAY_GAME);
由于方向传感器的精确度要求通常都比较高, 这里我们把传感器输出信息的更新速率提高了一些,使用的是 SENSOR_DELAY_GAME。
接下来在 onSensorChanged()方法中可以获取到 SensorEvent 的 values 数组,分别记录着
加速度传感器和地磁传感器输出的值。然后将这两个值传入到 SensorManager 的
getRotationMatrix()方法中就可以得到一个包含旋转矩阵的 R 数组,如下所示:
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
其中第一个参数 R 是一个长度为 9 的 float 数组,getRotationMatrix()方法计算出的旋转
数据就会赋值到这个数组当中。 第二个参数是一个用于将地磁向量转换成重力坐标的旋转矩
阵,通常指定为 null 即可。第三和第四个参数则分别就是加速度传感器和地磁传感器输出的
values 值。
得到了 R数组之后,接着就可以调用 SensorManager 的 getOrientation()方法来计算手机
的旋转数据了,如下所示:
SensorManager.getOrientation(R, values);
values 是一个长度为 3 的 float数组, 手机在各个方向上的旋转数据都会被存放到这个数
组当中。其中 values[0]记录着手机围绕着图 12.3中 Z轴的旋转弧度,values[1]记录着手机围
绕 X 轴的旋转弧度,values[2]记录着手机围绕 Y 轴的旋转弧度。
注意这里计算出的数据都是以弧度为单位的, 因此如果你想将它们转换成角度还需要调
用如下方法:
Math.toDegrees(values[0]);
好了,基本的用法就是如此,下面我们来实际操作一下吧。