1,功能实现
确定当前设备朝向的方式有两种,一种是是直接使用 方向传感器 Sensor.TYPE_ORIENTATION,另一种是结合使用Sensor.TYPE_ACCELEROMETER和Sensor.TYPE_MAGNETIC_FIELD;前一种已经不建议使用了,因为它无法根据应用的横竖屏与设备的自然方向调整结果方向,且精确度不如后一种方式。
后一种方式的实现如下,比较关键的地方都写注释了。
<pre name="code" class="java"> /**
* 方向传感器中心。<br>
* 使用方法为:创建对象后使用 {@link #init(Activity)} 初始化上下文环境,使用
* {@link #registerOrientationListener(IListener)} 注册
* 方向变化监听器,使用完毕后(一般在 {@link #init(Activity)}中所使用 {@link Activity}
* 销毁时), {@link #unregister()}取消本类内部注册的 {@link SensorEventListener}
* @author yangsheng
* @date 2015年1月28日
*/
private static class SensorCenter {
private float[] accelerValues = new float[3];
private float[] magneticValues = new float[3];
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
// 深度复制,可避免部分设备下 SensorManager.getRotationMatrix 返回false的问题
case Sensor.TYPE_ACCELEROMETER:
for (int i = 0; i < 3; i++) {